1週間で仮説検証を繰り返す、サービス開発のための取り組み

こんにちは。投稿開発部 エンジニアの角田と申します。投稿開発部は、クックパッドの中でもレシピを投稿するユーザーに向けた機能の開発を行っている部署です。
私達の部署では、エンジニアも仮説検証の段階からディレクターやデザイナーと一緒に取り組むことが多く、本稿では投稿開発部で行っている仮説検証についてご紹介します。

Webやアプリでサービス提供している方なら、新しいアイディアの価値は最速・最小限で確かめたいものですよね。 特に大規模な実装になりそうなアイディアであればあるほど、本当に価値があるのか、ユーザーに使われそうかを先に確かめたいものです。

私達は、本実装する前に「実際のユーザーの反応を見ながら、新しいアイディアの価値を短期間で確認する」取り組みを行っています。 私達のチームに合わせた手法になっているので、そのままは活用できないかもしれないですが、同様に仮説検証に取り組んでいる、もしくは取り組もうとしている方々の参考になればと思い、ご紹介します。

プロダクトの価値を短期間で確認するために

クックパッドでは、この本でも有名なGoogleのデザインスプリントを全社的に取り入れ始めています。こちらの記事にて取り組みの内容について取材していただいております。

ここでは、投稿開発部での最新の取り組みを紹介しますが、ところどころスプリントの手法を参考にしている部分があるので、気になった方はそちらも読んでいただけると、より理解が深まるかもしれません。

私達の場合は、仮説の設定を含め、概ね1週間以内でプロダクトや機能の発案とその評価を行っています。この検証では、定性調査(ユーザーインタビュー)のみを行いますが、検証の結果が良さそうであれば本実装を行い、そこで定量調査を実施します。
1サイクルの中で、以下のようなステップを踏んでいます。

1) 部orチームの目標から、仮説を設定する
2) 定性評価の精度を上げるための「問い」を設定する
3) ソリューションを考える
4) ソリューションの共有と決定を行う
5) 問いを見直し、ストーリーボードを作成する
6) プロトタイプを作成する
7) ユーザーインタビューと評価を行う

1)部orチームの目標から、仮説を設定する

ここでは各部署や各チームの長期的な目標から、それを成し遂げるために検証したい仮説を設定します。

投稿開発部では、「レシピを投稿し始める人を増やすこと」を長期的な目標のひとつとして設定しています。 例えば、その目標を実現するために、「料理の工程や工夫の話が出来て反応が嬉しい反応がもらえることで、レシピ投稿を始めるのではないか」といったような仮説を設定します。 複数の仮説を確かめたい場合もありますが、仮説をひとつに絞った方が評価もしやすく、インタビューでも深く聞くことができるため、個人的にはひとつに絞ることをおすすめします。

仮説のタネは、自分たちで日頃から料理やレシピ投稿の経験を積んだり、課題抽出のためのユーザーインタビューを行うことによって得ています。

この後、1週間でこの仮説にYes/No の結論を出すための検証を設計していきます。

2)定性評価の精度を上げるための「問い」を設定する

検証したい仮説にYes/Noを下すためには、仮説が成り立つ条件をすべてクリアしている必要があります。ここではその条件を問いにします。

例えば、上記で挙げた「料理の工程や工夫の話が出来て反応が嬉しい反応がもらえることで、レシピ投稿を始めるのではないか」という仮説は、以下の条件から成り立つとします。

  • そもそも料理の工夫や話したいネタがある
  • 料理の話をして反応が欲しいと思っている
  • レシピを投稿すれば、反応が得られる思える
  • レシピ投稿の方法が分かり、投稿できる

これを疑問系に置き換えて問いを定義します。そして、ユーザーインタビューの際にこれがクリアできているかを観察します。

3)ソリューションを考える

