Re:ゼロから始めるML生活

どちらかといえばエミリア派です

ゆるふわMLOps入門(Netflix)

最近MLOpsに関して勉強していて、その一環で具体例の調査をしていました。 今回はNetflixの事例です。

こちらについては、プラットフォームの名前が見当たらなかったので、単純にML基盤という位置づけなんでしょうか。 なんにせよ、テックブログが公開されているのでそちらで事例を見ていきたいと思います。

netflixtechblog.com

netflixtechblog.com

以下は、自分があまり英語強くないので、後で見直す用に日本語のメモになります。 基本的に上の記事の内容そのままなので、悪しからず。。。

背景

Netflixでは、意思決定から新しい仮設設定までデータドリブンで行っています。 データは実験とイノベーションの燃料と考えており、日々素晴らしいコンテンツを見極めたり高度にパーソナライズした体験を1億3千万ものユーザーに届けることを実現しているのもデータのおかげです。

Netflixでは、日々10億ものイベントがストリーミングパイプラインに入ってきており、取り扱うデータ量は100PBにも登ります。 また、推薦機能のための機械学習やレポーティングのために日々15万以上のジョブが動作しています。 この規模の処理を支えるためには、柔軟で強力、かつ複雑なプラットフォームが必要になってきます。

Netflixは巨大な企業なので、このプラットフォームを使用する人間も多様になってきます。

f:id:nogawanogawa:20200229122636j:plain:w600

データを収集するデータエンジニア、分析からレポートを作成するアナリティクスエンジニア、それらをつなぐデータサイエンティストなど、実に様々なロールのエンジニアに使用されることになります。 こうしたエンジニアの作業をよく考えると、実は重複した処理というものが存在します。 そのため、これだけの規模のシステムとなので、管理上の理由からサポートするツールは最小限に留めたくなります。 一方で、これらの人々は使用する言語やツールが異なります。 そのため、こうしたエンジニアの多様性に対応できる様に抽象化するレイヤーを設けることが有効だと考えられます。

Jupyter Notebook

Netflixでは、科学研究やワークフローの再利用、計算の記述、データ分析を目的としたオープンソースツールを作り上げるために、2014年にProject Jupyterを開始しました。

Jupyter Notebookの特徴として、

  • 言語に依存しない実行環境
  • コードや出力、マークダウンをまとめて管理
  • 出力の可視化をしながら実行

などが挙げられます。 こうした特徴は、ビジネス背景や文書・コード管理、結果の記述ができ、コミュニケーションとして非常に優れたツールと考えられます。

NetflixでNotebookが本格的に導入され始めたのは2017第3四半期で、当時はデータを保持するプラットフォームにアクセスするためのツールとして使い始めました。 柔軟に使用でき、強力かつ簡単ということで、至るところで使用されるようになりました。

次第にNotebookに対するサポートを拡大していきます。 次に行われたのは、Notebookのパラメータ化です。 実行時に使用するパラメータを個別に変更できるようにすることで、Notebookの再利用性を高めることにしました。

優れた取り組みとして、Notebookをワークフローのスケジューリングに組み込むことでした。 NotebookはCellごとに実行され、エラー時にはどこのcellで失敗したかを特定しやすくなります。 この形式はユーザーにとっては使いやすく、いちいち書いたコードをプロダクション用にカットアンドペーストするといったことが不要になります。 Notebookを実行する際に、SparkやPrestoのjobも動きますが、このときに不可変な時系列データや中間生成物が発生します。 こういった生成物がNotebook環境の一箇所に集まっているために、トラブルシューティングが迅速に行える利点もあります。

Notebook infrastructure

上記のようなNotebook形式を導入するにあたって、Netflixでのプラットフォームの構成は下記のようになっています。

f:id:nogawanogawa:20200229101546j:plain:w800

主要なコンポーネントは下記の4つになっています。

  • nteract
    • ReactベースのJupyterUI
  • Papermill
    • Jupyter Notebookのパラメータ化、解析、実行を行うライブラリ
  • Commuter
    • 過去のNotebookの可視化、共有を実現するサービス
  • Titus
    • AWS上で実行可能なスケーラブル・信頼性ある実行時コンテナマネジメントプラットフォーム

ストレージ

ストレージはAWSのS3もしくはEFSを使用してNotebookを管理しています。 基本的にアカウント毎にEFSを仮想ファイルシステムとして運用し、ホームディレクトリがEFS上のアカウント用のディレクトリになるようにしています。

f:id:nogawanogawa:20200229183123p:plain:w500

スケジューラがNotebookを実行するときに、EFSからS3にNotebookがコピーされ、共有環境で実行が行われます。

こうしたNotebookは共有可能となっており、Commuterによって他人のNotebookを読み取り専用として閲覧可能になっています。 そのため、安全にNotebookの共有が可能になっています。

