フィックスターズのインターンシップに参加してきました

9/9~9/27の期間で株式会社フィックスターズのインターンに参加してきました!
インターンでやった内容はほぼ公開してもよいとのことだったので、そのあたりについても書いています。
(念のため文章はNDAに引っかかっていないかどうかメンターさんにチェックして頂いています。) 間違った記載がありましたらコメントなどでご報告ください。

申し込むまで

インターンに申し込んだのはたしか6月だったと思います。
今年は4回生だし、セキュキャンに行けることも決まっていたのであまり積極的にインターンなどをする予定はなかった(一応Googleは申し込んでみたけど、phone interviewがなぜか英語になって爆発した) のですが、院試勉強の合間にぼーっとtwitterを眺めていたらフィックスターズのインターンの宣伝が流れてきて、おもしろそうだと思って応募しました。

僕が申し込んだのは「深層学習コンパイラの開発」というテーマです。 この技術に対して深い知見があったわけではありませんが、どんなことをやっているか知ってみたかったというのがこのテーマにした理由でした。

面接では人事の方や実際に入ることになるチームの人たちとskypeで話しました。 コーディング面接があって、Googleのphone interviewの顔が見える版みたいなことをしました。 倍率などの詳しいことはわかりませんが、面接を受けた感じでは特に選考が厳しそうな印象はありませんでした。

何日か後に無事に合格の連絡がきて、参加する運びとなりました。

移動日~初日

もともとは9/8に移動して前泊することを想定していたのですが、運悪く台風と被ってしまいました。 前日の時点でのぞみは19時ごろに終電を繰り上げるという情報が入っていたのですが、 「まあゆっても大丈夫やろ!w」くらいのノリで17時ごろに京都駅に行った結果なんと東京行き新幹線の終電がもっと繰り上げられていて、 重い荷物をもってとんぼ返りするハメになりました。(後で見ると当日の昼頃にはそのことが発表されていた)

翌日は来れる人は11時集合とのことだったので、始発の新幹線で東京に向かって、マンスリーマンションに荷物を置いて、急いで会社に向かう、、、と頑張ってみたのですが、まあ30分くらい遅れました。(他のインターン生たちも間に合ってない人のほうが多かった) 自分は宿が品川だったので新幹線を降りた後はずっと徒歩移動できたのですが、もう少し遠くに住んでいる人は交通網がマヒしていてまともに移動できなかったんじゃないかと思います。

その日は結局午後の時間をつかって書類を書いたり説明したりが行われました。

インターン中にやったこと

自分がやったのは、"Tiramisu"という並列計算を記述するためのDSLの処理系がどんな風に実装されているか、またTiramisuをつかってどんなことができるか調査しましょう、といったタスクです。 めちゃくちゃざっくりいうとTiramisuはHalideにバッファの再利用機能が追加されたようなDSLです。(ざっくり言い過ぎなので突っ込みどころはたくさんあると思います。) バッファの再利用が可能になるとデータ依存が起こるのでそれを検出・解決するためにpolyhedral modelというのを使っていると論文には書いてありました。 インターンの開始時点でHalideに対する知識もintroductionをやった程度しかなかったのでキャッチアップにかなり多くの時間を費やしました。

Tiramisuのgithubページ github.com

とりあえず初日はtutorialをやってTiramisuでどんなことが出来るのかを確認してみました。 また、簡単な例として2次元のconvolution演算を実装してみました(C++でも実装して、出力が一致することを確認した) ここまでで2日ほど費やしました。

正直ドキュメントがあまり充実していないプロジェクトのソースコードを読んで理解するという経験はしたことがなかったので社員さんにどんな感じで進めて行くのがよいか質問してみたところ、 戦略としてはひとまずデバッガをつかって1ステップずつ進めながらどういう感じで動いているか観察してみるのがよいとの回答をいただいて、なるほどと思いながら解析を進めました。

数日(!?)くらいそんなことをしていると浅いところで何をしているかがなんとなく見えてきて、実装に関する知見をまとめたりpolyhedral modelについて勉強したりして過ごしていました。

他にはTiramisuを使ってどんなことが記述できるかを試したかったので、行列計算のうち繰り返しを使って何かするアルゴリズムとしてべき乗法を実装してみました。 べき乗法は絶対値最大の固有値を求めるアルゴリズムで、やることの9割がランダムな初期値をもつベクトルに行列Aをひたすらかけ続けるだけというシンプルなものだったためこれを採用しました。

C++で愚直に実装したものとTiramisuで愚直に実装したものとTiramisuでいい感じにSIMDをつかって高速化したものを比べてみたいなーと思っていたのですが、残念ながら時間がたりずそこまではできませんでした。

ただ、実装が間に合ったものとして「二本のバッファを使って繰り返しの操作を回す」という処理が挙げられます。 (社員さんの話を聞いた限りでの僕の理解としては)Halideでは計算の途中に用いるバッファを明示的に指定できないため上のような処理はできず、ひとつ前の結果に依存するような繰り返しの回数に比例してメモリを消費してしまう可能性があるのですが、Tiramisuでは特に困ることもなく上のような処理を記述できました。これはHalideに対してTiramisuが優れている点だと思います。

一方で、Tiramisuがやっていると主張している「データ依存関係の検出」という処理がうまくされていなくないか?という疑問が生じました。 Tiramisuは
アルゴリズム
・スケジューリング
・バッファ割当
の3つを記述するのですが、バッファ割当に対して間違ったスケジューリングをしていても特にそれが検出、修正されている様子はありませんでした。 正直このあたりはTiramisuに一番やってほしかったところであるため、見つけた時は少し残念でした...

感想

会社自体はとても働きやすそうなところでした。 10円でコーヒーなどの飲み物を買うことができたり、広めの雑談スペースがあったり、本がたくさん置いていたり、お昼寝スペースがあったり、、、 また、社内で勉強会が行われていたりもしていました。

みなさんも興味があれば通年でインターンシップを募集しているので申し込んでみるとよいと思います。 夏休みの期間は他期間と区切ってインターン生の受け入れを行っているようです。 お給料(時給2000円)、交通費、宿泊費(前泊・後泊込み)が出るのがかなりありがたかったです。

AtCoder水色以上の方はJobsから申し込みましょう。(夏休み期間は公式ページから申し込んだほうがいいんか?と思って公式ページから申し込んだけどそんなことはなかったっぽい)

AtCoderJobsからのインターンシップ申し込みフォーム
AtCoderJobs - 求人詳細 - 【通年】あらゆる手法を駆使し、実社会で動いているソフトウェアを高速化するインターン募集!

公式ページのインターンシップ申し込みフォーム
インターンシップ | フィックスターズ 採用情報