OpenScaleは機械学習モデルの精度やバイアス、ドリフトをモニタリングする製品ですが、IBM製品のWatson Machine Learning上で稼働する機械学習モデルだけでなく、AWS、Azure上で稼働するモデルの他、カスタム機械学習モデルもサポートしています。
- サポートされる機械学習エンジン、フレームワーク、およびモデル
- https://cloud.ibm.com/docs/ai-openscale?topic=ai-openscale-in-ov
本記事ではカスタム機械学習モデルのモニタリングについて紹介します。
カスタム機械学習モデルの要件
カスタム機械学習モデルは以下リンク先にある2つのREST APIエンドポイントを公開する必要があります。
https://aiopenscale-custom-deployement-spec.mybluemix.net/#/
- /v1/deployment
- デプロイされたモデルの詳細をリストで返すエンドポイントです。OpenScaleでモニタリングの対象を選択する際に、内部的にはOpenScaleからこのエンドポイントが呼ばれているようです。
- /v1/deployments/{deployment_id}/online
- 入力データに対してスコアリング結果を返すエンドポイントです。OpenScaleがサポートする入出力フォーマットで構成する必要があります。
業務アプリケーションからスコアリング・エンドポイントに対して入力が送信されると、モデルによる予測結果が返ります。入力と予測結果を合わせて、OpenScaleが提供するペイロード・ロギング・エンドポイントに送信すると、OpenScale内部のDBに保管され、バイアスやドリフトの算出のために使用されます。
カスタム機械学習モデルの作成
上記の要件を満たすカスタム機械学習モデルを、今回はKubernetes上で稼働するアプリとして構成します。こちらで公開しているものをベースにシンプルな実装にしたものを以下に公開しています。
今回はIBM CloudのKubernetes Serviceで以下の手順で実行可能です。(KubernetesやContainer Registry等は構成済みの前提)
ローカルで稼働確認
$ https://github.com/schiyoda/custom-ml-engine.git
$ cd custom-ml-engine
$ pip install -r requirements.txt
$ python run_server.py
アプリケーションがhttp://0.0.0.0:5000/
で起動します。以下ようにサンプルを実行し、結果が返ってくることを確認します。
$ python examples/score_credit.py
******************************************
Prepare scoring payload ...
Score the model ...
Return predictions ...
{'fields': ['prediction', 'probability'], 'labels': ['Risk', 'No Risk'], 'values': [['No Risk', [0.8823126094462725, 0.1176873905537274]], ['No Risk', [0.6755090846150376, 0.3244909153849625]], ['No Risk', [0.8944991421537971, 0.10550085784620292]], ['No Risk', [0.9297263621482206, 0.07027363785177945]]]}
******************************************
IPアドレスの変更
IBM CloudのコンソールでWorker NodeのPublic IPを確認し、run_server.pyのPUBLIC_IP
を修正します。
Dockerイメージの作成
$ docker build -f Dockerfile -t custom-ml-engine:1 .
以下コマンドでDockerイメージを起動します。
$ docker run --name customml -p 5000:5000 -td custom-ml-engine:1
765d0c099c3ed028f7dac689703d05f9b09ccfdd7a806128bb6932f111195161
先ほどと同様、サンプルを実行し、稼働確認します。
$ python examples/score_credit.py
Kubernetesで実行
IBM Cloudにログイン
$ ibmcloud login -a https://cloud.ibm.com
Container Registryのnamespace作成
$ ibmcloud cr namespace-add sc_cr
CLIにログイン
$ ibmcloud cr login
Dockerイメージにタグ付け
$ docker tag custom-ml-engine:1 us.icr.io/sc_cr/custom-ml-engine:1
DockerイメージをContainer RegistryにPush
$ docker push us.icr.io/sc_cr/custom-ml-engine:1
登録の確認
$ ibmcloud cr image-list
イメージをリストしています...
リポジトリー タグ ダイジェスト 名前空間 作成日 サイズ セキュリティー状況
us.icr.io/sc_cr/custom-ml-engine 1 477d54cb80a4 sc_cr 3 hours ago 201 MB 問題なし
OK
Kubernetesクラスターに接続
$ ibmcloud ks cluster config --cluster CustomMLEngine
デプロイメントの作成
$ kubectl create deployment custom-ml-engine-deployment --image=us.icr.io/sc_cr/custom-ml-engine:1
サービスの作成(アプリケーションの公開)
$ kubectl create -f service.yaml
IPアドレス、ポートの確認
$ kubectl describe service custom-ml-engine-service
$ ibmcloud ks workers --cluster CustomMLEngine
OpenScaleでモニタリングの構成
機械学習プロバイダーの構成で、「カスタム環境」を選択し、KebernetesのAPIエンドポイントを指定します。
デプロイメントの選択から、構成したカスタム機械学習モデルがリストされるので、こちらを選択します。
以降は通常のOpenScaleの手順で構成が可能です。