ここでは、1)で立てた仮説を、ユーザーに体験してもらうためのソリューションを考えます。 全チームメンバーが考えを持ち寄る事を大切にしていて、同日に制限時間を設けて案を出すこともありますが、難しければ1~2日後に個々人が考えた案を持ち寄ることもあります。 ソリューション案は、後ほど壁に貼って見比べるので、検討しやすいよう項目を以下のように共通化しています。

  • 仮説
    • 1)で立てた仮説をより具体的なシーンに落とし込んで、ソリューションと紐づけたもの
  • ターゲット
    • 仮説にあてはまる人の具体的な属性(ex: 主婦、仕事あり..etc)や、心理的な背景(ex: 日々の料理が作業になっていてモチベーションが上がらない)など
  • 体験
    • そのソリューションで実現したい具体的な体験
  • 方法
    • 定義した「体験」を実現する方法
    • 簡単な画面遷移図などを添えることが多い

4)ソリューションの共有と決定を行う

2)で考えたソリューションを、共有し、そのプロジェクトの意思決定者が採用する案を決めます。

こちらは、スプリント本で言及されている「ソリューション決定」を参考にして、おおまかに以下の流れで実施しています。詳細はスプリント本をご確認ください。

  1. 各ソリューションをB4の紙に印刷もしくは書き出して、ホワイトボードに貼り出します(考案者の名前は記述しません)
  2. 各メンバーは<無言で>気になった点に小さな丸シールを貼り、感想や質問を付箋紙に書いてはります(5-10分程度)
  3. 全員貼り終わったら、各考案者が付箋に対し回答し、他のメンバーと不明点の解消を行います
  4. 議論が完了したら、各メンバーが採用したいソリューションに大きめの丸シールを貼ります(2-3枚程度)
  5. 意思決定者は、各メンバーが選んだ理由を聞いて、最後にどの案を採択するか決めます

f:id:kaktaam:20181129154848j:plainf:id:kaktaam:20181129154653j:plain

5)問いを見直し、ストーリーボードを作成する

問いの見直し

ここでは、2)で設定した問いをソリューションに合わせて見直します。問いの本質を変えるわけではなく、問いをそのソリューションに合った表現に置き換えます。インタビューや評価する際に、問いに対して判断をしやすくするために行います。

ストーリーボード作成

こちらもスプリント本の「ストーリーを固める」を参考にしていますので、詳しくはそちらをご覧ください。 簡単に言うと、ユーザーに私達のソリューションを正しく体験してもらうために、プロトタイプの絵コンテを10~15コマ程度で作成します。 これをもとに、具体的なプロトタイプやインタビューの設計に落とし込みます。

f:id:kaktaam:20181129155405j:plain:w350

6)プロトタイプを作成する

このプロトタイプでは、設計した検証に必要な体験をしてもらうための、最低限・最小限の画面・機能を用意します。短期間での検証なので、不要な詳細は省きます。

プロトタイプを作る場合、大きく2パターンの方法を採用しています。 ひとつは、静的なプロトタイプを作成するパターンで、もうひとつは実装するパターンです。

静的なプロトタイプの場合

Marvelというプロトタイプツールを使います。この場合は、デザイナーが作ったプロトタイプ用の画像をこのツールに反映し、画面遷移をできるようにします。
どのインタビューイーに対しても、同じ文言やUIを見せられれば良い場合などは、この方法を選択します。簡単に作ることができますし、Marvelの専用アプリを用いて操作することで本物のサービスのように見せることができるので、この方法で十分かと思います。

実装する場合

投稿開発部では、レシピ投稿についての仮説検証を行うことが多く、検証の中でユーザー自身が投稿したレシピや、それに関連する複数の情報をプロトタイプ上で表示したい、操作してもらいたい場合がよくあります。そうなると、静的なプロトタイプではなく実装をします。
具体的には、React Native製の「クックパッド MYキッチン」アプリにプロトタイプを実装し、インタビューで使うことが多いです。 インタビューにおいても、ユーザー自身のデータを表示することにより、素直で本音に近い回答が得やすいと感じています。

クックパッド MYキッチンについては、こちらの記事に詳しく書かれています。
React Nativeの開発環境については、iOSAndroidともに記事を公開していますので、よろしければご覧ください。

