内容
メルカリさんのMLプラットフォームについて
なんの知識が身につく記事になっているか?
- 日本の有名企業が使用してるMLのプラットフォームで使われている技術を知ることが可能
- MLFlowのパイプラインをローカル環境で構築/使用する方法
勉強した動機
- メルカリさんのMercari ML&Search Talk #3という記事の中でメルカリさんが使用しているプラットフォームの説明があり、世の中で使われている技術について知っておきたかったため。
- 知らない言葉がいっぱいありそうだったため
勉強した感想
- kubernetesの知識がない状態でメルカリさんのプラットフォームを構築しようとしたのは無謀だった。結果、KubeFlowのPipeLineしか触ることができなかった。
- 使用しているソフトウェアがyamlファイルで履歴管理できるものを多く使用している点に俗人性を排除しよとする意図を感じた
メルカリのMLプラットフォーム
まず、メルカリにおけるMLプラットフォームの定義は以下です。
メルカリにおけるMLプラットフォームとは、機械学習システムを構築・管理するための技術やインフラ全体を指します。
データ探索とモデルのトレーニング管理、推論を実行するためのエンドツーエンドのシステムと定義します。
メルカリさんで使用されているMLプラットフォーム例は以下です
- Kubeflow(本記事ではKubeFlowメインで解説)
- mlflow
- polyaxon
トレーニングプラットフォーム
トレーニングに用いるプラットフォームだけ本記事では紹介します、運用などに使用するソフトウェアまで勉強しきれませんでした...
上記のプラットフォーム上で以下のようなフローで学習を回しているようです
- ユーザーがKubeflow pipelineを作成
- ローカルまたはCircle CI(※1)経由でデプロイ
- チームのGCPプロジェクトからDockerイメージなどを取得
- トレーニングの結果をSlackで通知
- トレーニング終了後、モデルのパラメーターと精度をmlflowに格納
- モデルをチームのGCPプロジェクトにプッシュ
- 結果が悪い場合には再トレーニング
ここまで、メルカリの記事を読んで、自分の全く知らなかったKuberentes(k8s)とKubeFlowについて調査&環境構築をしてみたいと思います。
※1 Circle CIに関するリンク
Jenkinsと比較して設定をyamlファイルで設定できる点が大きな違いと感じた。この後、登場するKubernetesもyamlファイル管理であり、履歴管理可能な環境を選択している印象を受けた。
Kubernetes
- 読み方
- クーベネティス、クーベルネティス、クバーネティス、クバネティスなど様々
- コンテナのオーケストレーションツール
- 複数のコンテナを管理することが可能
- 複数の物理マシンに複数のコンテナが存在することが前提
- 望ましい状態を維持する
- コンテナを〇個、ボリュームを△個など
- YAMLファイルで望ましい状態を記述しておく
- 障害などでコンテナが停止したりした場合は自動で削除して生成してくれる
- もともとはGoogle社の技術だったが、GoogleがCloud Native Computing Foundation(CNCF)を立ち上げ、CNCF寄贈して開発がオープンになったことで普及が進む.
- Kubernetesは現在CNCFにより策定された規格でOSS
- CNCF自身もKubernetesを開発しているがサードパーティ製のKubernetesも多く存在している
- AWS,Azureなどのクラウドサービスではクラウド用にカスタマイズされたKubernetesサービスを提供
- Kubernetesの構成
- クラスター
- マスターノードから成る「コントロールプレーン」と、実際にコンテナ稼働するワーカーノードから成る「データプレーン」から構成されるKubernetesシステムのこと
- マスターノード
- etcd
- 状態管理のため
- 必要なサービスやPodの情報が記述されている
- マスタノード側で記述されているだけの状態をオブジェクトといい、実際に実行され生成されたものをインスタンスという
- 状態管理のため
- kube-scheduler
- どのノードで Pod を動かすかをコントロールするため
- kube-apiserver
- kubectlからの命令をうけとって操作を実行する
- etcd
- ワーカーノード
- コンテナエンジン
- dockerなど
- コンテナエンジン
- マスターノード
- マスターノードから成る「コントロールプレーン」と、実際にコンテナ稼働するワーカーノードから成る「データプレーン」から構成されるKubernetesシステムのこと
- pod
- コンテナとVolumeがセットになった1まとまりのこと
- AWS の EC2 インスタンスなど
図の出典:AWS
- クラスター
ワーカーノード側の詳細な図が以下
- Searvice
- 外部からのアクセスを自動で捌いてくれるオブジェクト
- Podをまとめて管理してくれており、外部からはサービスのIPアドレス(ClisterIP)にアクセスすればサービスが管理するPodのアドレスはきにする必要がない
- 物理マシンをまたいでPodを管理することも可能
- 外部からのアクセスを自動で捌いてくれるオブジェクト
- ReplicaSet
- Podの数を管理
- Deployment
- Podのデプロイ(配置や実行)を行う
- Podで何のImageを使うかなどの情報をもっている
- Podのデプロイ(配置や実行)を行う
KubeFlow
- Kubeflowは機械学習パイプライン(データ抽出、特徴量エンジニアリング、モデル学習、モデルデプロイ)をK8s環境で実行するためのツール
- KubeFlowの各コンポーネントはKubernetess上で動作する
- KubernetessのAPIを使用しPodなどを操作するため
- 元々はGoogle社内で使用されていたものを社外に向けて一般化してオープンにしたもの
- KubeFlowの各コンポーネントはKubernetess上で動作する
- 様々なComponentがある
- Notebook ServersではJupyter Notebookが使用できる
- PipeLineで一連の処理を行える
Pipelines
-
Pipelines
-
Run
-
Experiment
- Runした結果を確認することができる
- Stepごとの結果も確認可能
- どのStepに問題があるかなどもわかる
- Stepごとの結果も確認可能
- Runした結果を確認することができる
数字を表示するだけのパイプラインの例↓。出力結果なども確認可能
- 自作パイプラインの作成手順
-
コンポーネントを作成する(python環境上での操作)
-
パイプライン化 する方法(python環境上での操作)
-
パイプラインファイルをKubeFlowにアップロードする方法
kubeflowとkubernetes
Pipleineの各StepごとにPodが生成され実行される。
図の出典:ubuntu
yamlファイルをアップロードするとArgoのWorkflowのInstanceがK8aのAPIを操作し、Podの操作を行う
(Argo Workflowもyamlファイルでワークフローを定義する)
ローカル環境にk8s環境とkubeFlow PipeLine環境を構築する手順
いろいろあり、DashBordはあきらめ、PipeLine環境だけを構築しました。
環境構築方法① GKE(Google Kubernetes Engine)上にKubeFlowをInstallする方法
GCPの無料枠が$300であり、KubeFlow環境を構築するには無料枠では足りないとの記載があったため断念しました。
個別で環境を構築するより、この方法が断然簡単だとは思います。
他にもAWS上での構築方法などが公式HPに載っています。
方法② Docker上で構築する方法
私はこの方法で行いました。
まず、Docker DesktopのKubernetesを有効化します。
ローカルにkubectlコマンドがInstallされます。また、Docker Desktop起動時にKubernetesコンテナが起動するようになります。
次に、PipelineのInstallを参考に、KubeFlowをInstallします。リンクの内以下のスクショ部分だけを実行します。
KubernetesのEngineの上にKubeFlowを構築します。
kubectl applyにより以下のyamlファイルに記述されているオブジェクトを生成しています。いろいろ生成しています。
ml-pipline-uiのサービスが動作していることが分かります
Port-forwardでローカルホストの8080でuiのPodにアクセスできるように指定します
これでLocalhostの8080でKubeflowのPipeLineにアクセスできるようになります。
構築失敗例
-
- 2個くらいissueが存在するが、issueによりうまく構築できなかった。
KubeFlowのバージョンが古くうまくいかなかった模様。Docker DesktopのK8sもver.1.22以上だとうまくいかないので注意が必要。
- 2個くらいissueが存在するが、issueによりうまく構築できなかった。
-
Linux環境のコンテナにminikubeとKubeflowを構築する方法
カーネルの中にvirualboxが必要とするヘッダーが含まれていないという事らしい。厳密には、カーネルと完全に同一バージョンのヘッダーパッケージが入っている必要があるという事のようです
VBが必要としているのは↓