このトピックでは、モデルの作成、アップロード、評価、および推論の構文とパラメーターについて説明し、これらの操作について例を挙げて説明します。
概要
内蔵モデル
PolarDB for AIは、Tongyi Qianwenという組み込みの機械学習モデルを提供します。 モデルで提供されるPolarDB for AI機能を使用できます。追加のモデル設定は必要ありません。
詳細については、次のトピックをご参照ください。
カスタムモデル
実際のビジネスシナリオでは、アルゴリズムを最適化し、モデルの構造を調整する必要があります。 組み込みモデルは、実際のビジネス要件を満たさない場合があります。 PolarDB for AIを使用すると、カスタムモデルを構築し、機密コンテナーでモデルを実行できます。 これにより、モデルのデータセキュリティがさらに確保されます。
カスタムモデルを構築して使用するには、次の手順を実行します。
外部トレーニングモデル
PolarDB for AIが提供するMLOps機能を使用すると、外部でトレーニングされたモデルをアップロード、デプロイ、および使用できます。 sklearnベースのLightGBMおよびGBDT、TensorFlowまたはPyTorchフレームワークに基づく深層学習アルゴリズムなど、さまざまな外部モデルがサポートされています。
外部モデルを使用するには、次の手順を実行します。
モデルの作成
このセクションでは、モデルを作成する方法について説明します。 モデルは非同期的に訓練されます。 モデルがトレーニング済みかどうかを確認するには、モデルのステータスを照会します。
構文
CREATE MODEL model_name WITH ( model_class = '', x_cols = '', y_cols='',model_parameter=()) AS (SELECT select_expr [, select_expr] ... FROM table_reference)
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
model_class | モデルのタイプ。 有効な値:
|
x_cols | モデルトレーニングの入力列。 説明 複数の列の名前はコンマ (,) で区切ります。 |
y_cols | モデルトレーニングの出力列。 |
model_parameter | モデルトレーニングのパラメータ。
|
select_expr | 列の名前。 |
table_reference | テーブルの名前。 |
例
airlines_gbm
という名前のモデルを作成します。
/*polar4ai*/CREATE MODEL airlines_gbm WITH (model_class='lightgbm', x_cols ='Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length', y_cols='Delay',model_parameter=(boosting_type='gbdt', n_estimators=100, max_depth=8, num_leaves=256)) as (SELECT * FROM db4ai.airlines_train)
サンプル結果:
Query OK, 0 rows affected (0.79 sec)
モデルのアップロード
このセクションでは、外部でトレーニングされた機械学習モデルをPolarDB for AIにアップロードし、プラットフォームを使用してモデルを管理する方法について説明します。 のPolarDB for AIは、PMML、ONNX、およびチェックポイント (TensorFlowおよびPyTorchプラットフォームに適用可能) モデル形式をサポートしています。
構文
UPLOAD MODEL model_name WITH (model_location = '', req_location = '')
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
model_location | モデルのファイルパス。 |
req_location | モデルが依存するファイルのパス。 |
例
my_model
という名前のモデルをPolarDB for AIプラットフォームにアップロードします。
/*polar4ai*/UPLOAD MODEL my_model WITH (model_location='https://xxxx.oss-cn-hangzhou.aliyuncs.com/xxxx/model.pkl?Expires=xxxx&OSSAccessKeyId=xxxx&Signature=xxxx', req_location='https://xxxx.oss-cn-hangzhou.aliyuncs.com/xxxx/requirements.txt?Expires=xxxx&OSSAccessKeyId=xxxx&Signature=xxxx');
サンプル結果:
Query OK, 0 rows affected (0.29 sec)
次のステートメントを実行して、モデルのステータスを照会します。
/*polar4ai*/ SHOW MODEL my_model;
サンプル結果:
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| modelStatus | modelPath |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| saved | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/xxxxx.pkl?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.23 sec)
modelStatus
パラメーターの値が保存
されている場合、モデルはアップロードされています。
モデルのデプロイDeploy a model
このセクションでは、アップロードされたモデルをPolarDB for AIプラットフォームにデプロイする方法について説明します。 デプロイが完了すると、モデルはオンライン状態になります。 オンライン状態のモデルは、推論のためにすぐに呼び出すことができます。
構文
DEPLOY MODEL model_name
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
例
my_model
という名前のモデルをPolarDB for AIにデプロイします。
/*polar4ai*/ DEPLOY MODEL my_model;
サンプル結果:
Query OK, 0 rows affected (0.29 sec)
次のステートメントを実行して、モデルのステータスを表示します。
/*polar4ai*/ SHOW MODEL my_model;
サンプル結果:
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| modelStatus | modelPath |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| serving | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/xxxxx.pkl?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.23 sec)
modelStatus
パラメーターの値がserving
の場合、モデルはデプロイされます。
モデルの表示
モデルリストの表示
このセクションでは、現在のクラスター内のすべてのモデルを表示する方法について説明します。
構文
SHOW MODELS
例
/*polar4ai*/SHOW MODELS
サンプル結果:
+-----------------------+-----------------+--------------+
| model_name | model_class | model_status |
+-----------------------+-----------------+--------------+
| airline_rfr | randomforestreg | saved |
| gbrt1 | gbrt | saved |
| airline_deepfm | deepfm | saved |
| airlines_gbm | lightgbm | saved |
| lgbm1 | lightgbm | saved |
| blackfriday_linearreg | linearreg | saved |
+-----------------------+-----------------+--------------+
6 rows in set (0.24 sec)
モデルのステータスの表示
モデルの現在のステータスを表示できます。 次の構文を使用して、モデルがトレーニングされているかどうかを確認します。 モデルは、次のいずれかの状態になります。
training: モデルはトレーニング中です。
loading_data: データがモデルに読み込まれています。
trained: モデルはトレーニングされています。
saved: モデルが保存されます。
サービング: モデルは使用中です。
deleted: モデルが削除されました。
構文
SHOW MODEL model_name
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
例
airlines_gbm
モデルのステータスを照会します。
/*polar4ai*/SHOW MODEL airlines_gbm;
サンプル結果:
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| modelStatus | modelPath |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
| saved | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/xxxxx.pkl?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx |
+-------------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.23 sec)
modelPath
の有効期間は100分です。 リンクがまだ有効かどうかを確認するには、modelPath
のExpires
パラメーターの値を確認します。 有効期間内にリンクにアクセスしていることを確認してください。
モデル詳細の表示
構文
DESCRIBE MODEL model_name
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
例
airlines_gbm
モデルの詳細を照会します。
/*polar4ai*/DESCRIBE MODEL airlines_gbm;
サンプル結果:
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| model_name | model_description |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| airlines_gbm | basic information:model_name:airlines_gbm model_class:lightgbm feature important:features,imp_gain,imp_splitAirline,0.3327,0.0376 AirportFrom,0.2178,0.1842 Time,0.1893,0.1999 AirportTo,0.1668,0.187 DayOfWeek,0.0384,0.1236 Length,0.0307,0.1269 Flight,0.0242,0.1408 |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.65 sec)
モデルを評価する
このセクションでは、トレーニング済みモデルを評価する方法について説明します。
構文
SELECT select_expr [, select_expr] ... FROM EVALUATE (MODEL model_name, SELECT select_expr_for_prediction [, select_expr_for_prediction] ... FROM table_reference ) WITH (x_cols = '', y_cols='', metrics='')
Parameters
パラメーター | 説明 |
select_expr | モデルの評価結果に表示される列の名前。 |
model_name | モデルの名前。 |
select_expr_for_prediction | モデルの評価に使用される列の名前。 |
table_reference | テーブルの名前。 |
x_cols | モデルトレーニングの入力列。 複数の列の名前はコンマ (,) で区切ります。 |
y_cols | モデルトレーニングの出力列。 |
metrics | モデル評価のメトリック。 有効な値:
|
例
airlines_gbm
という名前のトレーニング済みモデルを評価します。/*polar4ai*/SELECT Delay FROM evaluate(MODEL airlines_gbm, SELECT * FROM db4ai.airlines_test) WITH (x_cols = 'Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length', y_cols='Delay', metrics='acc');
サンプル結果:
+--------------------------------------+ | task_id | +--------------------------------------+ | df05244e-21f7-11ed-be66-xxxxxxxxxxxx | +--------------------------------------+ 1 row in set (0.95 sec)
次のステートメントを実行して、タスクのステータスを表示します。
/*polar4ai*/SHOW TASK `df05244e-21f7-11ed-be66-xxxxxxxxxxxx`;
サンプル結果:
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ | taskStatus | filePath | results | startTime | endTime | +------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ | finish | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/pc-xxxxxxx/airlines_gbm/xxxxx.csv?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx | {"acc": 0.6694} | 2022-08-22 17:22:21.122101 | 2022-08-22 17:22:39.428811 | +------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ 1 row in set (0.24 sec)
説明filePath
の有効期間は100分です。 リンクがまだ有効かどうかを確認するには、filePath
のExpires
パラメーターの値を参照します。 有効期間内にリンクにアクセスしていることを確認してください。
推論にモデルを使用する
このセクションでは、トレーニング済みモデルをオンラインまたはオフラインの推論に使用する方法について説明します。
構文
SELECT select_expr [, select_expr] ... FROM PREDICT (MODEL model_name, SELECT select_expr_for_prediction [, select_expr_for_prediction] ... FROM table_reference LIMIT row_count) WITH (x_cols= '')
Parameters
パラメーター | 説明 |
select_expr | モデル推論結果に表示される列の名前。 |
model_name | モデルの名前。 |
select_expr_for_prediction | モデル推論に使用される列の名前。 |
table_reference | テーブルの名前。 |
mode | 推論モード。 値asyncはオフライン推論を指定します。 このパラメーターを空のままにすると、オンライン推論が使用されます。 |
row_count | モデル推論に使用されるサンプル数。 |
x_cols | モデルトレーニングの入力列。 複数の列の名前はコンマ (,) で区切ります。 |
例
オンライン推論
オンライン推論には
airlines_gbm
モデルを使用します。/*polar4ai*/SELECT Delay FROM PREDICT(MODEL airlines_gbm, SELECT * FROM db4ai.airlines_test LIMIT 10) WITH (x_cols = 'Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length', y_cols='Delay');
サンプル結果:
+-------+-------------------+ | Delay | predicted_results | +-------+-------------------+ | 1 | 0 | | 0 | 0 | | 0 | 0 | | 0 | 0 | | 0 | 0 | | 0 | 0 | | 1 | 0 | | 0 | 0 | | 0 | 0 | | 1 | 0 | +-------+-------------------+ 10 rows in set (0.74 sec)
オフライン推論
推論サンプルの数が1,000を超える場合、PolarDB for AIはオフライン推論タスクを使用するように求めます。
ERROR 9050 (HY000): Please limit the SQL selected data length to less than '1000' or convert to offline prediction
オフライン推論タスクを作成します。
/*polar4ai*/SELECT Delay FROM predict(MODEL airlines_gbm, SELECT * FROM db4ai.airlines_test) WITH (x_cols = 'Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length', y_cols='Delay', mode='async');
サンプル結果:
+--------------------------------------+ | task_id | +--------------------------------------+ | bd0c1722-21e7-11ed-94a8-xxxxxxxxxxxx | +--------------------------------------+ 1 row in set (0.75 sec)
上記のクエリ結果には、
task_id
が表示されます。これは、タスクのステータスと対応する結果のダウンロードURLをクエリするために使用できます。/*polar4ai*/SHOW TASK `bd0c1722-21e7-11ed-94a8-xxxxxxxxxxxx`
サンプル結果:
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ | taskStatus | filePath | results | startTime | endTime | +------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ | finish | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/pc-xxxxxxx/airlines_gbm/xxxxx.csv?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx | | 2022-08-22 14:57:51.355240 | 2022-08-22 14:58:18.316818 | +------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+ 1 row in set (0.24 sec)
説明filePath
の有効期間は100分です。 リンクがまだ有効かどうかを確認するには、filePath
のExpires
パラメーターの値を参照します。 有効期間内にリンクにアクセスしていることを確認してください。
オフライン評価と推論タスクの管理
オフラインタスクの一覧を表示
このセクションでは、現在のクラスター内のすべてのオフラインタスクを表示する方法について説明します。
オフラインタスクは、長期間実行され、リアルタイムで結果を生成しないバッチ処理タスクです。 オフラインタスクには、オフライン評価タスクとオフライン推論タスクが含まれます。
構文
SHOW TASKS
例
次のステートメントを実行して、現在のクラスター内のすべてのオフラインタスクを表示します。
/*polar4ai*/SHOW TASKS;
サンプル結果:
+--------------------------------------+------------+-------------+----------------------------+----------------------------+
| task_id | task_type | task_status | start_timestr | end_timestr |
+--------------------------------------+------------+-------------+----------------------------+----------------------------+
| 2cba0c74-1f8f-11ed-934a-xxxxxxxxxxxx | prediction | finish | 2022-08-19 15:18:51.206829 | |
| 77b3a186-1f94-11ed-8eaa-xxxxxxxxxxxx | evaluation | finish | 2022-08-19 15:56:44.465594 | |
| 972547a4-1fa3-11ed-9c6b-xxxxxxxxxxxx | evaluation | finish | 2022-08-19 17:44:59.790353 | 2022-08-19 17:45:23.750100 |
| bd0c1722-21e7-11ed-94a8-xxxxxxxxxxxx | prediction | finish | 2022-08-22 14:57:51.355240 | 2022-08-22 14:58:18.316818 |
| df05244e-21f7-11ed-be66-xxxxxxxxxxxx | evaluation | finish | 2022-08-22 16:53:20.381577 | 2022-08-22 16:53:37.189953 |
| ec956db8-21fb-11ed-8400-xxxxxxxxxxxx | evaluation | finish | 2022-08-22 17:22:21.122101 | 2022-08-22 17:22:39.428811 |
+--------------------------------------+------------+-------------+----------------------------+----------------------------+
9 rows in set (0.18 sec)
オフラインタスクのステータスの表示
ここでは、オフラインタスクのステータスを表示する方法について説明します。 タスクは次のいずれかの状態にある可能性があります。
init: タスクの初期化中です。
running: タスクが実行中です。
finish: タスクは完了です。
fail: タスクが失敗しました。
構文
SHOW TASK `task_id`
Parameters
パラメーター | 説明 |
task_id | タスクのID。 |
例
タスクIDがdf05244e-21f7-11ed-be66-xxxxxxxxxxxx
のタスクの状態を照会します。
/*polar4ai*/SHOW TASK `df05244e-21f7-11ed-be66-xxxxxxxxxxxx`
サンプル結果:
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+
| taskStatus | filePath | results | startTime | endTime |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+
| finish | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/pc-xxxxxxx/airlines_gbm/xxxxx.csv?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx | {"acc": 0.6694} | 2022-08-22 17:22:21.122101 | 2022-08-22 17:22:39.428811 |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------------------+----------------------------+
1 row in set (0.24 sec)
filePath
の有効期間は100分です。 リンクがまだ有効かどうかを確認するには、filePath
のExpires
パラメーターの値を参照します。 有効期間内にリンクにアクセスしていることを確認してください。
モデルの削除
このセクションでは、不要になったモデルを削除する方法について説明します。
構文
DROP MODEL model_name
Parameters
パラメーター | 説明 |
model_name | モデルの名前。 |
例
airlines_gbm
モデルを削除します。
/*polar4ai*/DROP MODEL airlines_gbm
次のような結果が返された場合、airlines_gbm
モデルは削除されます。
Query OK, 0 rows affected (0.57 sec)
カスタムモデル管理のベストプラクティス
このセクションでは、カスタムモデル管理について説明します。 以下の例では、オフラインモデルトレーニングとオンライン推論が実行されます。
事前にオフライントレーニング。
次のスクリプトは、オフライントレーニングにLightGBMアルゴリズムを使用します。
# coding: utf-8 from pathlib import Path import pandas as pd from sklearn.metrics import mean_squared_error import lightgbm as lgb import joblib def train_model(): print('Loading data...') # load or create your dataset df_train = pd.read_csv('regression.train', header=None, sep='\t') df_test = pd.read_csv('regression.test', header=None, sep='\t') y_train = df_train[0] y_test = df_test[0] X_train = df_train.drop(0, axis=1) X_test = df_test.drop(0, axis=1) # create dataset for lightgbm lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # specify your configurations as a dict params = { 'boosting_type': 'gbdt', 'objective': 'regression', 'metric': {'l2', 'l1'}, 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': 0 } print('Starting training...') # train gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, callbacks=[lgb.early_stopping(stopping_rounds=5)]) print('Saving model...') # save model to file # gbm.save_model('model.txt') joblib.dump(gbm, 'lgb.pkl') print('Starting predicting...') # predict y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration) # eval rmse_test = mean_squared_error(y_test, y_pred) ** 0.5 print(f'The RMSE of prediction is: {rmse_test}')
上記のスクリプトでは、モデルファイルは
pkl
形式でエクスポートされます。predict
メソッドは、推論結果を照会するために呼び出されます。 モデルが依存するpythonファイルも必要です。次の例は、
requirements.txt
ファイルの内容を示しています。lightgbm==3.3.3
モデルのアップロード
次のステートメントを実行して、モデルをPolarDB for AIにアップロードします。
/*polar4ai*/UPLOAD MODEL my_model WITH (model_location='https://xxxx.oss-cn-hangzhou.aliyuncs.com/xxxx/model.pkl?Expires=xxxx&OSSAccessKeyId=xxxx&Signature=xxxx', req_location='https://xxxx.oss-cn-hangzhou.aliyuncs.com/xxxx/requirements.txt?Expires=xxxx&OSSAccessKeyId=xxxx&Signature=xxxx')
model_location
パラメーターは、モデルファイルのパスを指定します。req_location
パラメーターは、モデルが依存するファイルのパスを指定します。 事前に2つのファイルを準備し、ファイルをObject Storage Service (OSS) バケットにアップロードしてから、上記のステートメントを実行してファイルをPolarDB for AIにアップロードできます。サンプル結果:
Query OK, 0 rows affected (0.29 sec)
次のステートメントを実行して、モデルのステータスを照会します。
/*polar4ai*/ SHOW my_model;
サンプル結果:
+-------------+-----------------------------------------------------------------------------------------------------------------------------+ | modelStatus | modelPath | +-------------+-----------------------------------------------------------------------------------------------------------------------------+ | saved | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/xxxxx.pkl?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx | +-------------+-----------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.23 sec)
modelStatus
パラメーターの値が保存
されている場合、モデルはアップロードされます。
モデルのデプロイ
次のステートメントを実行して、PolarDB for AIにモデルをデプロイします。
/*polar4ai*/ DEPLOY MODEL my_model;
サンプル結果:
Query OK, 0 rows affected (0.29 sec)
次のステートメントを実行して、モデルのステータスを照会します。
/*polar4ai*/ SHOW MODEL my_model;
サンプル結果:
+-------------+-----------------------------------------------------------------------------------------------------------------------------+ | modelStatus | modelPath | +-------------+-----------------------------------------------------------------------------------------------------------------------------+ | serving | http://db4ai-collie-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/xxxxx.pkl?OSSAccessKeyId=xxxxxx&Expires=xxxx&Signature=xxxxxx | +-------------+-----------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.23 sec)
modelStatus
パラメーターの値がserving
の場合、モデルはデプロイされます。
オンライン推論の実装。
次のステートメントを実行して、モデルを使用してオンライン推論タスクを実行します。
/*polar4ai*/ SELECT Y FROM PREDICT(MODEL my_model, SELECT * FROM db4ai.regression_test LIMIT 10) WITH (x_cols = 'x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28', y_cols='');
サンプル結果:
+------+---------------------+ | Y | predicted_results | +------+---------------------+ | 1.0 | 0.6262147669037363 | | 0.0 | 0.5082804008241021 | | 0.0 | 0.37533158372209957 | | 1.0 | 0.461974928099089 | | 0.0 | 0.3777339456553666 | | 0.0 | 0.35045096227525735 | | 0.0 | 0.4178165504012342 | | 1.0 | 0.40869795422774036 | | 1.0 | 0.6826481286570045 | | 0.0 | 0.47021259543154736 | +------+---------------------+ 10 rows in set (0.95 sec)