実行

実行時のリソース管理は、特にポイントとなる問題でした。 NetflixではすべてのjobはAWSのコンテナ上で動作しています。 実行時のこの複雑さを隠蔽することが重要でした。

コンテナが展開されると、だいたいの場合でデフォルト値で動くようにしています。それで不十分な際には、シンプルなインターフェースでパラメータを変更できる様になっています。

f:id:nogawanogawa:20200229184450p:plain:w500

オーケストレーションや環境をTitusによって管理することもあります。 これによって、ユーザーは特定のサーバー設定とDockerイメージで実行することもできるようになっています。 その際に、セキュリティグループやロール、環境変数などはTitusのライブラリに含まれており、インフラの構成管理にエネルギーを使うことなく時間をデータに対して使える様に配慮しています。

インターフェース

すべてのユーザーの要望に答えるUIのため、強力でシンプルなUIが難しい問題を解くツールとして最善と判断しました。 こうした哲学を実現するのがnteractで、ReactベースのNotebook UIです。 Jupyter Notebookと基本のコンセプトは変えていません。 変更したポイントとして、使用言語によってデータの取り扱いの難易度がまちまちであったことから、データの可視化についてはData Explorerを導入しています。

f:id:nogawanogawa:20200229185850j:plain:w600

これによって、データの探索が簡単になるような機能を提供しています。

機能

Notebook管理

いざ実行しようと思うと、NotebookServerは実行時の依存関係を紐解く必要が出てきます。 こうしたNotebook特有の問題を解消するためにPapermillが導入されています。 Papermillはnteractのライブラリで、柔軟かつ安定して実行可能なように動作の管理を受け持ちます。 Papermillの実行の概念図は下のようになっています。

f:id:nogawanogawa:20200229191320p:plain:w600

図のように、EFSに保存されたNotebookをPapermillが受け取り、実行した結果をNotebook内の結果を保持した形でS3に保存するようになっています。 これによって、コードとNotebook中の結果の不整合は解消され、実験管理として有効になります。 Papermillで実行された結果はCommuterによって、共有可能になります。

Papermillは自分でランタイムプロセスを管理するため、ユーザーは実行を気にする必要はありません。

f:id:nogawanogawa:20200229191338p:plain:w600

こうして、ユーザーにとって使いやすく、安定して実行できるNotebook環境が運用されています。

スケジューリング

Notebookに関してテストやバージョン管理などほしい機能は多くありますが、特に重要なのはスケジューリングです。 Notebookの実行はPapermillが担当するので問題ありませんが、より柔軟にスケジューリングできるような環境を用意しています。

f:id:nogawanogawa:20200229191351p:plain:w600

スケジューリングでは、

  • 外部イベントトリガーの使用
  • 内部で管理できる仮想化
  • メトリクスの取得・発信
  • 管理の一貫性
  • リトライ機能
  • 信頼性

などが必要となります。 これらの要求のため、Mesonと言うスケジュールを開発し、運用しています。 これによって、ワークフローのオーケストレーションやスケジューリングを行っています。

ワークフローの構築

スケジューラ使用することで、様々なイベントをトリガーにした処理を実行できるようになります。 なにかワークフローを記述したい場合には下記のようなDAGを構成する様にコードを記述する必要があります。

f:id:nogawanogawa:20200301004228p:plain:w500

このケースでは、最低でも4つのノートブックが必要になります。 集計のノートブックは下記のような形になります。

f:id:nogawanogawa:20200301004244p:plain:w600

このようなNotebookによってDAGを構築し、スケジューラで実行するという方式を取ることでワークフローを構築します。

統合

Notebookのパラメータ化テンプレートがすでにあるので、それを用いた統合テストも可能になっています。 Notebook自体は単体テストは行わず、単体テストは提供するライブラリに内包するようにしています。

そのため、Notebookの作成する際の指針は

  • 分岐を少なく
  • ライブラリを使用
  • 短く、シンプルが良い

のようになっており、これらを実現する様に各種ツールが整備されています。

感想

この記事から分かったことは、Jupyter NotebookのUIを使いつつ、裏のプラットフォームが必要に応じて実行を制御できれば非常に生産性が上がる可能性があるということですかね。 Notebookはソフトウェアエンジニア以外にとっても馴染みやすく、プロダクションとして使用しにくいという点を除けば非常に強力なUIですね。 そのため、このUIを最大限活用しつつ、Notebookの共有やスケーリングが自動で実行できるようにするというのがNetflixの方針の様に思えました。 たしかになーって感じですね。

この事例については特徴量の共有については登場しなかったんですが、その変どうなってるんでしょうかね? UI重視で機能面についてはこれから改善していく感じなんでしょうかね。楽しみです。