7)ユーザーインタビューと評価を行う

最後にインタビューと評価についてです。

ユーザーインタビュー

インタビューは一人30分×5名を1日で行うことが多いです。
事前に決めた問いを判断できるようなインタビュースクリプトを用意して臨みます(インタビューに関してはこちらの記事に詳しく書いています)。インタビューは数名が行い、その内容をインタビュー中継用の別室で他のメンバーが観察します。

中継室のメンバーは、各問いに対するユーザーの反応や発話内容を付箋に書いておきます(付箋の色は、ポジティブ・ネガティブ・どちらでもない に分けると良いです)。
事前に、問いと各ユーザー概要を記した以下のような表をホワイトボードに書き出しておき、インタビューが終わるたびに付箋を貼り出しておきます。

f:id:kaktaam:20181129162208p:plain:w400 f:id:kaktaam:20181129155421j:plain:w398

評価

インタビューと同日に評価を行います。
まずは、各インタビューイーに共通して見られた反応や発話内容をホワイトボードに書き出し、チーム内でインタビューの結果について理解を深めます。
次に、2)で出した問いに対して、○、△、✕ で結果を評価します。私達は以下のような基準で評価を行っています。

  • ○:仮説とソリューションがマッチしていて、このまま本実装して問題ない
  • △:この仮説や方針は悪くないが、ソリューションのピボットが必要
  • ✕:この仮説や方針自体、見直す必要がある

この結果をもって、次のアクションを決めます。 全て○になるようであれば本実装と定量調査に進み、それ以外であれば課題になった箇所についての検証を進める形になるでしょう。

さいごに

投稿開発部では、発案したプロダクトや機能の価値を事前に検証することで、根拠を持って新しい機能を実装できるよう取り組んでいます。こういった事前の検証サイクルをまわすことで、想定しなかった問題が明確になったり、意外なところでポジティブな発見を得ることができる等、利点は多くあるように感じます。

もちろん、週単位で仮説検証を回すのは正直楽ではないし、ディレクター・デザイナー・エンジニアで顔を突き合わせて議論する中で、途方に暮れる...ということもあります。 ただ、そうやって考えた仮説に対して早期にユーザーの反応が分かること、そして直接聞くことで具体的にその理由が分かることが非常に良いと感じています。
そして、ユーザーインタビューを通し、改めて料理をする人の考え方やリアルな生活感を理解することで、次のアクションのヒントにも繋がっていると実感しています。

こういったチームでのサービス開発、興味ありませんか?クックパッドでは一緒に開発に取り組んでいただけるメンバーを募集中です!ぜひ興味を持っていただけた方は、採用サイトをご覧ください。

Catchpointを使ったWebページのパフォーマンス計測

技術部開発基盤グループの外村です。最近はクックパッドのレシピサービスのWebフロントエンドの改善に取り組んでいます。その一環でWebサイトのページロードのパフォーマンス計測をおこなっているので、今回はその取り組みについて紹介します。

Webページのパフォーマンスといっても、文脈によってそれが指すものは様々です。サーバーのレスポンスタイムのみを指すこともあれば、ブラウザがページをレンダリングするまでの時間を指すこともあります。また、レンダリング後にUIの操作やアニメーションがどのぐらいの速度で動くかというのもWebページのパフォーマンスの1つです。今回はブラウザでWebサイトを開いてからページが表示されるまでのパフォーマンス(ページロードのパフォーマンス)にフォーカスします。

継続的なパフォーマンスの計測

ページロードのパフォーマンスを計測する手法はいくつかあります。まず、簡単なのは Google Chrome の DevTools に付属している Lighthouse を使う方法です。DevTools の Audits タブを選択して計測をおこなうと、次のように詳細なパフォーマンスレポートを見ることができます。

f:id:hokaccha:20181129161257p:plain

