Waton OpenScale でカスタム機械学習モデルをモニタリングする

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/#/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/8f0113cd-1dd9-ed0f-8286-28f389574398.png)

- /v1/deployment
    - デプロイされたモデルの詳細をリストで返すエンドポイントです。OpenScaleでモニタリングの対象を選択する際に、内部的にはOpenScaleからこのエンドポイントが呼ばれているようです。
- /v1/deployments/{deployment_id}/online
    - 入力データに対してスコアリング結果を返すエンドポイントです。OpenScaleがサポートする入出力フォーマットで構成する必要があります。

業務アプリケーションからスコアリング・エンドポイントに対して入力が送信されると、モデルによる予測結果が返ります。入力と予測結果を合わせて、OpenScaleが提供するペイロード・ロギング・エンドポイントに送信すると、OpenScale内部のDBに保管され、バイアスやドリフトの算出のために使用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/955bd743-0368-33be-ecad-a4f0b174bb63.png)


# カスタム機械学習モデルの作成

上記の要件を満たすカスタム機械学習モデルを、今回はKubernetes上で稼働するアプリとして構成します。[こちら](https://github.com/pmservice/ai-openscale-tutorials/tree/master/applications/custom-ml-engine-containers)で公開しているものをベースにシンプルな実装にしたものを以下に公開しています。

https://github.com/schiyoda/custom-ml-engine

今回はIBM CloudのKubernetes Serviceで以下の手順で実行可能です。（KubernetesやContainer Registry等は構成済みの前提）

#### ローカルで稼働確認 

```console
$ 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/`で起動します。以下ようにサンプルを実行し、結果が返ってくることを確認します。

```console
$ 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`を修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/1694a623-9189-26fc-529b-131fdde2783a.png)

### Dockerイメージの作成
```console
$ docker build -f Dockerfile -t custom-ml-engine:1 .
```
以下コマンドでDockerイメージを起動します。

```
$ docker run --name customml -p 5000:5000 -td custom-ml-engine:1
765d0c099c3ed028f7dac689703d05f9b09ccfdd7a806128bb6932f111195161
```

先ほどと同様、サンプルを実行し、稼働確認します。

```console
$ python examples/score_credit.py 
```

#### Kubernetesで実行
IBM Cloudにログイン

```console
$ ibmcloud login -a https://cloud.ibm.com
```

Container Registryのnamespace作成

```console
$ ibmcloud cr namespace-add sc_cr
```

CLIにログイン

```console
$ ibmcloud cr login
```

Dockerイメージにタグ付け

```console
$ docker tag custom-ml-engine:1 us.icr.io/sc_cr/custom-ml-engine:1
```

DockerイメージをContainer RegistryにPush

```console
$ docker push us.icr.io/sc_cr/custom-ml-engine:1
```

登録の確認

```console
$ ibmcloud cr image-list
イメージをリストしています...

リポジトリー                       タグ   ダイジェスト   名前空間   作成日        サイズ   セキュリティー状況   
us.icr.io/sc_cr/custom-ml-engine   1      477d54cb80a4   sc_cr      3 hours ago   201 MB   問題なし   

OK
```

Kubernetesクラスターに接続

```console
$ ibmcloud ks cluster config --cluster CustomMLEngine
```

デプロイメントの作成

```console
$ kubectl create deployment custom-ml-engine-deployment --image=us.icr.io/sc_cr/custom-ml-engine:1
```

サービスの作成（アプリケーションの公開）

```console
$ kubectl create -f service.yaml
```

IPアドレス、ポートの確認

```console
$ kubectl describe service custom-ml-engine-service
$ ibmcloud ks workers --cluster CustomMLEngine
```

# OpenScaleでモニタリングの構成

機械学習プロバイダーの構成で、「カスタム環境」を選択し、KebernetesのAPIエンドポイントを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/9f022f11-ccd4-2416-c174-c72b036fece0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/41e72f1d-c9cb-69f9-6ccb-d4bbc6ec854a.png)

デプロイメントの選択から、構成したカスタム機械学習モデルがリストされるので、こちらを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/873167e7-5d22-f4fe-1319-8007b9a15425.png)

以降は通常のOpenScaleの手順で構成が可能です。