がべーじこれくしょん

技術系とかいろいろ

Cookpad Summer Internship 2018 5Day 研究開発インターンシップに参加してきました

internship.cookpad.com

Cookpadのサマーインターンシッププログラム3コースのうち、研究開発コースに参加してきました。かなり濃密な5日間を過ごせたので、忘れないうちにまとめたいと思います。

f:id:musaprg:20180825001006j:plain

選考

本来修士以上が応募要件だったのですが、某逆求人イベントでヨシオリさんに全力でお願いしたところ、学部生ながら参加させていただけることになりました。(本当にありがとうございました…)

インターンの大まかなスケジュール

インターンは、1〜3日目の3日間で講義を行い、4日目に個人ワーク、5日目に成果報告、という日程でした。

1日目:機械学習概論

2日目:NLP / CNN

3日目:MLOps / 軽量モデル

4日目:個人ワーク

5日目:成果報告会

講義で使用された資料については、後ほど公開されるらしいです。

めちゃくちゃ密度が濃く、講師の方々の血の滲むような努力が伺えます…5日間では追いきれてる自信がないので、公開されたら僕も読み直そうと思っています。ぜひ。

1日目

修士の猛者たちにボコボコにされる気概で恵比寿に向かいました。

ホワイトボードにはゆるふわなWelcomeの文字が。

f:id:musaprg:20180825001057j:plain

こちらは任意の場所で無限にもらえるノベルティ類。

f:id:musaprg:20180825001115j:plain

初日の講義は、午前午後両方が菊田さん(@yohei_kikuta)さんパートでした。

内容は、自動微分と計算グラフに関しての理論的な講義でした。

ほぼ1日中パソコンを開かず、紙とペンをもって数式とにらめっこしたのは本当に久々だったので、すごくいいリハビリになりました。

また、普段何気なく使っているML系のライブラリ内でどのような演算が行われているのかを、理論的にしっかり勉強したことはあまりなかったので、とてもいい経験になりました。

そういえばチョコの消費量がえげつなかった…

昼飯

お昼ご飯は社員さんが作ってくださっています。手作りごはん最高…神…

カレーライスです。

f:id:musaprg:20180825002511j:plain

夕飯

社員さんとインターン生でご飯を作りました。

f:id:musaprg:20180825002601j:plain

会社にキッチンがあるっていいですね…普段社員さんもキッチンでワイワイご飯を作っているみたいなのですが、本当に楽しい!!!

というか1年ぶりに料理をしたのですが、1年自炊をやっていたのにもかかわらずいろいろと忘れていてやばかったです。さっさと退寮して一人暮らしをしなければ…

2日目

午前は、 原島さんによる「自然言語処理」に関する講義でした。

NLP周りの概略について非常に丁寧に網羅的に説明してくださったので、とてもとっつきやすかったです。今のバイト先で、トピックワード抽出や文体変換のようなことは少しやったことがあったのですが、いかんせん画像に比べてNLPはとっつきにくいイメージがすごくあったので、とてもよい経験になりました。

普段は触ることのできないようなデータを使用できて、インターンならではの体験ができて超楽しかったです!!!

ただ、NDAなのでこれ以上は話せません…(というより、どんなデータだったのかもう忘れました…)

※ちなみに、レシピの対訳データについては公開しているそうです!! → Recipe Corpus

午後は、菊田さんによる、画像認識入門でした。

入門ということで、さっそくCNNにおけるConvolutionを数式で理解しよう!!パートです。パソコンの出番はありません。ひいい…

CNNにおけるConvolutionは、どうやら一般にいう畳み込み(ランニング積分とかいうやつ)ではないらしいです。符号が違うだけなのですが呼び方が違う…と。なんていうかは忘れてしまいました…()

講義の後は、sobel filterと呼ばれる輪郭抽出のフィルタを使って、実際に畳み込みの操作をpythonで実装してみよう、というハンズオンでした。

実際にライブラリに頼らず手を動かすのは、理解を深めるという意味では非常に有効だなと思いました。車輪の再発明、時間の許す限りやろう。

昼飯

f:id:musaprg:20180825003935j:plain

3日目

午前は、林田さんによる「MLOps」に関する講義でした。

Cookpadは、機械学習に関連するインフラや運用に関する技術がかなり進んでいると個人的に思っていました。

5DayR&Dインターンでは、機械学習の理論やその実用のみを扱うことを想定していた自分としては、MLOps、というよりDevOpsまわりの話を聞けるということがすごく驚きで嬉しかったです。

ただ、参加している層がリサーチャーなので、エンジニアリング周りに関する深いお話を期待していた自分としては少し物足りなかった気がしました…もっと運用に関する突っ込んだお話を聞きたかった…

参加者一人一人が様々なバックグラウンドをもっており、それぞれの人のスキルが本当にバラバラな場で、話すレベルを一定に定めることはすごく大変だということがひしひしと伝わってきました。

講義後はハンズオンでした。学習済みの画像分類APIとFlaskアプリがDockerコンテナ上に載っているという構成のサンプルアプリが配布され、これを好きにいじるという感じでした。

僕は、Kubernetesに興味があったので、林田さんと相談したところ、komposeという、docker-composeのファイルをkubernetes用に変換するソフトウェアを使って、kubernetesクラスタ上にサンプルアプリをデプロイすることにチャレンジしました。

「変換するだけじゃんwwww余裕wwwww」とかいってなめてかかってましたが見事にハマりました。侮るなかれ。

