このトピックでは、EasyRec をモデル学習に使用しない場合に、Platform for AI(PAI)の Elastic Algorithm Service(EAS)をモデル推論に使用する手順について説明します。詳細については、「EasyRec プロセッサ」をご参照ください。
背景情報
モデル学習を他の環境で完了しているものの、モデル推論には EAS が提供する高性能サービスを使用したい場合があります。
手順 1:モデルを準備する
SavedModel 形式で TensorFlow モデルをエクスポートし、アクセス可能なストレージロケーション(Object Storage Service(OSS)のバケットなど)にアップロード済みであることを確認します。
手順 2:サービス構成ファイルを設定する
echo.json などのサービス構成ファイルを作成し、関連パラメーターを設定します。次のコードは、構成ファイルの例です。
bizdate=$1
cat << EOF > echo.json
{
"name":"ali_rec_rnk_no_fg",
"metadata": {
"instance": 2,
"rpc": {
"enable_jemalloc": 1,
"max_queue_size": 100
}
},
"cloud": {
"computing": {
"instance_type": "ecs.g7.large"",
"instances": null
}
},
"model_config": {
"fg_mode": "bypass" // 特徴量生成(FG)をバイパスモードに設定
},
"processor": "easyrec-1.9",
"processor_envs": [
{
"name": "INPUT_TILE",
"value": "2"
}
],
"storage": [
{
"mount_path": "/home/admin/docker_ml/workspace/model/",
"oss": {
"path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final/" // モデルファイルのパス
}
}
],
"warm_up_data_path": "oss://easyrec/ali_rec_sln_acc_rnk/rnk_warm_up.bin" // ウォームアップデータのパス
}
EOF
この例では、fg_mode フィールドの値は bypass に設定されています。これは、特徴量生成(FG)が有効ではなく、TensorFlow モデルのみがデプロイされることを示します。
次の表では、主要なパラメーターについて説明します。その他のパラメーターについては、「JSON デプロイメントパラメーター」をご参照ください。
パラメーター | 必須 | 説明 | 例 |
processor | はい | EasyRec プロセッサの名前。 | "processor": "easyrec" |
fg_mode | はい | 特徴量エンジニアリングモード。有効な値:
| "fg_mode": "tf" |
outputs | はい | TensorFlow モデルの出力変数の名前。例:probs_ctr。複数の名前はカンマ(,)で区切ります。出力変数の名前を取得するには、TensorFlow コマンド saved_model_cli を実行します。 | "outputs":"probs_ctr,probs_cvr" |
save_req | いいえ | 返されたデータファイルをモデルディレクトリに保存するかどうかを指定します。ファイルは、ウォームアップとパフォーマンステストに使用できます。有効な値:
| "save_req": "false" |
Item Feature Cache に関連するパラメーター | |||
period | はい | アイテム特徴量が更新される間隔。単位:分。更新が数日ごとに行われる場合は、サービスの更新時にアイテム特徴量が毎日更新されるため、このパラメーターを 1 日より大きい値(例:2880)に設定します。 | "period": 2880 |
remote_type | はい | アイテム特徴量のデータソース。有効な値:
| "remote_type": "hologres" |
tables | いいえ | アイテム特徴量テーブル。このパラメーターは、remote_type パラメーターを hologres に設定した場合にのみ必須です。このパラメーターには、次のフィールドが含まれます。
複数のテーブルからアイテム特徴量データを読み取る場合は、次の形式でこのパラメーターを設定します。 "tables": [{"key":"table1", ...},{"key":"table2", ...}] テーブルに重複する列がある場合、後続のテーブルの列が前のテーブルの列を上書きします。 | "tables": { "key": "goods_id", "name": "public.ali_rec_item_feature" } |
url | いいえ | Hologres に接続するためのエンドポイント。 | "url": "postgresql://LTAI****************:yourAccessKeySecret@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec" |
FeatureStore に関連するパラメーター | |||
fs_project | いいえ | FeatureStore プロジェクトの名前。FeatureStore を使用する場合は、このパラメーターが必須です。詳細については、「FeatureStore プロジェクトを設定する」をご参照ください。 | "fs_project": "fs_demo" |
fs_model | いいえ | FeatureStore のモデル特徴量の名前。 | "fs_model": "fs_rank_v1" |
fs_entity | いいえ | FeatureStore の特徴量エンティティの名前。 | "fs_entity": "item" |
region | いいえ | FeatureStore サービスがデプロイされているリージョン。 | "region": "cn-beijing" |
access_key_id | いいえ | FeatureStore サービスの AccessKey ID。 | "access_key_id": "LTAI****************" |
access_key_secret | いいえ | FeatureStore サービスの AccessKey シークレット。 | "access_key_secret": "yourAccessKeySecret" |
load_feature_from_offlinestore | いいえ | FeatureStore のオフラインデータストアからオフライン特徴量データを取得するかどうかを指定します。有効な値:
| "load_feature_from_offlinestore": True |
自動ブロードキャストに関連するパラメーター | |||
INPUT_TILE | いいえ | アイテム特徴量配列の自動ブロードキャストを有効にします。リクエストでアイテム特徴量(user_id など)の値が同じである場合、値を 1 回指定すると、配列に複製されます。
注
| "processor_envs": [ { "name": "INPUT_TILE", "value": "2" } ] |
手順 3:サービスをデプロイする
前の手順で作成したサービス構成ファイルをデプロイするには、EASCMD を使用します。
# デプロイコマンドを実行します。
eascmd create echo.json
# eascmd -i <AccessKeyID> -k <AccessKeySecret> -e <endpoint> create echo.json
# 更新コマンドを実行します。
eascmd modify ali_rec_rnk_no_fg -s echo.json出力ログを確認して、サービスが正常にデプロイされたことを確認します。サービスがデプロイされた後、サービスのアクセスアドレスを取得できます。
手順 4:サービスを呼び出す
EasyRec モデルサービスを呼び出す
bypass モードを使用する場合は、Java SDK または Python SDK を使用して、EasyRec プロセッサのリクエスト形式に基づいてモデルサービスを呼び出すことができます。
Java SDK の使用例
Java SDK を使用する前に、Maven 環境を設定する必要があります。Maven 環境の設定方法については、「Java 用 SDK」をご参照ください。ali_rec_rnk_no_fg サービスを呼び出すサンプルコード:
import java.util.List;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;
public class TestEasyRec {
public static TFRequest buildPredictRequest() {
TFRequest request = new TFRequest();
request.addFeed("user_id", TFDataType.DT_STRING,
new long[]{5}, new String []{ "u0001", "u0001", "u0001"});
request.addFeed("age", TFDataType.DT_FLOAT,
new long[]{5}, new float []{ 18.0f, 18.0f, 18.0f});
// 注:INPUT_TILE パラメーターを 2 に設定すると、コードを次のように簡略化できます。
// request.addFeed("user_id", TFDataType.DT_STRING,
// new long[]{1}, new String []{ "u0001" });
// request.addFeed("age", TFDataType.DT_FLOAT,
// new long[]{1}, new float []{ 18.0f});
request.addFeed("item_id", TFDataType.DT_STRING,
new long[]{5}, new String []{ "i0001", "i0002", "i0003"});
request.addFetch("probs");
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = new PredictClient(new HttpConfig());
// setDirectEndpoint を呼び出して、VPC 直接接続チャネルを使用してサービスにアクセスします。
// client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// PAI コンソールの EAS ページで VPC 直接接続チャネルを作成する必要があります。
// ゲートウェイを使用するよりも、直接接続チャネルを使用することで、安定性とパフォーマンスが向上します。
client.setEndpoint("yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_no_fg");
client.setToken("");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
try {
TFResponse response = client.predict(buildPredictRequest());
// probs:出力フィールドの名前。cURL コマンドを実行して、モデルの入力と出力を表示できます。
// curl yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com -H "Authorization:{token}"
List<Float> result = response.getFloatVals("probs");
System.out.print("Predict Result: [");
for (int j = 0; j < result.size(); j++) {
System.out.print(result.get(j).floatValue());
if (j != result.size() - 1) {
System.out.print(", ");
}
}
System.out.print("]\n");
} catch (Exception e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
client.shutdown();
}
}Python SDK の使用例
Python SDK の使用方法については、「Python 用 SDK」をご参照ください。パフォーマンスが制限されているため、Python SDK はデバッグのみに使用することをお勧めします。ali_rec_rnk_no_fg サービスを呼び出すサンプルコード:
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction.tf_request_pb2 import TFRequest
if __name__ == '__main__':
client = PredictClient('http://yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
client.set_token('')
client.init()
req = TFRequest()
req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
# 注:INPUT_TILE パラメーターを 2 に設定すると、コードを次のように簡略化できます。
# req.add_feed('user_id', [1], TFRequest.DT_STRING, ['u0001'])
# req.add_feed('age', [1], TFRequest.DT_FLOAT, [18.0])
req.add_feed('item_id', [5], TFRequest.DT_STRING,
['i0001', 'i0002', 'i0003'])
for x in range(0, 100):
resp = client.predict(req)
print(resp)カスタムサービスリクエストを作成することもできます。詳細については、「リクエスト構文」をご参照ください。
手順 5:サービスのパフォーマンスを監視および最適化する
サービスのデプロイ後、サービスのパフォーマンスをテストし、テスト結果に基づいてサービスのパフォーマンスと安定性を最適化することをお勧めします。
まとめ
上記の手順に従うことで、EasyRec をモデル学習に使用せずに、EAS をモデル推論に使用できます。