身近なMachine Learning as a Service! UberのMichelangelo

自己紹介
- 最近
Apache Hadoop、Cassandra、Apache Kafka、fluendを使ってサービス構築をしている。 - 得意な言語は
golang、javascript。 - 好きなライブラリ、フレームワークは
golang echo、Vue.js。 - 開発経験分野: サーバーサイド、フロントエンド、ロボット、iOSアプリ、インフラ
- 好きなサービスは
GCP Cloud BuildやSpinnaker、Kubernetes。
本記事の対象者
- Machine learning as a Service(MLaaS)に興味がある人
- ビッグデータのインフラ構築に興味があるひと
Uber Michelangeloとは
2015年半ばから始まったプロジェクト。
Uberが開発している社内機械学習プラットフォームのことである。
主にUberの交通予測に使われていて、Uber Eatsだとお届け時間を予測したりしている。

またその自動でプロダクションコンテナへデプロイを可能にして、ワークフローをend-2-endなシステムで完結させ、チーム間や組織内で利用できるようにする仕組みである。
Michelangelo開発のきっかけ
継続的デプロイなどの背景にある原因が機械学習モデルにも同様に見られたからです。
以下のような
- ビルド
- デプロイ
- ツールの多様化(
scikit-learnなど) - パイプラインの再利用性
- ミュータブル環境構築
などの項目では組織体制に問題があった。また、チームごとでも方針も、技術選定も違っていた。結果的にインフラエンジニアが少数いるように、機械学習エンジニア、サイエンティストが少数に限られていてしまっていた。
システムアーキテクチャ
OSSによって構築される。 主に使用されているのは以下のようなOSSである。
| OSS名 | 主な機能 |
|---|---|
HDFS |
分散ファイルシステム |
Spark |
分散処理フレームワーク |
Hive |
Hadoopを置き換える目的の分散処理フレームワーク |
Samza |
ストリーム処理フレームワーク |
Cassandra |
分散NoSQL |
| その他機械学習OSS | - |
前提
一般的なデータ収集基盤などは大まかに以下の手順で構成される。
- データを収集
- データを加工する
- データを永続化する
Michelangeloのアーキテクチャ
1. データレイク
Kafkaやfluentdによってログデータなどによって、全てのデータが保存している場所である。
一般的には非構造データである。
2. 機械学習フロー
一般的な機械学習エンジン構築と同じである。
2.1 データ管理
オンラインとオフラインパイプラインに分かれている。
オンライン 低レイテンシで処理する。リアルタイム性が求められるようなもの。
オフライン バッジ処理をする。データマートを作成するためなど、要件としてはなににでも使える。
また、組織内で処理したデータを使用するためにデータを管理している。
構築図は以下の通りである。

詳細解説
- Data Lake: ここはあらゆる構造化、非構造化されたデータが保存されている場所であり、Uberは
HDFSを使用している。 - Data Prep Job: ここでは
Spark JobとしてSQLでデータを取り出して分散処理をしている。 - Hive feature store: ここは
HadoopのラッパーであるHiveに保存して、分散処理でCassandraにデータを格納している。 - Cassandra Feature Store: 組織間でデータを使用するために格納している。読み出しが非常に高速で行うことができる。
- Outcomes: Sparkでラベリングなどをした結果を保存している。
2.2 学習

学習では一般的にはオフラインで行なっている。 モデル設定はハイパーパラメータや、コンピュータリソースなで設定している。 YARNやMesosで動いているトレーニングジョブを設定できる。
2.3 モデル評価
モデルは全て保存され、Cassandraに格納される。
以下の項目が保存される。
- 誰が学習させたか
- 開始、終了時間
- モデルの設定 (features used, hyper-parameter values, etc.)
- トレーニングデータとテストデータのリファレンス/
- Distribution and relative importance of each feature
- モデルの精度
- モデルのグラフ (e.g. ROC curve, PR curve, and confusion matrix for a binary classifier)
- 学習済みのパラメータ Summary statistics for model visualization
2.4 モデルデプロイ

モデルのデプロイはどのように行なっているのかがわからないが、継続的デリバリーを行なっていると考えられる。
2.5 予測に使う

モデルがデプロイされると、HiveやCassandraなどからFeature Storeで取り出されて、予測したり、実際のトラフィックから予測したりする。
2.6 予測をモニタリングする
以下のように予測した結果もどうようにデータベースに格納してモニタリングをする。

2.7 可視化、API化
以下のように可視化して、モニタリングをしやすい環境を整えている。

データレイクとは
引用: AWS データレイク
データレイクは、規模にかかわらず、すべての構造化データと非構造化データを保存できる一元化されたリポジトリです。データをそのままの形で保存できるため、データを構造化しておく必要がありません。また、ダッシュボードや可視化、ビッグデータ処理、リアルタイム分析、機械学習など、さまざまなタイプの分析を実行し、的確な意思決定に役立てることができます。
まとめるとなんでもデータを保存している場所。