CP4DaaSのプロジェクトにONNX形式のモデルをインポートする

## 目次
[1.はじめに](#1-はじめに)
[2.ONNXモデルをプロジェクトに資産として保存する](#2-onnxモデルをプロジェクトに資産として保存する)
[3.作成したONNXモデルを別プロジェクトに資産としてインポートする](#3-作成したonnxモデルを別プロジェクトに資産としてインポートする)
[4.インポートしたモデルに対してスコアリングを実行する](#4-インポートしたモデルに対してスコアリングを実行する)
[5.おわりに](#5-おわりに)

## 1. はじめに
本記事では、IBM Cloud上で提供される Cloud Pak for Data as a Service（以降CP4DaaSと表記）において、ONNX形式のモデルをプロジェクト資産として登録する方法についてご紹介します。


## 2. ONNXモデルをプロジェクトに資産として保存する
CP4DaaS上においてNotebookで機械学習モデルを作成し、その作成したモデルをプロジェクトに資産として保存する方法についてご紹介します。

今回は、NotebookでLightGBMのモデルを作成したケースです。LightGBMのモデルをCP4DaaSに直接保存することはできませんが、ONNX形式へ変換することで保存・デプロイが可能です。

LightGBMモデルの作成とONNX形式への変換については、IBMが提供している[こちらのサンプルノートブック](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/fa4204ef-a9bc-4869-9e5c-756e25fb3235?context=cpdaas)をもとに行います。

https://dataplatform.cloud.ibm.com/exchange/public/entry/view/fa4204ef-a9bc-4869-9e5c-756e25fb3235?context=cpdaas

前提として、Notebookの先頭にプロジェクト・トークンを挿入しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/cfcc3921-703b-4540-91d1-de107b2ac0e7.png)

### 2-1.LightGBMのモデルを作成する
LightGBMモデルを作成し、トレーニングします。
まずサンプルデータ（Irisデータセット）を読み込み、訓練用とテスト用に分割します。
```python
iris = datasets.load_iris()
x, y = iris.data, iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=42)
```

そしてIrisデータを使ってLightGBMモデルをトレーニングします。
```python
model = LGBMClassifier(objective='multiclass')
model.fit(x_train, y_train)
```
最後にトレーニング済みのモデルに対し、テストデータの一部を使って予測を実行します。
```python
eval_data = x_test[:3]
model.predict(eval_data)
```

### 2-2.モデルをONNX形式に変換する
そしてここからは、LightGBMモデルを作成した後の手順です。
まず必要なライブラリを読み込みます。
```python
import json
import getpass
import onnx
import onnxruntime as ort
from ibm_watsonx_ai import APIClient, Credentials
from lightgbm import LGBMClassifier
from onnxmltools import convert_lightgbm
from onnxmltools.utils import save_model
from skl2onnx.common.data_types import FloatTensorType
from sklearn import datasets
from sklearn.model_selection import train_test_split
```

つぎに、モデルをONNX形式に変換します。
```python
initial_types = [("float_input", FloatTensorType([None, best_model.n_features_]))]
onnx_model = convert_lightgbm(model=best_model, initial_types=initial_types, zipmap=False, target_opset=9)
```

### 2-3.ONNX形式のモデルをプロジェクトに保存する
そして、プロジェクトのデータ資産へモデルを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/3e488aaa-730a-4130-81f6-8da394f1167f.png)

```python
onnx_model_filename = f"任意のファイル名.onnx"
save_model(onnx_model, onnx_model_filename)
wslib.upload_file(onnx_model_filename, overwrite=True)
```
上記のセルを実行すると、プロジェクトに.onnxのファイルが資産として保存されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/02986641-5d65-4655-a644-b8975e7f9823.png)

続いては、プロジェクト資産に機械学習モデルを追加します。
まずはwatsonx.ai Runtime レポジトリに保存するためにモデルをzip化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/ada68c75-0309-41e6-850f-215855561d17.png)

```python
onnx_model_zip = "任意のファイル名.zip"
```
```python
!zip {onnx_model_zip} {onnx_model_filename}
```


つぎに、現在サポートされるONNX形式用のソフトウェア仕様を確認し、指定します。サポートされるバージョンは随時更新されるため、都度確認が必要です。
[こちらの公式ドキュメント](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html?locale=ja&context=wx)よりご確認いただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/5f9f2415-e32e-442f-bae4-986459050a9c.png)
今回はモデルタイプ：onnxruntime_1.16、ソフトウェア仕様：onnxruntime_opset_19を指定します。


```python
sofware_spec_id = watsonx_ai_client.software_specifications.get_id_by_name("onnxruntime_opset_19")
model_type = "onnxruntime_1.16"
```