DevTools を使った計測は便利なのですが、単発の計測では意図せずパフォーマンスが劣化したときに気づけませんし、マシンのスペックによって数値がばらけてしまうこともあります。パフォーマンス改善のための計測は、同一の環境から自動で定期的に計測することが重要です。

ページロードのパフォーマンスを自動で測定するツールはWebPagetestSpeedCurveNew Relic Syntheticsなど様々なものがあります。クックパッドでは、以前以下の記事でも紹介した、Catchpointというサービスを利用しています。

Synthetic Monitoring を活用したグローバルサービスのネットワークレイテンシの測定と改善 - クックパッド開発者ブログ

指標を決める

パフォーマンスの改善をおこなうために改善すべき目標の指標を決める必要がありますが、ページロードにおける指標は様々なものがあり、どの指標を改善すべきかはコンテンツの特性や目的によっても変わってきます。

例えば DOM のロード完了(DOMContentLoaded)や、サブリソースの取得まで含めたロードの完了(load)のイベントが発火するまでの時間はよく知られた指標の1つです。これらは簡単に取得できるというメリットがありますが、実際にページにコンテンツが表示されるまでの速度とは異なるため、改善の目安の1つとして使うのはよいですが、目標とする指標にするには不十分です。

DOM やリソースのロード時間と比べ、コンテンツが描画されたり、ユーザーが操作できるようなタイミングといった指標は、より実際のユーザー体験に近い指標を得ることができます。例えば以下のようなものがあります。

  • First Paint
    • 画面に何かしら(背景色などでもよい)描画されたタイミング
  • First Contentful Paint
    • テキストや画像などのコンテンツが最初に描画されたタイミング
  • First Meaningful Paint
    • ユーザーにとって意味のあるコンテンツが描画されたタイミング
  • Time To Interactive
    • ユーザーの入力に反応できるようになったタイミング

f:id:hokaccha:20181129161429p:plain
User-centric Performance Metrics | Web Fundamentals | Google Developers
Licensed under a Creative Commons Attribution 3.0 License.

First Paint と First Contentful Paint は簡単に機械的に判定できるものなので、ブラウザの API から取得できますし、標準化も進んでいます。一方、First Meaningful Paint や Time To Interactive は何を持って意味のあるコンテンツとするのか、ユーザーの入力に反応できる状態と判断するのか、という基準を決めるのが難しいので、曖昧さが残る指標ですが、実際のユーザーの体験に近い数値を取ることができます。

これらの指標が有効なケースも多いのですが、実際のブラウザによるページのロードはもう少し複雑で、ある特定のタイミングを測るだけでは不十分なケースも多くあります。そこで考えられたのが Speed Index という指標です。Speed Index は単純なある地点でのタイミングでなく、ファーストビューが表示されるまでの進捗を含んだ数値です。

f:id:hokaccha:20181129161758p:plain

上記の図において、A と B はファーストビューの表示速度は同じですが、A のほうは徐々にコンテンツが表示されており、B はファーストビューがでるまでほぼ真っ白な状態です。Speed Index は最終フレームと途中経過のフレームの差分を計算し、それを足し合わせることでスコアを算出します。そうすることで実際のユーザー体験により近い指標を得ることができます。上記のケースでは当然体験がよいのは A で、Speed Index のスコアも A のほうが低く(Speed Index は低い方がよい)なります。

もっと具体的な算出法方法については公式のドキュメントを参照してください。

Speed Index - WebPagetest Documentation

今回はこれらの指標を検討し、Speed Index を目標指標として採用することにしました。

Catchpointでの計測

Catchpoint では Speed Index の計測はデフォルトで有効になっていません。Advanced Settings から Filmstrip Capture を有効にすることで Speed Index を計測できるようになります。

f:id:hokaccha:20181129161843p:plain

Filmstrip Capture は特定の間隔で画面のキャプチャを取る機能で、このキャプチャを元に Speed Index が算出されます。Catchpoint ではこのキャプチャを取る間隔を 200ms 〜 2000ms で選ぶことができます。有効にして測定すると次のように、画面がレンダリングされていく様子がキャプチャで記録され、Speed Index のスコアが取得できます。

