Kekeの日記

エンジニア、読書なんでも

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

f:id:bobchan1915:20180816105817j:plain

自己紹介

  • 最近Apache HadoopCassandraApache Kafkafluendを使ってサービス構築をしている。
  • 得意な言語はgolangjavascript
  • 好きなライブラリ、フレームワークはgolang echoVue.js
  • 開発経験分野: サーバーサイド、フロントエンド、ロボット、iOSアプリ、インフラ
  • 好きなサービスはGCP Cloud BuildSpinnakerKubernetes

本記事の対象者

  • Machine learning as a Service(MLaaS)に興味がある人
  • ビッグデータのインフラ構築に興味があるひと

Uber Michelangeloとは

2015年半ばから始まったプロジェクト。

Uberが開発している社内機械学習プラットフォームのことである。 主にUberの交通予測に使われていて、Uber Eatsだとお届け時間を予測したりしている。

f:id:bobchan1915:20180908233446p:plain

またその自動でプロダクションコンテナへデプロイを可能にして、ワークフローをend-2-endなシステムで完結させ、チーム間や組織内で利用できるようにする仕組みである。

Michelangelo開発のきっかけ

継続的デプロイなどの背景にある原因が機械学習モデルにも同様に見られたからです。

以下のような

  • ビルド
  • デプロイ
  • ツールの多様化(scikit-learnなど)
  • パイプラインの再利用性
  • ミュータブル環境構築

などの項目では組織体制に問題があった。また、チームごとでも方針も、技術選定も違っていた。結果的にインフラエンジニアが少数いるように、機械学習エンジニア、サイエンティストが少数に限られていてしまっていた。

システムアーキテクチャ

OSSによって構築される。 主に使用されているのは以下のようなOSSである。

OSS名 主な機能
HDFS 分散ファイルシステム
Spark 分散処理フレームワーク
Hive Hadoopを置き換える目的の分散処理フレームワーク
Samza ストリーム処理フレームワーク
Cassandra 分散NoSQL
その他機械学習OSS -

前提

一般的なデータ収集基盤などは大まかに以下の手順で構成される。

  1. データを収集
  2. データを加工する
  3. データを永続化する

Michelangeloのアーキテクチャ

1. データレイク

Kafkafluentdによってログデータなどによって、全てのデータが保存している場所である。

一般的には非構造データである。

2. 機械学習フロー

一般的な機械学習エンジン構築と同じである。

2.1 データ管理

オンラインとオフラインパイプラインに分かれている。

オンライン 低レイテンシで処理する。リアルタイム性が求められるようなもの。

オフライン バッジ処理をする。データマートを作成するためなど、要件としてはなににでも使える。

また、組織内で処理したデータを使用するためにデータを管理している。

構築図は以下の通りである。

f:id:bobchan1915:20180801021725p:plain

詳細解説

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

2.2 学習

f:id:bobchan1915:20180908232921p:plain

学習では一般的にはオフラインで行なっている。 モデル設定はハイパーパラメータや、コンピュータリソースなで設定している。 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 モデルデプロイ

f:id:bobchan1915:20180908233001p:plain

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

2.5 予測に使う

f:id:bobchan1915:20180908233016p:plain

モデルがデプロイされると、HiveやCassandraなどからFeature Storeで取り出されて、予測したり、実際のトラフィックから予測したりする。

2.6 予測をモニタリングする

以下のように予測した結果もどうようにデータベースに格納してモニタリングをする。

f:id:bobchan1915:20180908233103p:plain

2.7 可視化、API化

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

f:id:bobchan1915:20180908233416p:plain

データレイクとは

引用: AWS データレイク

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

まとめるとなんでもデータを保存している場所

参考文献

eng.uber.com