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

Platform For AI:TorchEasyRec プロセッサ

最終更新日:Feb 06, 2026

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

  • FG および FeatureStore アイテム特徴量キャッシュモジュールを追加。

  • 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

  • VPC 直接接続をサポートするために FeatureStore SDK をアップグレード。また、event_time および ttl に基づくリアルタイム特徴量の有効期限切れデータをメモリ上でフィルタリングする機能を追加。

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

easyrec-torch-1.5

20250918

2.5

0.7.3

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

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

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

  • リソース制限によるスレッド作成失敗を防止するため、特徴量ストア SDK のスレッドプールを最適化。

asyrec-torch-1.9

20260109

2.5

1.0.0

  • CUDA マルチストリームを GPU 推論に導入し、システムのスループットおよびパフォーマンスを向上。

  • fg を 1.0.0 にアップグレード。

easyrec-torch-1.10

20260123

2.5

1.0.1

  • 遅延リクエストの実行時間をログに自動記録。

  • 遅延リクエストのリクエストデータを保存するための構成パラメーターを追加可能。

ステップ 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

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

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

    以下の手順を実行します:

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

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

    3. JSON デプロイメントページで、事前に準備した JSON 構成ファイルの内容を JSON テキストエディターに入力し、デプロイ をクリックします。

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

    1. クライアントのダウンロードおよび認証を行います。本例では 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. エラスティックアルゴリズムサービス (EAS) ページで、目的のモデルサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。呼び出し方法ダイアログボックスで、モデルサービスのエンドポイントとトークンを確認します。image

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

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