f:id:hokaccha:20181129161934p:plain

また、Speed Index 以外にも改善の助けとなる指標はたくさんあるので、それらをまとめてダッシュボードを作り継続して観測できるようにしています。

f:id:hokaccha:20181129162010p:plain

ページ遷移のパフォーマンス計測

ページロードのパフォーマンス改善は、初回アクセス時と別のページから遷移時、2度目のアクセス時などによって大きく性質がことなります。初回アクセス時には何もキャッシュを持っていない状態なのでクライアント側のキャッシュを使う方法は役に立ちません。一方、クックパッドのサイトで検索ページからレシピページに遷移するようなケースでは、検索ページにアクセスした時点で共通のアセットをキャッシュしたり、検索結果のレシピのページを先読みしてキャッシュしておくなどの対策が可能になります。

Catchpoint ではこのようなページ遷移時のパフォーマンスも測定することができます。

Transaction Test Type – Catchpoint Help

ページ遷移するためのスクリプトを設定に書くことができます。例えば検索画面にアクセスし、一番上のレシピをクリックしてレシピ画面に遷移するためには、以下のようなスクリプトを設定画面に書きます。

// Step - 1
open("https://cookpad.com/search/%E3%83%91%E3%82%B9%E3%82%BF")
setStepName("Step 1: Open Search Page")

// Step - 2
clickAndWait("//*[@id='recipe_0']/div[@class='recipe-text']/span[1]/a")
setStepName("Step 2: Transition To Recipe Page")

計測結果は各ステップごとに保存され、以下のように結果を見ることができます。

f:id:hokaccha:20181129162052p:plain

様々なキャッシュが効くので初期ロードのときよりも各種スコアがよくなっており、遷移時のほうが高速にページがロードされていることがわかります。

まとめ

Catchpoint を使ったWebページのパフォーマンス計測について紹介しました。パフォーマンスの改善についてはまだ着手し始めたばかりで、具体的な施策をおこなうのはこれからです。具体的な改善について成果がでたらまた別の機会に報告したいと思います。

クックパッド機械学習チームのメンバが働く環境と役割

研究開発部の takahi_i です。本稿ではクックパッド研究開発部の機械学習チームに所属するメンバがタスクに取り組む体制および、働く環境について紹介します。

準備

機械学習はそれら単体が学ぶのにコストが掛かる分野で、高い専門性を獲得するためには多くの時間をかける必要があります。そのため機械学習の専門家はソフトウェア開発を十分に経験する 機会を得られにくい状況にあります。

このような前提において民間企業で機械学習を導入する場合、二つの可能性が考えられます。一つは完全に分業する方向で、機械学習のエキスパートはモデルだけを作り、ソフトウェアエンジニアが導入 を引き受けます。もう一つは機械学習の実験、モデル作成から導入までを一人がおこないます。

分業による利点と問題点

機械学習は日進月歩の分野です。機械学習エンジニアやデータサイエンティストといった職が単体で存在します。特に大きな組織では、機械学習のモデル作成を担当する機械学習 エキスパート(リサーチャー)とモデルの導入および運用を担当するソフトウェアエンジニアは区別されていることが多いです。

分業体制の利点

分析を担当する機械学習エキスパートと導入を担当するソフトウェアエンジニアが担当箇所を分けることで、以下のような利点があります。

  1. 各自が自分の専門性を追求できる
  2. 分業による効率化

各自が自身の専門性を磨けるので、新規性のある構成を追求したいメンバは満足できる環境です。また、うまくリソース配分ができれば、各自は自分の専門性に適合するタスクだけが与えられるために 高い生産性が期待できます。

分業体制の問題点

次に問題点を考えてみると、以下のようなものがあります。

コスト

機械学習エキスパートが機械学習のモデルだけをつくればよいという環境を作るにはコストがかかります。シンプルには社内に Jupyter サーバを立てて、そこで作業をしてもらうのが考えられますが、実際にサービスで利用するにはもう少し大掛かりな機構が必要になります。Jupyter Notebook で作ったモデルを自動でプロダクション環境にデプロイする機構や、自動デプロイされたモデルのバージョン管理、自動テストをシステムとして作り込む必要があります。

