LoginSignup
1

More than 1 year has passed since last update.

メルカリの機械学習環境を勉強してみた

Last updated at Posted at 2022-08-21

内容

メルカリさんのMLプラットフォームについて

なんの知識が身につく記事になっているか?

  • 日本の有名企業が使用してるMLのプラットフォームで使われている技術を知ることが可能
  • MLFlowのパイプラインをローカル環境で構築/使用する方法

勉強した動機

  • メルカリさんのMercari ML&Search Talk #3という記事の中でメルカリさんが使用しているプラットフォームの説明があり、世の中で使われている技術について知っておきたかったため。
  • 知らない言葉がいっぱいありそうだったため

勉強した感想

  • kubernetesの知識がない状態でメルカリさんのプラットフォームを構築しようとしたのは無謀だった。結果、KubeFlowのPipeLineしか触ることができなかった。
  • 使用しているソフトウェアがyamlファイルで履歴管理できるものを多く使用している点に俗人性を排除しよとする意図を感じた

メルカリのMLプラットフォーム

まず、メルカリにおけるMLプラットフォームの定義は以下です。

メルカリにおけるMLプラットフォームとは、機械学習システムを構築・管理するための技術やインフラ全体を指します。
データ探索とモデルのトレーニング管理、推論を実行するためのエンドツーエンドのシステムと定義します。

メルカリさんで使用されているMLプラットフォーム例は以下です

  • Kubeflow(本記事ではKubeFlowメインで解説)
  • mlflow
  • polyaxon

image.png

トレーニングプラットフォーム

トレーニングに用いるプラットフォームだけ本記事では紹介します、運用などに使用するソフトウェアまで勉強しきれませんでした...
image.png
image.png

上記のプラットフォーム上で以下のようなフローで学習を回しているようです

  1. ユーザーがKubeflow pipelineを作成
  2. ローカルまたはCircle CI(※1)経由でデプロイ
  3. チームのGCPプロジェクトからDockerイメージなどを取得
  4. トレーニングの結果をSlackで通知
  5. トレーニング終了後、モデルのパラメーターと精度をmlflowに格納
  6. モデルをチームのGCPプロジェクトにプッシュ
  7. 結果が悪い場合には再トレーニング
    image.png

ここまで、メルカリの記事を読んで、自分の全く知らなかった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サービスを提供

image.image.png png

  • Kubernetesの構成
    • クラスター
      • マスターノードから成る「コントロールプレーン」と、実際にコンテナ稼働するワーカーノードから成る「データプレーン」から構成されるKubernetesシステムのこと
        • マスターノード
          • etcd
            • 状態管理のため
              • 必要なサービスやPodの情報が記述されている
              • マスタノード側で記述されているだけの状態をオブジェクトといい、実際に実行され生成されたものをインスタンスという
          • kube-scheduler
            • どのノードで Pod を動かすかをコントロールするため
          • kube-apiserver
            • kubectlからの命令をうけとって操作を実行する
        • ワーカーノード
          • コンテナエンジン
            • dockerなど
    • pod
      • コンテナとVolumeがセットになった1まとまりのこと
      • AWS の EC2 インスタンスなど
        image.png
        図の出典:AWS

ワーカーノード側の詳細な図が以下

  • Searvice
    • 外部からのアクセスを自動で捌いてくれるオブジェクト
      • Podをまとめて管理してくれており、外部からはサービスのIPアドレス(ClisterIP)にアクセスすればサービスが管理するPodのアドレスはきにする必要がない
      • 物理マシンをまたいでPodを管理することも可能
  • ReplicaSet
    • Podの数を管理
  • Deployment
    • Podのデプロイ(配置や実行)を行う
      • Podで何のImageを使うかなどの情報をもっている

image.png
図の出典:Basicinc エンジニアブログ

KubeFlow

  • Kubeflowは機械学習パイプライン(データ抽出、特徴量エンジニアリング、モデル学習、モデルデプロイ)をK8s環境で実行するためのツール
    • KubeFlowの各コンポーネントはKubernetess上で動作する
      • KubernetessのAPIを使用しPodなどを操作するため
    • 元々はGoogle社内で使用されていたものを社外に向けて一般化してオープンにしたもの
  • 様々なComponentがある
    image.png
    • Notebook ServersではJupyter Notebookが使用できる
    • PipeLineで一連の処理を行える

