すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:TorchEasyRec プロセッサ

最終更新日:Jan 06, 2026

Platform for AI (PAI) の Elastic Algorithm Service (EAS) は、組み込みの TorchEasyRec プロセッサを提供します。このプロセッサは、TorchEasyRec または Torch 推奨モデルをスコアリングサービスとしてデプロイすることを容易にし、特徴量エンジニアリング機能を統合します。TorchEasyRec プロセッサを使用して、特徴量エンジニアリングと Torch モデルに最適化された、パフォーマンスの高いスコアリングサービスをデプロイできます。このトピックでは、TorchEasyRec モデルサービスをデプロイして呼び出す方法について説明します。

背景情報

次の図は、TorchEasyRec プロセッサに基づく推奨エンジンのアーキテクチャを示しています。

TorchEasyRec プロセッサには、次のモジュールが含まれています。

  • Item Feature Cache:このモジュールは、FeatureStore からアイテムの特徴量をメモリにキャッシュします。これにより、頻繁なリクエスト操作による FeatureStore の負荷が軽減され、推論サービスのパフォーマンスが向上します。アイテム特徴量にリアルタイム特徴量が含まれている場合、FeatureStore はリアルタイム特徴量を同期します。

  • Feature Generator (FG):このモジュールは、設定ファイルを使用して特徴量エンジニアリングプロセスを定義し、C++ コードのコレクションを使用してリアルタイムおよびオフラインの特徴量エンジニアリングの一貫性を確保します。

  • TorchModelTorchEasyRec または 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

  • FG および FeatureStore Item Feature Cache モジュールを追加。

  • Torch モデルの CPU または GPU 推論をサポート。

  • INPUT_TILE パラメーターで指定された自動ブロードキャストをサポート。

  • Faiss ベクトルリコールをサポート。

  • ノーマルモードでのウォームアップをサポート。

easyrec-torch-0.2

20240930

2.4

0.2.9

  • FeatureDB の複合型をサポート。

  • FeatureStore でのデータ初期化を高速化。

  • バイパスモードでのデバッグレベルを最適化。

  • H2D を最適化。

easyrec-torch-0.3

20241014

2.4

0.2.9

  • FeatureStore の JSON 初期化をサポート。

  • .proto ファイルを再定義。

easyrec-torch-0.4

20241028

2.4

0.3.1

  • FG の複雑な問題を修正。

easyrec-torch-0.5

20241114

2.4

0.3.1

  • デバッグモードを設定すると、アイテムが存在するかどうかに関係なく FG を使用して特徴量が生成されるオンラインとオフラインの一貫性ロジックを最適化。

easyrec-torch-0.6

20241118

2.4

0.3.6

  • 冗長なヘッダーファイルを削除してパッケージングプロセスを最適化。

easyrec-torch-0.7

20241206

2.5

0.3.9

  • 複数のプライマリキーの配列形式でのデータ入力をサポート。

  • Torch バージョンを 2.5 にアップグレード。

  • FG バージョンを 0.3.9 にアップグレード。

easyrec-torch-0.8

20241225

2.5

0.3.9

  • TensorRT SDK バージョンを 2.5 にアップグレード。

  • TorchEasyRec モデルの INT64 型の入力データをサポート。

  • FeatureStore バージョンをアップグレードして、Hologres での特徴量クエリに関連する問題を解決。

  • デバッグの操作効率とロジックを最適化。

  • Protobuf に item_features を追加し、リクエストメッセージにアイテム特徴量を含めることをサポート。

easyrec-torch-0.9

20250115

2.5

0.4.1

  • FG バージョンを 0.4.1 にアップグレードし、マルチスレッド FG ハンドラーの初期化時間を最適化。

easyrec-torch-1.0

20250206

2.5

0.4.2

  • 重み付き特徴量 (Weighted Feature) をサポート。

  • FG バージョンを 0.4.2 にアップグレード。

  • AMD CPU をサポート。

easyrec-torch-1.1

20250423

2.5

0.5.9

  • FeatureStore SDK をアップグレードし、VPC ダイレクト接続のサポートを追加。このアップグレードには、`event_time` と `ttl` に基づくメモリ内のリアルタイム特徴量の有効期限データのフィルタリングも含まれます。

  • Feature Generator (FG) バージョンをアップグレードし、カスタムシーケンス特徴量のサポートを追加し、コンボ特徴量に関連する問題を解決。

easyrec-torch-1.5

20250918

2.5

