Platform for AI (PAI) の Elastic Algorithm Service (EAS) には、組み込みの TorchEasyRec プロセッサが提供されています。このプロセッサにより、TorchEasyRec または Torch 推奨モデルをスコアリングサービスとしてデプロイでき、また特徴量エンジニアリング機能も統合されます。TorchEasyRec プロセッサを使用すると、特徴量エンジニアリングおよび Torch モデルに最適化された高性能スコアリングサービスをデプロイできます。本トピックでは、TorchEasyRec モデルサービスのデプロイおよび呼び出し手順について説明します。
背景情報
以下の図は、TorchEasyRec プロセッサに基づく推奨エンジンのアーキテクチャを示しています。
TorchEasyRec プロセッサには、以下のモジュールが含まれます:
アイテム機能キャッシュ: このモジュールは、FeatureStore からアイテム機能をメモリにキャッシュします。これにより、頻繁なリクエスト操作によって生じる FeatureStore の負荷が軽減され、推論サービスのパフォーマンスが向上します。アイテム機能にリアルタイム機能が含まれている場合、FeatureStore はリアルタイム機能を同期します。
Feature Generator (FG):このモジュールは構成ファイルを用いて特徴量エンジニアリング処理を定義し、リアルタイムおよびオフラインの特徴量エンジニアリングを実現する C++ コードのコレクションを使用して、処理の一貫性を保証します。
TorchModel:これは、TorchEasyRec または Torch モデルの学習からエクスポートされたスクリプト化されたモデルファイルを指します。
制限事項
TorchEasyRec プロセッサは、T4 型および A10 型の GPU デバイス、および 汎用インスタンスファミリー(g6、g7、g8) で使用できます。GPU デバイスを利用する場合は、Compute Unified Device Architecture (CUDA) ドライバーのバージョンが 535 以降であることを確認してください。
プロセッサのバージョン
TorchEasyRec プロセッサは継続的に改善されています。後続のバージョンでは、強化された機能および推論パフォーマンスが提供されます。最適な結果を得るために、推論サービスのデプロイには最新バージョンの使用を推奨します。以下の表に、リリース済みのバージョンを示します。
プロセッサ名 | リリース日 | Torch バージョン | FG バージョン | 新機能 |
easyrec-torch-0.1 | 20240910 | 2.4 | 0.2.9 |
|
easyrec-torch-0.2 | 20240930 | 2.4 | 0.2.9 |
|
easyrec-torch-0.3 | 20241014 | 2.4 | 0.2.9 |
|
easyrec-torch-0.4 | 20241028 | 2.4 | 0.3.1 |
|
easyrec-torch-0.5 | 20241114 | 2.4 | 0.3.1 |
|
easyrec-torch-0.6 | 20241118 | 2.4 | 0.3.6 |
|
easyrec-torch-0.7 | 20241206 | 2.5 | 0.3.9 |
|
easyrec-torch-0.8 | 20241225 | 2.5 | 0.3.9 |
|
easyrec-torch-0.9 | 20250115 | 2.5 | 0.4.1 |
|
easyrec-torch-1.0 | 20250206 | 2.5 | 0.4.2 |
|
easyrec-torch-1.1 | 20250423 | 2.5 | 0.5.9 |
|
easyrec-torch-1.5 | 20250918 | 2.5 | 0.7.3 |
|
easyrec-torch-1.6 | 20251021 | 2.5 | 0.7.4 |
|
easyrec-torch-1.7 | 20251104 | 2.5 | 0.7.4 |
|
easyrec-torch-1.8 | 20251201 | 2.5 | 0.7.4 |
|
asyrec-torch-1.9 | 20260109 | 2.5 | 1.0.0 |
|
easyrec-torch-1.10 | 20260123 | 2.5 | 1.0.1 |
|
ステップ 1:モデルサービスのデプロイ
torcheasyrec.json サービス構成ファイルを準備します。
processor パラメーターを easyrec-torch-{version} に設定し、{version} の値は プロセッサのバージョンに基づいて設定する必要があります。以下のサンプルコードは、JSON 構成ファイルの例です:
fg_mode パラメーターを normal に設定した場合のサンプルコード
{ "metadata": { "instance": 1, "name": "alirec_rank_with_fg", "rpc": { "enable_jemalloc": 1, "max_queue_size": 256, "worker_threads": 16 } }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "model_config": { "fg_mode": "normal", "fg_threads": 8, "region": "YOUR_REGION", "fs_project": "YOUR_FS_PROJECT", "fs_model": "YOUR_FS_MODEL", "fs_entity": "item", "load_feature_from_offlinestore": true, "access_key_id":"YOUR_ACCESS_KEY_ID", "access_key_secret":"YOUR_ACCESS_KEY_SECRET" }, "storage": [ { "mount_path": "/home/admin/docker_ml/workspace/model/", "oss": { "path": "oss://xxx/xxx/export", "readOnly": false }, "properties": { "resource_type": "code" } } ], "processor":"easyrec-torch-0.3" }fg_mode パラメーターを bypass に設定した場合のサンプルコード
{ "metadata": { "instance": 1, "name": "alirec_rank_no_fg", "rpc": { "enable_jemalloc": 1, "max_queue_size": 256, "worker_threads": 16 } }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "model_config": { "fg_mode": "bypass" }, "storage": [ { "mount_path": "/home/admin/docker_ml/workspace/model/", "oss": { "path": "oss://xxx/xxx/export", "readOnly": false }, "properties": { "resource_type": "code" } } ], "processor":"easyrec-torch-0.3" }以下の表では、主なパラメーターについて説明します。その他のパラメーターについては、「JSON デプロイメント」をご参照ください。
パラメーター
必須
説明
例
processor
はい
TorchEasyRec プロセッサ。
"processor":"easyrec-torch-0.3"
path
はい
モデルファイルをマウントする Object Storage Service (OSS) のパス。
"path": "oss://examplebucket/xxx/export"
fg_mode
いいえ
特徴量エンジニアリングモード。有効な値:
bypass(デフォルト):FG モジュールは使用せず、Torch モデルのみをデプロイ。
このモードは、カスタム特徴量エンジニアリングのシナリオに適しています。
バイパスモードでは、FeatureStore 関連のパラメーターを構成する必要はありません。
normal:FG モジュールを使用。ほとんどの場合、FG モジュールは TorchEasyRec とのモデル学習と併用されます。
"fg_mode": "normal"
fg_threads
いいえ
単一リクエストに対して FG モジュールを実行する並列スレッド数。
"fg_threads": 15
outputs
いいえ
Torch モデルの出力変数の名前。例:probs_ctr。複数の変数を返す場合は、カンマ(,)で区切ります。デフォルトでは、すべての変数が出力されます。
"outputs":"probs_ctr,probs_cvr"
item_empty_score
いいえ
アイテム ID が存在しない場合のデフォルトスコア。デフォルト値:0。
"item_empty_score": -1
取得関連のパラメーター
faiss_neigh_num
いいえ
取得されるベクター数。デフォルトでは、リクエスト内の
faiss_neigh_numフィールドの値が使用されます。リクエスト内にfaiss_neigh_numフィールドが存在しない場合は、faiss_neigh_numフィールドの値がmodel_config内で使用されます。デフォルト値:1。"faiss_neigh_num": 200
faiss_nprobe
いいえ
取得処理で得られるクラスター数。デフォルト値:800。FAISS では、逆ファイルインデックスがデータを複数の小さなクラスター(グループ)に分割し、各クラスターに対して逆リストを保持します。値が大きいほど取得精度は高まりますが、計算コストおよび取得時間が増加します。逆に、値が小さいほど取得精度は低下し、取得速度が向上します。
"faiss_nprobe": 700
FeatureStore 関連のパラメーター
fs_project
いいえ
FeatureStore プロジェクトの名前。FeatureStore を使用する場合は、このパラメーターが必要です。FeatureStore の詳細については、「FeatureStore プロジェクトの構成」をご参照ください。
"fs_project": "fs_demo"
fs_model
いいえ
FeatureStore 内のモデル特徴量の名前。
"fs_model": "fs_rank_v1"
fs_entity
いいえ
FeatureStore 内の特徴量エンティティの名前。
"fs_entity": "item"
region
いいえ
FeatureStore が配置されているリージョン。たとえば、FeatureStore が中国(北京)に配置されている場合、このパラメーターを cn-beijing に設定します。リージョンの詳細については、「エンドポイント」をご参照ください。
"region": "cn-beijing"
access_key_id
いいえ
FeatureStore の AccessKey ID。
"access_key_id": "xxxxx"
access_key_secret
いいえ
FeatureStore の AccessKey Secret。
"access_key_secret": "xxxxx"
load_feature_from_offlinestore
いいえ
オフラインデータストアから FeatureStore のオフライン特徴量データを取得するかどうかを指定します。有効な値:
True:FeatureStore のオフラインデータストアからオフライン特徴量データを取得。
False(デフォルト):FeatureStore のオンラインデータストアからオフライン特徴量データを取得。
"load_feature_from_offlinestore": True
featuredb_username
いいえ
FeatureDB のユーザー名。
"featuredb_username":"xxx"
featuredb_password
いいえ
FeatureDB のユーザー名のパスワード。
"featuredb_passwd":"xxx"
自動ブロードキャスト関連のパラメーター
INPUT_TILE
いいえ
特徴量の自動ブロードキャストを有効化します。user_id などの特徴量の値がリクエスト内で同一の場合、リクエストサイズ、ネットワーク転送時間、および計算時間を削減するために、値を一度だけ指定します。
この機能は、TorchEasyRec の通常モードと併用する必要があります。また、関連するファイルをエクスポートする際に、関連する環境変数を構成する必要があります。デフォルトでは、システムは TorchEasyRec からエクスポートされたモデルディレクトリ内の model_acc.json ファイルから INPUT_TILE 値を読み取ります。ファイルが存在しない場合は、環境変数から値を読み取ります。
この機能を有効化した後:
このパラメーターを 2 に設定すると、FG はユーザー特徴量に対して入力データを一度だけ計算します。
このパラメーターを 3 に設定すると、FG はユーザー特徴量に対して埋め込み情報を一度だけ計算します。システムはユーザー埋め込み情報とアイテム埋め込み情報を別々に計算します。これは、多数のユーザー特徴量を扱うシナリオに適しています。
"processor_envs":
[
{
"name": "INPUT_TILE",
"value": "2"
}
]
NO_GRAD_GUARD
いいえ
推論時の勾配計算を無効化します。このパラメーターを構成すると、追跡操作が停止し、期待通りの計算グラフが構築されません。
説明このパラメーターを 1 に設定すると、特定のモデルと互換性がない場合があります。その後の推論でハングが発生した場合、
PYTORCH_TENSOREXPR_FALLBACK=2の構成を追加することで、コンパイルステップをスキップし、特定のグラフ最適化機能を維持できます。"processor_envs":
[
{
"name": "NO_GRAD_GUARD",
"value": "1"
}
]
モデルウォームアップ関連のパラメーター
warmup_data_pathいいえ
ウォームアップ機能を有効化し、ウォームアップファイルの保存パスを指定します。データ損失を防ぐため、ストレージ構成に OSS マウントを追加し、このパスにマウントする必要があります。
"warmup_data_path": "/warmup"
warmup_cnt_per_fileいいえ
各ウォームアップ PB ファイルあたりのウォームアップ反復回数。この値を適切に増やすことで、より徹底的なウォームアップが可能になりますが、ウォームアップ時間も延長されます。デフォルト値:20。
"warmup_cnt_per_file": 20,
warmup_pb_files_countいいえ
次回起動時にウォームアップのために PB ファイルとして保存されるオンラインリクエスト数。ファイルは
warmup_data_pathで指定されたパスに保存されます。デフォルト値:64。"warmup_pb_files_count": 64
遅延リクエストログの保存
long_request_threshold
いいえ
遅延リクエストのしきい値(ミリ秒単位)。リクエストがこのしきい値を超えた場合、各セグメントの実行時間がログに自動記録されます。デフォルト値は 200 ms です。
"long_request_threshold": 200
save_long_request
いいえ
遅延リクエストを .pb ファイルとして保存するかどうかを指定するブール型パラメーター。リクエストが
long_request_thresholdを超えた場合、そのリクエストは遅延リクエストと見なされます。デフォルト値は false です。"save_long_request": true
TorchEasyRec モデルサービスをデプロイします。以下のいずれかのデプロイ方法を使用できます:
(推奨)JSON を使用したモデルサービスのデプロイ
以下の手順を実行します:
-
PAI コンソール にログインします。ページ上部から目的のリージョンを選択します。その後、目的のワークスペースを選択し、Elastic Algorithm Service (EAS) をクリックします。
Elastic Algorithm Service (EAS) ページで、サービスのデプロイ をクリックします。サービスのデプロイページで、カスタムモデルのデプロイ セクション内の JSON デプロイメント をクリックします。
JSON デプロイメントページで、事前に準備した JSON 構成ファイルの内容を JSON テキストエディターに入力し、デプロイ をクリックします。
EASCMD クライアントを使用したモデルサービスのデプロイ
クライアントのダウンロードおよび認証を行います。本例では Windows 64 を使用します。
クライアントを起動し、JSON 構成ファイルが配置されているディレクトリで以下のコマンドを実行してモデルサービスを作成します。詳細については、「EASCMD クライアントのコマンド実行」をご参照ください。
eascmdwin64.exe create <service.json><service.json> を、作成した JSON 構成ファイルの名前に置き換えます(例:torcheasyrec.json)。
-
ステップ 2:モデルサービスの呼び出し
TorchEasyRec モデルサービスをデプロイした後、以下の手順に従ってモデルサービスの表示および呼び出しを行えます:
PAI コンソール にログインします。上部のナビゲーションバーから目的のリージョンを選択します。[モデルデプロイメント] > [Elastic Algorithm Service (EAS)] を選択します。表示されたページで目的のワークスペースを選択し、Elastic Algorithm Service (EAS) をクリックします。
エラスティックアルゴリズムサービス (EAS) ページで、目的のモデルサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。呼び出し方法ダイアログボックスで、モデルサービスのエンドポイントとトークンを確認します。
TorchEasyRec モデルサービスの入力および出力は、Protocol Buffers(protobuf)フォーマットです。FG の使用有無に応じて、モデルサービスの呼び出し方法が異なります。
FG を使用する場合のモデルサービスの呼び出し
以下のいずれかの方法でモデルサービスを呼び出せます:
EAS SDK for Java
コードを実行する前に、Maven 環境を構成してください。詳細については、「SDK for Java」をご参照ください。Java SDK の最新バージョンは、https://github.com/pai-eas/eas-java-sdk から入手できます。alirec_rank_with_fg サービスを呼び出すためのサンプルコードは以下のとおりです:
package com.aliyun.openservices.eas.predict;
import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.proto.TorchRecPredictProtos;
import com.aliyun.openservices.eas.predict.request.TorchRecRequest;
import com.aliyun.openservices.eas.predict.proto.TorchPredictProtos.ArrayProto;
import java.util.*;
public class TorchRecPredictTest {
public static PredictClient InitClient() {
return new PredictClient(new HttpConfig());
}
public static TorchRecRequest buildPredictRequest() {
TorchRecRequest TorchRecRequest = new TorchRecRequest();
TorchRecRequest.appendItemId("7033");
TorchRecRequest.addUserFeature("user_id", 33981,"int");
ArrayList<Double> list = new ArrayList<>();
list.add(0.24689289764507472);
list.add(0.005758482924454689);
list.add(0.6765301324940026);
list.add(0.18137273055602343);
TorchRecRequest.addUserFeature("raw_3", list,"List<double>");
Map<String,Integer> myMap =new LinkedHashMap<>();
myMap.put("866", 4143);
myMap.put("1627", 2451);
TorchRecRequest.addUserFeature("map_1", myMap,"map<string,int>");
ArrayList<ArrayList<Float>> list2 = new ArrayList<>();
ArrayList<Float> innerList1 = new ArrayList<>();
innerList1.add(1.1f);
innerList1.add(2.2f);
innerList1.add(3.3f);
list2.add(innerList1);
ArrayList<Float> innerList2 = new ArrayList<>();
innerList2.add(4.4f);
innerList2.add(5.5f);
list2.add(innerList2);
TorchRecRequest.addUserFeature("click", list2,"list<list<float>>");
TorchRecRequest.addContextFeature("id_2", list,"List<double>");
TorchRecRequest.addContextFeature("id_2", list,"List<double>");
System.out.println(TorchRecRequest.request);
return TorchRecRequest;
}
public static void main(String[] args) throws Exception{
PredictClient client = InitClient();
client.setToken("tokenGeneratedFromService");
client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
client.setModelName("alirec_rank_with_fg");
client.setRequestTimeout(100000);
testInvoke(client);
testDebugLevel(client);
client.shutdown();
}
public static void testInvoke(PredictClient client) throws Exception {
long startTime = System.currentTimeMillis();
TorchRecPredictProtos.PBResponse response = client.predict(buildPredictRequest());
for (Map.Entry<String, ArrayProto> entry : response.getMapOutputsMap().entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
}
public static void testDebugLevel(PredictClient client) throws Exception {
long startTime = System.currentTimeMillis();
TorchRecRequest request = buildPredictRequest();
request.setDebugLevel(1);
TorchRecPredictProtos.PBResponse response = client.predict(request);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
System.out.println(itemId);
System.out.println(genFeas.get(itemId));
}
long endTime = System.currentTimeMillis();
System.out.println("Spend Time: " + (endTime - startTime) + "ms");
}
}
以下のパラメーターに注意してください:
client.setToken("tokenGeneratedFromService"):tokenGeneratedFromService を、モデルサービスのトークン(例:
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****)に置き換えます。client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"):二重引用符で囲まれた内容を、モデルサービスのエンドポイント(例:
175805416243****.cn-beijing.pai-eas.aliyuncs.com)に置き換えます。client.setModelName("alirec_rank_with_fg"):二重引用符で囲まれた内容を、モデルサービスの名前に置き換えます。
EAS SDK for Python
コードを実行する前に、pip install -U eas-prediction --user コマンドを実行して、eas-prediction ライブラリをインストールまたは更新します。詳細については、「SDK for Python」をご参照ください。サンプルコードは以下のとおりです:
from eas_prediction import PredictClient
from eas_prediction.torchrec_request import TorchRecRequest
if __name__ == '__main__':
endpoint = 'http://localhost:6016'
client = PredictClient(endpoint, '<YOUR_SERVICE_NAME>')
client.set_token('<your_service_token>')
client.init()
torchrec_req = TorchRecRequest()
torchrec_req.add_user_fea('user_id', 'u001d', "STRING")
torchrec_req.add_user_fea('age', 12, "INT")
torchrec_req.add_user_fea('weight', 129.8, "FLOAT")
torchrec_req.add_item_id('item_0001')
torchrec_req.add_item_id('item_0002')
torchrec_req.add_item_id('item_0003')
torchrec_req.add_user_fea("raw_3", [0.24689289764507472, 0.005758482924454689, 0.6765301324940026, 0.18137273055602343], "list<double>")
torchrec_req.add_user_fea("raw_4", [0.9965264740966043, 0.659596586238391, 0.16396649403055896, 0.08364986620265635], "list<double>")
torchrec_req.add_user_fea("map_1", {"0":0.37845234405201145}, "map<int,float>")
torchrec_req.add_user_fea("map_2", {"866":4143,"1627":2451}, "map<int,int>")
torchrec_req.add_context_fea("id_2", [866], "list<int>" )
torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
torchrec_req.add_context_fea("id_2", [7022,1], "list<int>" )
torchrec_req.add_user_fea("click", [[0.94433516,0.49145547], [0.94433516, 0.49145597]], "list<list<float>>")
res = client.predict(torchrec_req)
print(res)
以下のパラメーターに注意してください:
endpoint:値をモデルサービスのエンドポイント(例:
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/)に設定します。<your_service_name> をモデルサービスの名前に置き換えます。
<your_service_token> をモデルサービスのトークン(例:
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****)に置き換えます。
FG を使用しない場合のモデルサービスの呼び出し
EAS SDK for Java
コードを実行する前に、Maven 環境を構成する必要があります。詳細については、「SDK for Java」をご参照ください。alirec_rank_no_fg モデルサービスを呼び出すためのサンプルコードは以下のとおりです:
package com.aliyun.openservices.eas.predict;
import java.util.List;
import java.util.Arrays;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TorchDataType;
import com.aliyun.openservices.eas.predict.request.TorchRequest;
import com.aliyun.openservices.eas.predict.response.TorchResponse;
public class Test_Torch {
public static PredictClient InitClient() {
return new PredictClient(new HttpConfig());
}
public static TorchRequest buildPredictRequest() {
TorchRequest request = new TorchRequest();
float[] content = new float[2304000];
for (int i = 0; i < content.length; i++) {
content[i] = (float) 0.0;
}
long[] content_i = new long[900];
for (int i = 0; i < content_i.length; i++) {
content_i[i] = 0;
}
long[] a = Arrays.copyOfRange(content_i, 0, 300);
float[] b = Arrays.copyOfRange(content, 0, 230400);
request.addFeed(0, TorchDataType.DT_INT64, new long[]{300,3}, content_i);
request.addFeed(1, TorchDataType.DT_FLOAT, new long[]{300,10,768}, content);
request.addFeed(2, TorchDataType.DT_FLOAT, new long[]{300,768}, b);
request.addFeed(3, TorchDataType.DT_INT64, new long[]{300}, a);
request.addFetch(0);
request.setDebugLevel(903);
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = InitClient();
client.setToken("tokenGeneratedFromService");
client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com");
client.setModelName("alirec_rank_no_fg");
client.setIsCompressed(false);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
TorchResponse response = null;
try {
response = client.predict(buildPredictRequest());
List<Float> result = response.getFloatVals(0);
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();
}
}以下のパラメーターに注意してください:
client.setToken("tokenGeneratedFromService"):tokenGeneratedFromService を、モデルサービスのトークン(例:
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****)に置き換えます。client.setEndpoint("175805416243****.cn-beijing.pai-eas.aliyuncs.com"):二重引用符で囲まれた内容を、モデルサービスのエンドポイント(例:
175805416243****.cn-beijing.pai-eas.aliyuncs.com)に置き換えます。client.setModelName("alirec_rank_no_fg"):二重引用符で囲まれた内容を、モデルサービスの名前に置き換えます。
EAS SDK for Python
コードを実行する前に、pip install -U eas-prediction --user コマンドを実行して、eas-prediction ライブラリをインストールまたは更新します。詳細については、「SDK for Python」をご参照ください。alirec_rank_no_fg モデルサービスを呼び出すためのサンプルコードは以下のとおりです:
from eas_prediction import PredictClient
from eas_prediction import TorchRequest
# snappy data
req = TorchRequest(False)
req.add_feed(0, [300, 3], TorchRequest.DT_INT64, [1] * 900)
req.add_feed(1, [300, 10, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 768000)
req.add_feed(2, [300, 768], TorchRequest.DT_FLOAT, [1.0] * 3 * 76800)
req.add_feed(3, [300], TorchRequest.DT_INT64, [1] * 300)
client = PredictClient('<your_endpoint>', '<your_service_name>')
client.set_token('<your_service_token>')
client.init()
resp = client.predict(req)
print(resp)
以下のパラメーターに注意してください:
<your_endpoint> をモデルサービスのエンドポイント(例:
http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/)に置き換えます。<your_service_name> をモデルサービスの名前に置き換えます。
<your_service_token> をモデルサービスのトークン(例:
MmFiMDdlO****wYjhhNjgwZmZjYjBjMTM1YjliZmNkODhjOGVi****)に置き換えます。
モデルサービスを呼び出した際の状態コードの詳細については、「状態コード」をご参照ください。また、カスタムサービスリクエストを作成することもできます。詳細については、「リクエスト構文」をご参照ください。
リクエスト構文
クライアント側でモデルサービスを呼び出す場合、.proto ファイルから予測コードを手動で生成する必要があります。カスタムサービスリクエストのコードを生成するには、以下の protobuf 定義を使用します:
pytorch_predict.proto:Torch モデルの protobuf 定義
syntax = "proto3";
package pytorch.eas;
option cc_enable_arenas = true;
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchPredictProtos";
enum ArrayDataType {
// Not a legal value for DataType. Used to indicate a DataType field
// has not been set.
DT_INVALID = 0;
// Data types that all computation devices are expected to be
// capable to support.
DT_FLOAT = 1;
DT_DOUBLE = 2;
DT_INT32 = 3;
DT_UINT8 = 4;
DT_INT16 = 5;
DT_INT8 = 6;
DT_STRING = 7;
DT_COMPLEX64 = 8; // Single-precision complex
DT_INT64 = 9;
DT_BOOL = 10;
DT_QINT8 = 11; // Quantized int8
DT_QUINT8 = 12; // Quantized uint8
DT_QINT32 = 13; // Quantized int32
DT_BFLOAT16 = 14; // Float32 truncated to 16 bits. Only for cast ops.
DT_QINT16 = 15; // Quantized int16
DT_QUINT16 = 16; // Quantized uint16
DT_UINT16 = 17;
DT_COMPLEX128 = 18; // Double-precision complex
DT_HALF = 19;
DT_RESOURCE = 20;
DT_VARIANT = 21; // Arbitrary C++ data types
}
// Dimensions of an array
message ArrayShape {
repeated int64 dim = 1 [packed = true];
}
// Protocol buffer representing an array
message ArrayProto {
// Data Type.
ArrayDataType dtype = 1;
// Shape of the array.
ArrayShape array_shape = 2;
// DT_FLOAT.
repeated float float_val = 3 [packed = true];
// DT_DOUBLE.
repeated double double_val = 4 [packed = true];
// DT_INT32, DT_INT16, DT_INT8, DT_UINT8.
repeated int32 int_val = 5 [packed = true];
// DT_STRING.
repeated bytes string_val = 6;
// DT_INT64.
repeated int64 int64_val = 7 [packed = true];
}
message PredictRequest {
// Input tensors.
repeated ArrayProto inputs = 1;
// Output filter.
repeated int32 output_filter = 2;
// Input tensors for rec
map<string, ArrayProto> map_inputs = 3;
// debug_level for rec
int32 debug_level = 100;
}
// Response for PredictRequest on successful run.
message PredictResponse {
// Output tensors.
repeated ArrayProto outputs = 1;
// Output tensors for rec.
map<string, ArrayProto> map_outputs = 2;
}
torchrec_predict.proto:Torch モデルおよび FG の protobuf 定義
syntax = "proto3";
option go_package = ".;torch_predict_protos";
option java_package = "com.aliyun.openservices.eas.predict.proto";
option java_outer_classname = "TorchRecPredictProtos";
package com.alibaba.pairec.processor;
import "pytorch_predict.proto";
//long->others
message LongStringMap {
map<int64, string> map_field = 1;
}
message LongIntMap {
map<int64, int32> map_field = 1;
}
message LongLongMap {
map<int64, int64> map_field = 1;
}
message LongFloatMap {
map<int64, float> map_field = 1;
}
message LongDoubleMap {
map<int64, double> map_field = 1;
}
//string->others
message StringStringMap {
map<string, string> map_field = 1;
}
message StringIntMap {
map<string, int32> map_field = 1;
}
message StringLongMap {
map<string, int64> map_field = 1;
}
message StringFloatMap {
map<string, float> map_field = 1;
}
message StringDoubleMap {
map<string, double> map_field = 1;
}
//int32->others
message IntStringMap {
map<int32, string> map_field = 1;
}
message IntIntMap {
map<int32, int32> map_field = 1;
}
message IntLongMap {
map<int32, int64> map_field = 1;
}
message IntFloatMap {
map<int32, float> map_field = 1;
}
message IntDoubleMap {
map<int32, double> map_field = 1;
}
// list
message IntList {
repeated int32 features = 1;
}
message LongList {
repeated int64 features = 1;
}
message FloatList {
repeated float features = 1;
}
message DoubleList {
repeated double features = 1;
}
message StringList {
repeated string features = 1;
}
// lists
message IntLists {
repeated IntList lists = 1;
}
message LongLists {
repeated LongList lists = 1;
}
message FloatLists {
repeated FloatList lists = 1;
}
message DoubleLists {
repeated DoubleList lists = 1;
}
message StringLists {
repeated StringList lists = 1;
}
message PBFeature {
oneof value {
int32 int_feature = 1;
int64 long_feature = 2;
string string_feature = 3;
float float_feature = 4;
double double_feature=5;
LongStringMap long_string_map = 6;
LongIntMap long_int_map = 7;
LongLongMap long_long_map = 8;
LongFloatMap long_float_map = 9;
LongDoubleMap long_double_map = 10;
StringStringMap string_string_map = 11;
StringIntMap string_int_map = 12;
StringLongMap string_long_map = 13;
StringFloatMap string_float_map = 14;
StringDoubleMap string_double_map = 15;
IntStringMap int_string_map = 16;
IntIntMap int_int_map = 17;
IntLongMap int_long_map = 18;
IntFloatMap int_float_map = 19;
IntDoubleMap int_double_map = 20;
IntList int_list = 21;
LongList long_list =22;
StringList string_list = 23;
FloatList float_list = 24;
DoubleList double_list = 25;
IntLists int_lists = 26;
LongLists long_lists =27;
StringLists string_lists = 28;
FloatLists float_lists = 29;
DoubleLists double_lists = 30;
}
}
// context features
message ContextFeatures {
repeated PBFeature features = 1;
}
// PBRequest specifies the request for aggregator
message PBRequest {
// debug mode
int32 debug_level = 1;
// user features, key is user input name
map<string, PBFeature> user_features = 2;
// item ids
repeated string item_ids = 3;
// context features for each item, key is context input name
map<string, ContextFeatures> context_features = 4;
// number of nearest neighbors(items) to retrieve
// from faiss
int32 faiss_neigh_num = 5;
// item features for each item, key is item input name
map<string, ContextFeatures> item_features = 6;
}
// PBResponse specifies the response for aggregator
message PBResponse {
// torch output tensors
map<string, pytorch.eas.ArrayProto> map_outputs = 1;
// fg ouput features
map<string, string> generate_features = 2;
// all fg input features
map<string, string> raw_features = 3;
// item ids
repeated string item_ids = 4;
}
以下の表では、debug_level パラメーターについて説明します。
デフォルトでは、debug_level パラメーターを構成する必要はありません。デバッグが必要な場合にのみ、このパラメーターを構成してください。
debug_level | 説明 |
0 | モデルサービスが正常に呼び出されました。 |
1 | 通常モードでは、FG の入力および出力に対して形状検証が実行され、入力および出力特徴量が保存されます。 |
2 | 通常モードでは、FG の入力および出力に対して形状検証が実行され、入力および出力特徴量が保存され、モデルサービスの入力テンソルが保存されます。 |
100 | 通常モードでは、モデルサービスの呼び出しリクエストが保存されます。 |
102 | 通常モードでは、FG の入力および出力に対して形状検証が実行され、入力および出力特徴量が保存され、モデルサービスの入力テンソルおよびユーザー埋め込み情報が保存されます。 |
903 | モデルサービスの呼び出しに要する各フェーズの実行時間が表示されます。 |
状態コード
以下の表では、TorchEasyRec モデルサービスを呼び出した際に返される状態コードについて説明します。状態コードの詳細については、「付録:サービスの状態コードおよび一般的なエラー」をご参照ください。
状態コード | 説明 |
200 | モデルサービスが正常に呼び出されました。 |
400 | リクエスト情報が不正です。 |
500 | モデルサービスの呼び出しに失敗しました。詳細については、サービスログをご参照ください。 |