そして、watsonx.ai Runtime レポジトリにモデルを保存します。
```python
model_props = {
    watsonx_ai_client.repository.ModelMetaNames.NAME: '任意のモデル名_onnx',
    watsonx_ai_client.repository.ModelMetaNames.TYPE: 'onnxruntime_1.16',
    watsonx_ai_client.repository.ModelMetaNames.SOFTWARE_SPEC_ID: sofware_spec_id,
    
published_model_details = watsonx_ai_client.repository.store_model(
    model=任意のファイル名_zip,
    meta_props=model_props,
)
```
上記のセルを実行すると、プロジェクトに機械学習モデルが資産として保存されます。
![スクリーンショット 2025-06-10 170521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/326bcd5d-401f-4efd-83f3-abd6d1492d01.png)

ちなみに、この「機械学習モデル」の資産はローカルに保存することができず、「カタログに公開」または「スペースへのプロモート」しか選択できません。
![スクリーンショット 2025-06-10 170737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/5115b6eb-873b-4b68-9ded-e5b472243433.png)

一方で、.onnxのデータ資産のファイルは「ダウンロード」からローカルに保存することができます。![スクリーンショット 2025-06-10 171003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/ca059ae9-4ade-478d-a1a0-a3ade2993329.png)

この通り、lgbm_model.onnxのファイルをローカルにダウンロードすることができました。
![スクリーンショット 2025-06-10 171206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/97bbc837-63cf-45b9-8a56-2c8a6f7e6255.png)

<a id="anchor3"></a>
## 3. 作成したONNXモデルを別プロジェクトに資産としてインポートする
ローカル上にあるONNX形式のモデルを、CP4DaaSのプロジェクトにインポートしていきます。

プロジェクトの資産の画面で、「資産のインポート」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/11a71b4c-ffa4-45d0-b144-ca6ee06afaef.png)

資産タイプは「モデル」を選択し、「ローカル・ファイル」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/8abff5ef-e945-41a6-b5ac-ac2360dfa107.png)

このとき、インポートしたいモデルファイルはZIP形式にしておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/3abbf87b-e5de-4f97-b9e4-92271ca88503.png)

ZIP化されたモデルファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/9b92be7b-ee7e-4798-9d80-e107fae35006.png)

「名前」の欄に任意の名前を入力し、「モデル・タイプ」の欄でモデル・タイプを選択します。このとき、アップロードしたモデルファイルに基づくモデル・タイプが自動で提示されるため、ユーザー自身で値を選択する必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/85c98fda-4dbe-44db-b2f2-c109f2c1142e.png)

最後に「追加」を押下すると、プロジェクトにモデルがインポートされます。
プロジェクトの画面にはこのようにモデルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/bee12c6b-cf2f-4654-8e04-b4505866cc8f.png)


## 4. インポートしたモデルに対してスコアリングを実行する
インポートしたモデルをデプロイし、スコアリングを実行していきます。

まずはプロジェクト内にある機械学習モデルを、スペースにプロモートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/29bb0a34-091c-4e72-a925-8a868d55e3c6.png)

プロモートするデプロイメントスペースを選択し、右下の青い「プロモート」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/8ce348c5-fd42-4843-9799-800bf5ca618d.png)

デプロイメントスペースの資産に機械学習モデルが追加されます。「デプロイ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/9f139965-6b78-4175-a8d1-9af634e6f275.png)

デプロイメント・タイプが選択できます。今回はオンラインデプロイメントを作成したいため、「オンライン」を選択します。
そして「名前」の欄に任意の名前を入力し、右下の青い「作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/a6a45146-83dd-4db4-b418-72963753835a.png)

オンラインデプロイメントが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/acfd61db-1f8f-498e-8061-bab7220f8362.png)

作成したデプロイメントの詳細画面を開き、「テスト」タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/949a40ef-f484-4ae5-91f6-9d1b92b8b6e3.png)

この画面からスコアリングを実行することができます。
JSONの欄に手動でJSON形式のデータを入力し、右下の青い「予測」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/840d8308-b8b7-4203-8fc0-f68066b25ecc.png)

今回使用したデータは以下です。
```json
{
  "input_data": [
    {
      "fields": ["feature1", "feature2", "feature3", "feature4"],
      "values": [
        [5.1, 3.5, 1.4, 0.2],
        [6.2, 2.9, 4.3, 1.3]
      ]
    }
  ]
}
```
すると、予測結果がこのような画面で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4092447/f84b05ce-06ef-40c9-b699-0da9322ec543.png)

今回の予測結果は以下の通りです。
```json
[
	{
		"id": "label",
		"values": [
			0,
			1
		]
	},
	{
		"id": "probabilities",
		"values": [
			[
				0.9999876022338867,
				0.000011821748557849787,
				6.486750976364419e-7
			],
			[
				0.00001045464159687981,
				0.9996751546859741,
				0.00031440649763680995
			]
		]
	}
]
```

以上でスコアリング実行は完了です。

## 5. おわりに

本記事では、CP4DaaSのプロジェクトにONNX形式のモデルをインポートする方法についてご紹介しました。
CP4DaaSにおけるONNXモデルのデプロイの詳細については、以下の公式ドキュメントを参照ください。


**「ONNX形式に変換されたモデルの展開」**[（https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-onnx-overview.html?locale=ja&context=cpdaas&audience=wdp）](https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-onnx-overview.html?locale=ja&context=cpdaas&audience=wdp)