これについては後でQiitaにでもまとめようかと思うのですが、実は(というより当たり前かもしれませんが)kubernetespods上で立ち上がるコンテナは、ローカルのボリュームをコンテナにマウントすることができません。そのため、docker-compose.yml上のボリュームマウント設定は、kubernetes上では適用されません。これは、komposeの実行時にWARNが出るのですが、だがしかしWARNが出るだけなのです。(もちろんボリュームマウントできてないので、接続するとstatic以下のファイルがないよとFlaskからお叱りを受けます。)

仕方ないので、ローカルでdocker registryサーバーを立てて、そこにNDAなモデルを含めた全ファイルを焼いたdocker imageをデプロイし、それをpullしてくるようにdocker-compose.ymlを書き換えたところ、正常に動作しました。やったね!!

あとkubernetesクラスタ上で動いているコンテナに接続する時もかなり苦戦しました。kubectl proxyでHTTPプロキシを立ち上げればいいのですが、URIのprefixがよくわからずにいつまで経っても繋げずに苦戦してました。あと困ったのはdashboardですね。kubernetesをちゃんと勉強してからやるべきでした。勉強します…

午後は菊田さんによる、モデルの圧縮や軽量モデルに関する講義でした。Inverted Residual Blockなど、MobileNetに関することについてかなり言及していた印象です。個人的には理論よりも実用寄りの研究のほうが興味があるたちなのですが、モデルの圧縮や軽量モデルに関しては、モバイルアプリ等で使用するために必要な技術なので、とても興味がわきました。特に、MobileNetv2の活性化関数がReLU6という、ReLUに制約を課した関数を使用していたのですが、これがまたなんで6なのかということがすごく気になりました。(実は4日目の個人ワークで検証っぽいことをしてます)

昼飯

f:id:musaprg:20180825002849j:plain

夕飯

f:id:musaprg:20180825004021j:plain

f:id:musaprg:20180825004053j:plain

4日目

4日目は、1日ぶっ通しで個人ワークでした。テーマは個人でそれぞれ決めて、もくもくする日です。

僕は、せっかくクックパッドの貴重なデータをもらったので、最初はデータを使って何かやろうと考えていました。

貸していただいたデータの中に、検索クエリのデータがあったので、入力として与えた検索クエリの次に検索される可能性のあるクエリをLSTMを使って学習させるということをタスクとして選びました。

しかし、貸していただいたデータは、時系列順でソートされていないことがわかったので、このタスクは諦めて別のやつにすることにしました。

いろいろ考えた結果、MobileNetv2で使われているReLU6の「6」がなぜ「6」なのか謎だったので、「ReLU6に関する検証」というテーマで個人ワークを進めました。

これに関しての議論は、実は以下のブログに詳しく書いてあるので、ぜひ読んでみてください。

yoheikikuta.github.io

ただ、今回のインターンでは、残念ながらGPUリソースの提供はありませんでした…(´・ω・`)

そのため、検証にあまりに時間をかけるとまずいので、Epoch数を1に絞ったり、検証に使用するネットワークを単純なものにしたりいろいろ試行錯誤をして検証をしました。

上記のようなこともあって、今回やったものはあまりまともな検証とはいえないので、インターン後にちゃんと検証するということにしました。(検証するとはいってない)

昼飯

f:id:musaprg:20180825003001j:plain

f:id:musaprg:20180825003022j:plain

夕飯

社員さんとインターン生でご飯を作りました。

ゴーヤチャンプルー担当した!!!!苦い!!!!!!!!!!!!!!!!ごめんなさい!!!!!!!!!!!

f:id:musaprg:20180825004233j:plain f:id:musaprg:20180825004320j:plain f:id:musaprg:20180825004253j:plain f:id:musaprg:20180825004415j:plain

5日目

午前中はスライドを作る時間で、午後に成果発表会です。

僕のスライドはあまりにもお粗末で恥ずかしいので見せたくないのですがせっかくなので載せたいと思います。

許可が出次第更新します。

追記@2018/8/28】許可が出たので載せます。

speakerdeck.com

昼飯

おいC〜〜〜〜〜〜〜〜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

f:id:musaprg:20180825003713j:plain

夕飯

これが俗にいう「優勝」ってやつですね。5日間すごく頭を使って疲弊していた分、料理もお酒もめちゃくちゃ美味しかったです。泣きました。

f:id:musaprg:20180825004610j:plain

f:id:musaprg:20180825004526j:plain

f:id:musaprg:20180825004542j:plain

まとめ

クックパッド、めちゃくちゃいい会社でした。

今回は実務というわけではなかったので、実際の業務風景とかは体験することができませんでしたが、とにかく社風がよかったです。

社員さんもいきいきとしていて、皆がみんな仕事を楽しんでいる感じでした。

あと料理が美味しかった!!!!!!キッチンでご飯が作れて食べれるところもいい!!!!!

レシピサイトを運営しているからか、とても家庭的な雰囲気を感じました。実家のような安心感とはこのことですね…(˘ω˘)

R&D部門という点でいうと、クックパッドさんは他の会社に比べてかなり機械学習のサービス投入に全力を注いでおり、実際に成果も上げている本当に素晴らしい部署です。

メンバーも優秀な方ばかりで、学部生の私の愚問に対しても丁寧に答えてくださって、本当に感謝しています。5日間本当におせわになりました…

というわけなので、まだ研究室配属すらされていないペーペーの学部生でも、バイト等で多少なりとも機械学習関連の実務経験があればクックパッドさんは研究開発でも受け入れてくれます!

来年も行われると思うので、学部生の皆さんも「まだ学部生だから…」と臆せず、ぜひチャレンジしてみてください!!!

講義資料リンク

追記@2018/8/28】当日使用した講義資料の一部が公開されていたのでリンクを載せておきます。

追記@2018/8/31】公式HPにて開催報告が公開されていました。

techlife.cookpad.com