0.7.3

  • FG をバージョン 0.7.3 にアップグレードし、オンラインリクエストを使用したモデルのウォームアップを有効化。

  • FeatureStore SDK をアップグレードし、3 レベルテーブルの MaxCompute スキーマ、ゼロトラストの AK なし呼び出し、および特徴量ビューへの特徴量追加の互換性をサポート。

easyrec-torch-1.6

20251021

2.5

0.7.4

  • 大量のコールバックリクエストによって引き起こされる過剰なログ出力を防ぎ、パフォーマンスへの影響を回避するためにログ制御を最適化。

  • コンテキスト特徴量を改善。

  • 特徴量前処理と FG の間で同じスレッドプールを共有することで、スレッドリソースを節約。

  • FG をバージョン 0.7.4 にアップグレード。

easyrec-torch-1.7

20251104

2.5

0.7.4

  • コールバックによってトリガーされる過剰なファイル書き込みを回避するために、デバッグテンソルを保存するロジックを最適化。

easyrec-torch-1.8

20251201

2.5

0.7.4

  • リソース制限によるスレッド作成の失敗を防ぐために、Feature Store SDK のスレッドプールを最適化。

手順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 フィールドが存在しない場合、model_configfaiss_neigh_num フィールドの値が使用されます。デフォルト値: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

  2. TorchEasyRec モデルサービスをデプロイします。次のいずれかのデプロイ方法を使用できます。

    (推奨) JSON を使用したモデルサービスのデプロイ

    次の手順を実行します。

    1. PAI コンソールにログインします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、Elastic Algorithm Service (EAS) をクリックします。

    2. [Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。[サービスのデプロイ] ページで、[カスタムモデルのデプロイ] セクションの [JSON デプロイメント] をクリックします。

    3. [JSON デプロイ] ページで、準備した JSON 設定ファイルの内容を JSON テキストエディターに入力し、デプロイ をクリックします。

    EASCMD クライアントを使用したモデルサービスのデプロイ

    1. EASCMD クライアントをダウンロードし、ID 認証を完了します。この例では、Windows 64 を使用します。

    2. クライアントを起動し、JSON 設定ファイルが配置されているディレクトリで次のコマンドを実行して、モデルサービスを作成します。詳細については、「EASCMD クライアントを使用するためのコマンドの実行」をご参照ください。

      eascmdwin64.exe create <service.json>

      <service.json> を、作成した JSON 設定ファイルの名前 (例:torcheasyrec.json) に置き換えます。

手順2:モデルサービスの呼び出し

TorchEasyRec モデルサービスをデプロイした後、次の手順を実行してモデルサービスを表示および呼び出すことができます。

  1. PAI コンソールにログインします。上部のナビゲーションバーで、目的のリージョンを選択します。[モデルデプロイ] > [Elastic Algorithm Service (EAS)] を選択します。表示されたページで、目的のワークスペースを選択し、Elastic Algorithm Service (EAS) をクリックします。

  2. Elastic Algorithm Service (EAS) ページで、目的のモデルサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。「呼び出し方法」ダイアログボックスで、モデルサービスのエンドポイントとトークンを確認します。image

TorchEasyRec モデルサービスの入力と出力は、Protocol Buffers (protobuf) 形式です。FG が使用されているかどうかに基づいてモデルサービスを呼び出すことができます。

FG を使用する場合のモデルサービスの呼び出し

次のいずれかの方法でモデルサービスを呼び出すことができます。

Java 用 EAS SDK

コードを実行する前に、Maven 環境を設定します。詳細については、「Java 用 SDK」をご参照ください。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"):二重引用符で囲まれた内容をモデルサービスの名前に置き換えます。

Python 用 EAS SDK

コードを実行する前に、pip install -U eas-prediction --user コマンドを実行して eas-prediction ライブラリをインストールまたは更新します。詳細については、「Python 用 SDK」をご参照ください。サンプルコード:

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 を使用しない場合のモデルサービスの呼び出し

Java 用 EAS SDK

コードを実行する前に、Maven 環境を設定する必要があります。詳細については、「Java 用 SDK」をご参照ください。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"):二重引用符で囲まれた内容をモデルサービスの名前に置き換えます。

Python 用 EAS SDK

コードを実行する前に、pip install -U eas-prediction --user コマンドを実行して eas-prediction ライブラリをインストールまたは更新します。詳細については、「Python 用 SDK」をご参照ください。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

モデルサービスの呼び出しに失敗しました。詳細については、サービスログをご参照ください。