「第6期サイボウズ・ラボユース成果発表会」開催

サイボウズ・ラボの光成です。3月30日に第6期サイボウズ・ラボユース成果発表会を開催したのでその報告をします。

サイボウズ・ラボユース

サイボウズ・ラボユースとは日本の若手エンジニアを発掘し、育成する場として2011年に設立されました。

ラボユース生が作りたいものをサイボウズ・ラボの社員がメンターとしてサポートします。 開発物の著作権は開発者本人に帰属します。基本的にオープンソースとして公開するのが条件です。

去年からは最大1年の通年募集となっています。

今年は3月で修了される3人の方と、現在開発継続中の4人、ラボユースOBから一人の発表がありました。

修了生の発表

緑川志穂さん

緑川さんは楕円曲線計算ライブラリecpyのC++による高速化というテーマで発表しました。 メンターはです。 f:id:cybozuinsideout:20170331150917j:plain

去年の中間発表ではペアリング暗号ライブラリのPython実装を紹介しましたが、今年はC++で開発したライブラリをPythonから呼べる形に改良しました(ecpy)。 PythonからC++ライブラリを呼び出すところでかなり苦労されたのですが、何度か実装・設計をやり直してきれいな形にもっていけました。 結果としてPython版に比べて約5倍の高速化を達成しています。 今後はPythonのパッケージ管理サイトPyPIへの登録を考えているそうです。

城倉弘樹さん

城倉さんはDPDKを用いたネットワークスタック, 高性能通信基盤というテーマで発表しました。 メンターは私です。 f:id:cybozuinsideout:20170331150822j:plain

DPDKとはカーネルをバイパスしてユーザランドから直接ネットワークカードを参照して高速通信をするライブラリです。 高速なのはありがたいのですが、ハードウェアに密着していてなかなか癖のあるライブラリです。 城倉さんはDPDKを使って高速通信をしつつも、なるべく簡単にアプリを作れるようなフレームワークSTCPの開発を目指しました。

Ether, ARP, IP, UDP, ICMPなどの実装は完了し、TCPも動いています。 10GbEのNICをつないだマシン間でpingをとばし、そのレイテンシを計測しました。Linuxよりも2倍速かったとのことです。

それでもまだまだ全然DPDKの性能を出し切れていないので、今後はどのぐらい高性能通信ができるか研究開発を続けるそうです。

篠崎慎之介さん

篠崎さんは「強化学習による文字認識」というテーマで発表しました。メンターは岩波データサイエンスの刊行委員を務める中谷さんです。

残念ながら諸般の事情で4カ月ほどしか参加できなかったのですが、一般的な画像の文字認識というチャレンジングな課題に対して非常に精力的に最新の論文を読んで実装していました。

まず再帰的ニューラルネットワーク(RNN)とHard attentionという技法を用いて一文字の画像を認識します。 次にmultiple object recognition with visual attentionという技法で複数物体を認識できるように拡張しました。

MNISTの数値データを適当にくっつけて3文字にしたデータセットに対して評価していました。 画像サイズが大きくなって、文字が離れると認識率は落ちるのですが28 x 84だと98%ほどの認識率になったそうです。

開発中の人の発表

西田耀さん

西田さんはヒトと機械に優しい言語nvというテーマで発表しました。 メンターは30日でできる! OS自作入門の著者の川合さんです。 f:id:cybozuinsideout:20170331150941j:plain

西田さんはこの本の熱狂的愛読者で2冊も購入したそうです。

今回開発中の言語nvは永続変数が使えて実行状態を復元可能なものを目指しています。 ここで永続変数とはプログラムを終了しても値が保持される変数で、nvでは一つの関数呼び出しで保存できるようにしました。

また、変数だけ保存してもプログラムを再開することはできないので、合わせて実行状態も復元できる機能を追加しました。

たとえば変数iを0から1ずつ増やしながらその値を表示するプログラムを

for{i = 0}{1}{i++}{print i}

と書くと、実行中いつkillしても次回再開するとそこから動くようになるそうです。