Pipelines

  • Pipelines

    • どのような処理を行っていくかが可視化されている
    • 自作したパイプラインをアップロードすることも可能(YAMLファイル)
      image.png
  • Run

    • 作成したPipeLineを選択し実行するとパイプラインが実行される
    • 実行時の引数などをGUI上から入力することも可能
    • 今どのStepが実行されているかなどもわかる
      image.png
  • Experiment

    • Runした結果を確認することができる
      • Stepごとの結果も確認可能
        • どのStepに問題があるかなどもわかる

image.png
image.png
数字を表示するだけのパイプラインの例↓。出力結果なども確認可能
image.png
image.png

  • 自作パイプラインの作成手順
    • 参考

    • コンポーネントを作成する(python環境上での操作)

      • コンポーネントは2種類存在する
        • 既存のコンポーネントを使用する場合

          • Kfp.component.load_from_url(コンポーネントのパス)と記述する
            コンポーネントのパスに存在するコンポーネント(再利用したい実装)を取得できる
            image.png
        • 自作関数をコンポーネント化する場合

          • kfp.components.create_component_from_funcと記述する
          • 関数を実装したpythonの関数をfunc=の引数とする
            image.png
            image.png
    • パイプライン化 する方法(python環境上での操作)

      • 先ほど生成したコンポーネントをパイプラインとして定義した関数を作成する
        image.png
    • パイプラインファイルをKubeFlowにアップロードする方法

      • 自作したpiplineファイルをコンパイルする(python環境上での操作)
        image.png
      • pipeline.yamlファイルが生成されるのでGUI上でアップロードする

kubeflowとkubernetes

Pipleineの各StepごとにPodが生成され実行される。
image.png
図の出典:ubuntu

yamlファイルをアップロードするとArgoのWorkflowのInstanceがK8aのAPIを操作し、Podの操作を行う
(Argo Workflowもyamlファイルでワークフローを定義する)
image.png

ローカル環境にk8s環境とkubeFlow PipeLine環境を構築する手順

いろいろあり、DashBordはあきらめ、PipeLine環境だけを構築しました。

環境構築方法① GKE(Google Kubernetes Engine)上にKubeFlowをInstallする方法

GCPの無料枠が$300であり、KubeFlow環境を構築するには無料枠では足りないとの記載があったため断念しました。
image.png

個別で環境を構築するより、この方法が断然簡単だとは思います。
他にもAWS上での構築方法などが公式HPに載っています。

方法② Docker上で構築する方法

私はこの方法で行いました。

まず、Docker DesktopのKubernetesを有効化します。
ローカルにkubectlコマンドがInstallされます。また、Docker Desktop起動時にKubernetesコンテナが起動するようになります。
image.png

次に、PipelineのInstallを参考に、KubeFlowをInstallします。リンクの内以下のスクショ部分だけを実行します。
KubernetesのEngineの上にKubeFlowを構築します。
image.png

kubectl applyにより以下のyamlファイルに記述されているオブジェクトを生成しています。いろいろ生成しています。
image.png

ml-pipline-uiのサービスが動作していることが分かります
image.png

Port-forwardでローカルホストの8080でuiのPodにアクセスできるように指定します
image.png

これでLocalhostの8080でKubeflowのPipeLineにアクセスできるようになります。
image.png

構築失敗例

  • Minikubeをつかった構築

    • 2個くらいissueが存在するが、issueによりうまく構築できなかった。
      KubeFlowのバージョンが古くうまくいかなかった模様。Docker DesktopのK8sもver.1.22以上だとうまくいかないので注意が必要。
      image.png
  • Linux環境のコンテナにminikubeとKubeflowを構築する方法

    • VM(仮想環境)上にMinikubeを構築しないと正常に動作しない模様。なんだか面倒臭そうだったので諦め。
      image.png

カーネルの中にvirualboxが必要とするヘッダーが含まれていないという事らしい。厳密には、カーネルと完全に同一バージョンのヘッダーパッケージが入っている必要があるという事のようです
VBが必要としているのは↓
image.png

現在のコンテナに入っているのが↓で足りていない模様。
image.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1