adtech studio

Seldon Coreを使った機械学習プロダクトのデプロイ

By 松崎出愛

機械学習

AILabの松崎です。
最近機械学習プロダクトの基盤構築についての情報をよく見かけますが、特にKubeflowに注目が集まっているようです。
KubeflowはKubernetesクラスタ上で機械学習プロダクトを動かすことに長けたツールキットです。
今回はKubeflowのデプロイに利用されている、Seldon Coreについて紹介します。

Seldon Coreについて

Seldon CoreSeldon社の提供するオープンソースプロダクトで、機械学習のモデルをKubernetesクラスタ上にデプロイするための基盤として作られています。

特徴としては

  • 多様な言語やフレームワークに対応している
  • 機械学習のモデルを、RESTやgRPCを介した公開ができる
  • デプロイしたモデルの継続的なアップデート、スケーリング、モニタリングなどを可能にする

などがあります。

今回はこちらの例に則って、scikit-learnでMNISTの予測モデルを作成し、それをKubernetesクラスタのAPIとして公開するところまでやってみようと思います。

必要なもの

今回はローカルにDockerを用いたKubernetesクラスタを用意し、そこに予測APIを立てます。
そのため

が必要となります。

手順概要

Seldonを用いたAPIの公開はざっくりとは以下の手順になってます。

  • 予測モデル(pklファイル)の作成
  • source-to-image(s2iコマンド)を用いた予測APIを内包したDockerイメージの作成
  • SeldonDeploymentによるデプロイ

となっています。

下準備

まずseldon-coreのリポジトリをクローンします。
次に作業ディレクトリ(名前は myModel としています)を作成します。
場所は基本的にどこでもいいですが、今回は seldon-core リポジトリに入っているスクリプトなどを使いたいので、クローンした seldon-core のリポジトリと同じ階層に作りました。

次に kubectlnamespacecluterrolebindingの設定を行います。

さらに、Helmによる操作を行うために、Helmのセットアップを行いましょう。

最後にHelmを使ってSeldon Coreをクラスタに入れて行きます。

これで準備は完了です。

予測モデル(pklファイル)の作成

まずscikit-learnによるMNISTの予測モデルを作成しましょう。
最終的な成果物としてpklファイルが生成されれば良いので、例えば こちら に含まれている学習のコードを使ってみます。

上記のスクリプトを sklearn-train.py という名前で保存して実行すると sk.pkl というモデルのファイルが作成されます。

これで学習モデルの用意ができました。

予測APIを内包したDockerイメージの作成

これを使って予測APIを内包したdocker imageを作成します。
今回は、source-to-image(以降s2i)を使ってdocker imageを作成して行きます。

seldon-coreのs2iを利用するためには、作業ディレクトリに

  • requirements.txt
  • Mnist.py
  • .s2i/environment

が必要になります。
(参照:https://github.com/SeldonIO/seldon-core/blob/master/docs/wrappers/python.md

requirements.txt

このファイルにはモデルを動かす際に必要な依存関係を書いて行きます。
今回必要な依存関係は scikit-learn のみですのでそれを書いておきます。

Mnist.py

このファイルでは作成したモデルでどのように予測のAPIを返すかを定義します。
今回は単純に、画像データの配列を受け取り、その予測を返すだけなので下のようなコードになります。

.s2i/environment

このファイルではモデルをラップするための変数を定義します。
MODEL_NAME は上記で定義したクラスの名前を入れておきます。
またAPIは今回RESTにしています。

以上でs2iの準備は完了です。
作業ディレクトリの構造は

となっています。

これらを用意した上で以下のコマンドを実行すると、

predict-mnist:0.1 というdocker imageが出来上がります。
これを利用して、予測APIのデプロイを行います。

SeldonDeploymentによるデプロイ

予測用のイメージが出来上がったので、クラスタ上にデプロイします。

まず mnist.yaml によって SeldonDeployment を定義し、
実際にAPIを動かして見ます。

mnist.yaml

SeldonDeployment というkindを用いて、予測APIのデプロイを行います。
この中で先ほど作った predict-mnist:0.1image にしてあげます。

このyamlファイルを適用しましょう。

これでデプロイが完了しました!
実際にAPIを叩いて見ます。
seldon-core/util/api_tester/api-tester.pyというランダムに0から9の画像データをPOSTしてくれるスクリプトがあるのでこちらを利用します。

すると、

のようにレスポンスが返ってきて、ndarrayの部分に予測クラス(0.0-9.0)を返してくれます。

以上でSeldon Coreによるモデルのデプロイが完了しました!

まとめ

以上のようにSeldon Coreを使うと、kubernetes上に予測モデルを内包したAPIを簡単にデプロイすることができます。

特に便利だなと感じたのはモデル作成を行なった後に予測APIを内包するDockerイメージへの変換するところです。
定義ファイルを作成すれば、コマンド一つで行えるため、APIサーバーなどについて考えるコストが0になります。
さらにSeldon CoreはTensorflowやKeras、Sparkなどに使えるため、ライブラリや言語に依存せず統一的なモデルデプロイのフローにできることに強みを感じました。

また、ここでは紹介しきれませんでしたが、 Grafanaを用いた監視ツールの構築もかなり簡単に行えます。

一方でまだプロダクトが発展途上なため、公式のドキュメントが粗かったり参考にできる文献が少ないと感じました。
そのため今後より自分たちのプロダクトに近い構成で使用してみるとともに、より良いプロダクトのアップデートを期待することとします。