また一つのプロジェクトを遂行するにはマネージメントのコストも発生します。よくあるのがモデルは完成したが、それを組み込んでくれるソフトウェアエンジニアのリソースが足りないため数ヶ月待たされるというものです。

さらに将来システムに問題が起こった時にも、複数名をアサインする必要があるため十分な人員を確保しつづけるのは頭のいたい問題です。

担当箇所が曖昧になりやすい

機械学習タスクの実装を細かく分業すればするだけ、だれが個々の箇所を担当するのかが曖昧になっていきます。たとえば多くの機械学習タスクは単純に学習器自体を適用するだけではなく、前処理 を駆使して精度を上げてゆきます。この前処理部分は実験をしている時に作られ Jupyter Notebook にべた書きされています。

この前処理部分がプロダクション環境に移植されないと、入力データをモデルに入れても動作しません。ではこの前処理部分をプロダクション環境に持ってゆくのは誰でしょうか。タスクやアルゴリズムを理解しているという意味では、機械学習エキスパートですし、システムへの組み込みに慣れていることを優先するのであればソフトウェアエンジニアが適任と言えます。

通常この前処理部分の組み込みはソフトウェアエンジニアがモデルを作った機械学習エキスパート指示を受けつつ作成します。残念ながら、この共同作業は機械学習エキスパートもソフトウェアエンジニアも理解が中途半端な部分がありつつ仕上げるので、バグが混入しやすいです。さらに、精度向上が必要になった場合、前処理の書き換えが必要になる場合があります。前処理の書き換えが発生するすると、共同作業が必要になりコストは更に膨らんでゆきます。

クックパッド研究開発部の体制〜メンバがモデルの配備まで責任を持つ

現在クックパッドの研究開発部では、機械学習のモデル生成のみを担当するメンバはいません。メンバ全員が機械学習エンジニアです。ここで言う機械学習エンジニアはモデルの作成からモデルの結果を配備するところまでの責任を持ちます。

このような一人で一気通貫するシステムにも利点と問題点があります。

利点

タスクを一気通貫して受け持つ体制には以下のメリットがあります。

責任の所在が分かりやすい(責任の空白地帯が発生しにくい)

分離型ではタスクのなかの自分が興味のある部分だけ貢献することになります。結果、矢継ぎ早に別プロジェクトに移りながらタスクをつまみ食いするモラルハザード(タスクホッピング)が起こりがちです。

このような状況だと問題が起こった時に、貢献した人はすでに別プロジェクトをしているから問題解決は別の人がやってくれという話になります。しかし実装から数ヶ月、数年経った機械学習プロジェクトの問題解決は実装した当事者でも難しい問題です。別の人が解決にあたる場合には、さらに大きなコストが掛かってしまいます。

これに対して個人が責任を負うシステムでは、基本モデルを作ったエンジニアが責任を持つので、責任がはっきりし前処理やつなぎ込み部分において責任の空白地帯が発生しません。将来問題が起こっても、作った(もしくは正式に引き継いだ)メンバが問題の解決にあたってくれることが期待できます。

省コスト

大規模なシステムの作り込みを必要としません。機械学習エンジニアは Jupyter Notebook で実験し、自分でコードを整形、ライブラリ化し、それらをプロダクション環境にデプロイします。すくなくとも通常のサービスへのデプロイではモデル配備のために特別に自動化されたインフラは必要ありません。

問題点

とはいえ、このやり方にも問題点があります。具体的には以下の問題点があります。

知見が共有しにくい

各自が一気通貫して作業するので、各タスクの知識を一人だけが保持するという事態が起こりやすくなります。そのため、タスクの実装が適当になってしまいやすいという問題があります。