今後はプログラムを表現可能なグラフ構造を扱う機能や複数のプログラム間で変数を共有できる機能を追加したいとのことです。

質疑応答ではメンターの川合さんが作成されたpersistent-Cとの比較で熱い議論をされていました。

小津泰生さん

小津さんは「自由度の高いグラフ描画言語の開発」というテーマで発表しました。 メンターは川合さんです。

小津さんは当初は別の言語の課題をしていたのですが、途中でテーマを今回のものに変更しました。

ExcelやGnuplotなどの既存のグラフ描画ソフトは細かいデザインを指定できないのが不満なのだそうです。 大学ではレポートのグラフに関していろいろ細かい指定があるのに、なかなか対応しづらいそうです。

開発バージョンでできるグラフの紹介をしました。複雑な数式を書けたり、グラフの値をLaTeXなどから参照できることにすることで論文を書きやすくすることも考えているそうです。

make_now_justさん

make_now_justさんは「先読みと後読みが可能なO(n)で動く正規表現エンジン」というテーマで発表されました。 メンターは西尾さんです。 f:id:cybozuinsideout:20170331150910j:plain

狭義の正規表現では「AまたはBまたはCを含む文字列にマッチする正規表現」はかなり複雑な形になります。 これを簡潔に表現するために導入されたのが先読みや後読みという機能です。

正規表現ライブラリはたくさんのものがあり、たとえばre2は決定性有限オートマトン(DFA)を用いて入力サイズNに対してO(N)の計算量で処理します。 re2は高速なのですが先読みや後読みをサポートしていません。 そこでO(N)の計算量でそれらの機能を実現する方法を設計、実装するのが目的です。

現在はまず先読みを事前に処理してから、それを除いた正規表現を処理するアルゴリズムを実装しました。 O(N)では動いたのですが、ネストできない点と、3回パースするのが難点で、それを改良するために現在はBFA(boolean finite automata)と状態を論理式や論理値で持つ方法やそれ以外の方法を検討しているとのことです。

高品佑也さん

高品さんは多変量の時系列データに対する異常検知アルゴリズムの実装というテーマで発表しました。 メンターは中谷さんです。 f:id:cybozuinsideout:20170331150926j:plain

異常検知とは、予期されるパターンにそぐわないデータを検出するというタスクです。たとえばサーバのアクセスログから不審な動きを検出して警告する、といった応用があります。

開発を初めて1カ月半なのですが、まずデータをクラスタリングし、小さなクラスタを異常とみなす方法をとりました。クラスタリングには、Hierarchical Temporal Memory(HTM)という階層的モデルの初期バージョンであるZeta 1アルゴリズムというものを用いました。

Water Treatment Plant Data Setという下水処理のセンサーログのデータセットで実験したのですが、残念ながらよい性能はでませんでした。

その理由として、HTM/Zeta 1が連続値の扱いに向いていない点や、そもそももっとシンプルなモデルで十分なデータだった可能性などをあげていました。

今後は既存の様々な手法を試したり、自分で考えた新しいアルゴリズムを試していきたいとのことです。

ラボユースOB

内田公太さん

内田さんは第2期OBでkprobesでカーネル空間ブレークポイントというテーマで発表しました。 内田さんは現在サイボウズ3年目でSREメンバーとして働いています(cf. kintone と連携する図書管理システムを作ってみた)。

KprobesとはLinuxカーネルのにbreak pointをおける機能で、任意のアドレスにbreak pointをおけるもの、関数の先頭のみのもの、関数から戻るときのものなどの機能や使い方の紹介をしました。 来月発売予定の『Linuxカーネルモジュール自作入門』という書籍の紹介もしていました。

終わりに

みなさん成長が著しく、また熱心なのに圧倒されます。 質疑応答に参加してくださった方、OBの方どうもありがとうございました。 f:id:cybozuinsideout:20170331151348j:plain

修了生の方が感想を書いてくださったのでリンクします。メンターも逆にいろいろ教えてもらうことも多く勉強になりました。

正式な第7期サイボウズ・ラボユースの募集は4月に出す予定です。 開発意欲の高い方の応募をお待ちしています。