クックパッドの研究開発部ではプロジェクトの規約を提案してくれたメンバがいて、プロダクションで利用されるプロジェクトはその規約にしたがって作られています。規約には、実サービスに導入するレポジトリにはテストをつけ CI を導入する。ほかに関連するリソース(S3)の置き場、利用する Role などがあります。

専門性を磨く時間が削られる

機械学習の結果をサービスに繋ぎこむ部分にもコストがかかります。そのため各自が専門性を磨く時間は分業体制に比べて少なくなります。この状況に対応するため、研究開発部として学習をサポートする仕組みを導入しています。「5%ルール」呼ばれる仕組みで、二週間に一回(半日の間)、新しい技術をキャッチアップする時間を自由に取得できるようになっています。

さらに、この問題についてはクックパッド社の社員に提供されている作り込まれたインフラでかなり改善できていると感じています。以下の節で、機械学習エンジニアがインフラからどのような恩恵を受けているのかについて解説します。

インフラによるサポート

クックパッドで機械学習プロジェクトの作業をしていて、助かっていると感じる部分が二つあります。一つは DWH(データウェアハウス)、もう一つは各自が構築できるインフラです。

データウェアハウス(DWH)

クックパッドの社員は DWH を使って必要なデータをほぼ全て取得できます。社員がデータ取得するには分析用 SQL を入力するだけです。データ取得 SQL は機械学習用の前処理スクリプトからでも埋め込んで実行できます(詳しくはこちらを参照してください)。これによって、日々変化してゆくデータを取り込んだ状態の機械学習モデル及び出力結果をすくないコストで提供し続けられます。

作り込まれたインフラ

現在、クックパッドのインフラは ECS 上に構築されています(くわしくはこちらを参照してください)。提供される仕組みのおかげで機械学習エンジニアはプロダクション環境にインスタンスを自由に構築できます(もちろんレビューを受ける必要はあります)。

我々が機械学習に関するコンポーネントをプロダクション環境に構築するには、まずバッチや API サーバを Docker コンテナで動作するようにまとめたレポジトリを作ります。次に、Jsonnet で記述する設定ファイルに Docker イメージ、Role、環境変数などの設定を記述します。このような環境だとサーバ構築にコストがかからないですし、必要であればサーバの構成(CPU、メモリ)も設定ファイルの書き換えにより簡単に修正できます。チーム間の複雑なやり取りが必要ないので、機械学習エンジニアはすくないコストでプロダクション環境に機械学習周りの計算機リソースを構築できます。

研究開発部における省力化の取り組み

これまで述べてきたように我々は社内環境に助けてもらっていますが、研究開発部でも実験や導入作業が効率化できるようにいろいろな取り組みをしています。

一つには研究開発部にはインフラに強いメンバがいます。彼らが高速な研究開発を支える GPU 計算機環境を作ってくれ、メンバが必要とする計算機リソースを常に確保できる状態になっています。

機械学習エンジニア自身も各自がツールをつくって自分の業務を効率化するのに役立てています。たとえば Kelner という爆速で Keras のモデルから API サーバを構築するツールを作っているメンバもいますし、私も各プロジェクトごとに異なるポートフォーワードの設定を管理するツール、pfmを自作して自身の業務を効率化してます。

また、機械学習プロジェクトはタスクは異なっても、デプロイ方法は似ているものが多いです。たとえば、機械学習が出力する判別結果の多くはいくつかの方法で利用されます。DB や Redshift のテーブルに入れる。API サーバを立てる。検索エンジンのインデクスに登録するなどです。このあたりはタスクが変わってもやり方は変わらないため、過去の Issue やそれらを抽象化したドキュメントが役に立ちます。チームメンバが各自経験したタスクをもとにしたドキュメントを書いてくれているので、自分自身が 初めてやるタスクでも比較的低コストに実装できる環境になっています。

まとめ

このエントリではクックパッドの研究開発部における機械学習エンジニアの役割について解説しました。クックパッド研究開発部は今後も様々な取り組みに挑戦していきます。メンバを募集しているので、ご興味がある方は是非ご応募ください!