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

Platform For AI:EasyRec プロセッサ

最終更新日:Mar 31, 2026

Elastic Algorithm Service (EAS) には、EasyRec または TensorFlow でトレーニングされたレコメンデーションモデルを、特徴量エンジニアリングと統合されたスコアリングサービスとしてデプロイするための組み込み EasyRec プロセッサが備わっています。このプロセッサは、特徴量エンジニアリングと TensorFlow モデルを共同で最適化し、パフォーマンス専有型のスコアリングサービスを提供します。本トピックでは、EasyRec モデルサービスのデプロイおよび呼び出し方法について説明します。

背景情報

EasyRec プロセッサは、PAI-EAS プロセッサ仕様に基づいて開発された推論サービスです (C または C++ を使用したカスタムプロセッサの開発)。主に以下の 2 つのシナリオで使用されます。

  • 特徴量生成の概要と構成 (FG) および EasyRec を使用してトレーニングされたディープラーニングモデルの場合、EasyRec プロセッサによりスコアリング性能が大幅に向上します。これは、アイテム特徴量をメモリ内にキャッシュし、特徴量変換および推論性能を最適化することによって実現されます。また、このソリューションではフィーチャーストアを使用してオンラインおよびリアルタイム特徴量を管理します。PAI-Rec レコメンデーションシステム開発プラットフォーム のカスタムソリューションを使用することで、PAI-Rec エンジン が必要なコードを自動生成し、トレーニングからデプロイメントまでのワークフロー全体を効率化します。これにより、サービスのリリースが加速され、コストが削減され、開発効率が向上します。

  • EasyRec または TensorFlow でトレーニングされたモデルを、特徴量ジェネレーターを使用せずにサービスとしてデプロイすることも可能です。この場合、EasyRec プロセッサをバイパスモードで呼び出します。

次の図は、EasyRec プロセッサに基づくレコメンデーションエンジンのアーキテクチャを示しています。

easyrec

注:このアーキテクチャは、オフラインデータのソースとして MaxCompute をサポートしています。

EasyRec プロセッサには、以下の主要モジュールが含まれています。

  • アイテム特徴量キャッシュ:フィーチャーストアからの特徴量をメモリ内にキャッシュし、ネットワークオーバーヘッドおよびフィーチャーストアへの負荷を軽減します。また、リアルタイム特徴量などの増分更新にも対応しています。

  • 特徴量ジェネレーター:この特徴量エンジニアリングモジュール (特徴量生成の概要と構成) は、オフラインおよびオンラインでの特徴量処理の一貫性を確保するために、同一の実装を使用しています。淘宝 (タオバオ) で実証済みの特徴量エンジニアリングソリューションを実装しています。FG の概念の詳細については、「EasyRec におけるデータフィールド、データ特徴量、FG 特徴量の概念」をご参照ください。FG 演算子のカスタマイズおよび拡張方法については、「特徴量演算子のカスタマイズ」をご参照ください。

  • TFModel:EasyRec によってエクスポートされた Saved_Model ファイルをロードし、ブレードを使用して CPU および GPU 上での推論を最適化します。

  • フィーチャー インストルメンテーション および インクリメンタル モデル更新 モジュール:これらのモジュールは、通常、リアルタイム トレーニング シナリオで使用されます。詳細については、「リアルタイム トレーニング」をご参照ください。

制限事項

CPU 推論:Intel CPU を搭載した汎用インスタンスファミリー g6、g7、および g8 のみでサポートされています。

GPU 推論:T4、A10、GU30、L20、3090、および 4090 GPU でサポートされていますが、P100 はサポートされていません。

詳細については、「汎用 (g シリーズ)」をご参照ください。

バージョン一覧

EasyRec プロセッサは現在アクティブに開発中です。新機能および推論性能の向上のために、最新バージョンを使用して推論サービスをデプロイすることを推奨します。

プロセッサ名

リリース日

TensorFlow バージョン

新機能

easyrec

20230608

2.10

  • FeatureGenerator およびアイテム特徴量キャッシュをサポート。

  • オンラインディープラーニングをサポート。

  • Faiss ベクター取得をサポート。

  • GPU 推論をサポート。

easyrec-1.2

20230721

2.10

  • 重み付きカテゴリ埋め込みを最適化。

easyrec-1.3

20230802

2.10

  • MaxCompute からアイテム特徴量をアイテム特徴量キャッシュにロードすることをサポート。

easyrec-1.6

20231006

2.10

  • 自動特徴量拡張をサポート。

  • GPU 配置を最適化。

  • save_req を使用してリクエストをモデルディレクトリに保存することをサポート。

easyrec-1.7

20231013

2.10

  • Keras モデルのパフォーマンスを最適化。

easyrec-1.8

20231101

2.10

  • フィーチャーストアのクラウドホスト版をサポート。

easyrec-kv-1.8

20231220

DeepRec

(deeprec2310)

  • DeepRec EmbeddingVariable をサポート。

easyrec-1.9

20231222

2.10

  • TagFeature および RawFeature のグラフ最適化の問題を修正。

easyrec-2.4

20240826

2.10

  • フィーチャーストア C++ SDK で、FeatureDB をサポートしています。

  • フィーチャーストア C++ SDK で STS トークンをサポート。

  • リクエストに対する double (float64) データの型をサポート。

easyrec-2.9

20250718

2.10

  • 新しい FeatureGenerator ライブラリ v0.7.0 を統合。

easyrec-3.0

20251025

2.10

  • 新しい FeatureGenerator ライブラリ v0.7.4 を統合。

  • パフォーマンスを改善。

  • 更新された FeatureGenerator ライブラリにおける新規演算子の解析エラーを修正。

easyrec-3.1

20260116

2.10.1

  • FeatureGenerator ライブラリをバージョン 1.0.1 にアップグレード。

  • フィーチャーストア SDK をバージョン 20251117 にアップグレード。

  • その他のバグ修正を含む。

手順 1: サービスをデプロイする

eascmd クライアントを使用して EasyRec モデルサービスをデプロイするには、processor タイプを easyrec-{version} に設定する必要があります。クライアントを使用したサービスのデプロイの詳細については、「サービスデプロイメント:EASCMD」をご参照ください。以下のセクションでは、サービス構成ファイルの例を示します。

例:新規 FeatureGenerator ライブラリ (fg_mode=normal)

以下の例は、PyOdps3 ノードタイプを使用したデプロイ方法を示しています。このモードでは、新しいバージョンの FeatureGenerator を使用でき、豊富な組み込み特徴量変換演算子を提供し、FeatureGenerator 演算子のカスタマイズを可能にし、配列やマップなどの複雑な型の入力特徴量をサポートし、有向非循環グラフ (DAG) モードで特徴量間の依存関係を処理します。

この例では、PAI-FeatureStore を使用して特徴量データを管理しています。スクリプト内で、${fs_project} and ${fs_model} 変数を実際の値に置き換えてください。詳細については、「ステップ 2:PAI-EAS モデルサービスの作成およびデプロイ」をご参照ください。

import json
import os

service_name = 'ali_rec_rnk_with_fg'

config = {
  'name': service_name,
  'metadata': {
    "cpu": 8,
    #"cuda": "11.2",
    "gateway": "default",
    "gpu": 0,
    "memory": 32000,
    "rolling_strategy": {
        "max_unavailable": 1
    },
    "rpc": {
        "enable_jemalloc": 1,
        "max_queue_size": 256
    }
  },
  "processor_envs": [
    {
      "name": "ADAPTE_FG_CONFIG",
      "value": "true"
    }
  ],
  "model_path": "",
  "processor": "easyrec-3.1",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20250722/export/final_with_fg"
      }
    }
  ],
  # fg_mode を変更する場合、呼び出し方法も変更する必要があります。
  # fg_mode が normal または tf に設定されている場合は、EasyRecRequest SDK を使用します。
  # fg_mode が bypass に設定されている場合は、TFRequest SDK を使用します。
  'model_config': {
    'outputs': 'probs_ctr,probs_cvr',
    'fg_mode': 'normal',
    'steady_mode': True,
    'period': 2880,
    'access_key_id': f'{o.account.access_id}',
    'access_key_secret': f'{o.account.secret_access_key}',
    "load_feature_from_offlinestore": True,
    'region': 'cn-shanghai',
    'fs_project': '${fs_project}',
    'fs_model': '${fs_model}',
    'fs_entity': 'item',
    'featuredb_username': 'guest',
    'featuredb_password': '123456',
    'log_iterate_time_threshold': 100,
    'iterate_featuredb_interval': 5,
    'mc_thread_pool_num': 1,
  }
}

with open('echo.json', 'w') as output_file:
    json.dump(config, output_file)

os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com create echo.json')
# os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com modify {service_name} -s echo.json')

注:featuredb_username および featuredb_password パラメーターの値を、有効なユーザー名およびパスワードに置き換えてください。

例:FG の TF 演算子モード (fg_mode=tf)

注:FeatureGenerator の TF 演算子バージョンは、限定された組み込み特徴量のみをサポートしていますid_feature, raw_feature, combo_feature, lookup_feature, match_feature, sequence_feature。カスタム FeatureGenerator 演算子はサポートされていません。

以下の例は、シェルスクリプトを使用したデプロイ方法を示しています。スクリプトには AccessKeyID および AccessKeySecret がプレーンテキストで含まれています。この方法はシンプルですが、PAI-FeatureStore を使用しておらず、Hologres への負荷を軽減するために MaxCompute からテーブルデータをロードする方法についても説明していません。

PAI-FeatureStore を使用し、MaxCompute からデータをロードすることを推奨します。詳細については、「ステップ 2:PAI-EAS モデルサービスの作成およびデプロイ」をご参照ください。参照ドキュメントでは、Python スクリプト、DataWorks 組み込みオブジェクト o、および一時的な Security Token Service (STS) トークンを使用した、より安全なデプロイ方法を紹介しています。その例では、load_feature_from_offlinestoreTrue に設定されています。

bizdate=$1
# fg_mode を変更する場合、呼び出し方法も変更する必要があります。fg_mode が normal または tf に設定されている場合は、EasyRecRequest SDK を使用します。fg_mode が bypass に設定されている場合は、TFRequest SDK を使用します。
cat << EOF > echo.json
{
  "name":"ali_rec_rnk_with_fg",
  "metadata": {
    "instance": 2,
    "rpc": {
      "enable_jemalloc": 1,
      "max_queue_size": 100
    }
  },
  "cloud": {
    "computing": {
      "instance_type": "ecs.g7.large",
      "instances": null
    }
  },
  "model_config": {
    "remote_type": "hologres",
    "url": "postgresql://<AccessKeyID>:<AccessKeySecret>@<domain_name>:<port>/<database>",
    "tables": [{"name":"<schema>.<table_name>","key":"<index_column_name>","value": "<column_name>"}],
    "period": 2880,
    "fg_mode": "tf",
    "outputs":"probs_ctr,probs_cvr",
  },
  "model_path": "",
  "processor": "easyrec-3.1",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final_with_fg"
      }
    }
  ]
}

EOF
# デプロイコマンドを実行します。
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# 更新コマンドを実行します。
eascmd update ali_rec_rnk_with_fg -s echo.json

例: FeatureGenerator を使用しないでください (fg_mode=bypass)

FeatureGenerator を使用しない場合は、EasyRec プロセッサを呼び出す前にリクエストをアセンブルする必要があります。詳細については、「EasyRec トレーニングを使用せずに PAI-EAS で推論サービスを統合する」をご参照ください。

bizdate=$1
# fg_mode を変更する場合、呼び出し方法も変更する必要があります。fg_mode が normal または tf に設定されている場合は、EasyRecRequest SDK を使用します。fg_mode が bypass に設定されている場合は、TFRequest SDK を使用します。
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"
  },
  "processor": "easyrec-3.1",
  "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
# デプロイコマンドを実行します。
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# 更新コマンドを実行します。
eascmd update ali_rec_rnk_no_fg -s echo.json

以下の表は、主なパラメーターについて説明しています。その他のパラメーターについては、「JSON デプロイメント」をご参照ください。

パラメーター

必須

説明

processor

はい

EasyRec プロセッサ。

"processor": "easyrec-3.1"

fg_mode

はい

特徴量エンジニアリングモードを指定します。選択したモードに基づいて、対応する SDK およびリクエスト構築方法を使用する必要があります

  • normal(推奨)

    • 説明:FeatureGenerator ライブラリを使用して特徴量変換を実行し、その出力をモデルに渡します。このモードは、豊富な組み込み FeatureGenerator 演算子を提供し、カスタム演算子をサポートし、DAG で特徴量依存関係を処理します。

    • 呼び出し方法:クライアントは EasyRecRequest SDK を使用し、ユーザー ID やアイテム ID リストなどの高レベル特徴量のみを渡す必要があります。

  • tf

    • 説明:FeatureGenerator を TensorFlow 演算子として TensorFlow 計算グラフに埋め込み、グラフ最適化を実行してパフォーマンスを向上させます。

    • 呼び出し方法normal モードと同じです。クライアントは EasyRecRequest SDK を使用する必要があります。

  • bypass

    • 説明:組み込み FeatureGenerator をスキップします。サービスは純粋な TensorFlow モデル推論エンジンとして動作します。このモードは、カスタム特徴量処理が必要なシナリオに適しています。アイテム特徴量キャッシュまたはプロセッサによる PAI-FeatureStore アクセスに関連するパラメーターを構成する必要はありません。

    • 呼び出し方法:クライアントは TFRequest SDK を使用する必要があります。クライアントは、モデルに必要なすべての生特徴量データを準備およびアセンブルし、テンソル形式に整理する必要があります。このモードは、外部特徴量処理システムを持つ上級ユーザーに適しています。

"fg_mode": "normal"

outputs

はい

TensorFlow モデルによって予測される出力変数の名前 (例:probs_ctr)。複数の名前を指定する場合は、カンマ (,) で区切ります。出力変数名が不明な場合は、TensorFlow コマンド saved_model_cli を実行して確認してください。

"outputs":"probs_ctr,probs_cvr"

save_req

いいえ

リクエストから取得したデータファイルをモデルディレクトリに保存するかどうかを指定します。保存されたファイルは、サービスのウォームアップおよび性能テストに使用できます。有効値:

  • true:ファイルを保存します。

  • false (デフォルト):ファイルを保存しません。本番環境では、パフォーマンスの低下を避けるためにこのパラメーターを false に設定してください。

"save_req": "false"

アイテム特徴量キャッシュパラメーター

period

はい

アイテム特徴量キャッシュ内の特徴量を定期的に更新する間隔。単位:分。アイテム特徴量が毎日更新される場合、このパラメーターを 1 日以上 (例:2880 (1 日あたり 1,440 分)) に設定できます。この場合、特徴量は毎日のサービス更新時にリフレッシュされるため、日中の更新は不要です。

"period": 2880

remote_type

はい

アイテム特徴量のデータソース。有効値:

  • hologres:SQL インターフェイスを使用してデータの読み取りおよび書き込みを行います。大量のデータの保存およびクエリに適しています。

  • none:アイテム特徴量キャッシュを使用しません。アイテム特徴量はリクエストで渡されます。この場合、tables[] に設定します。

"remote_type": "hologres"

tables

いいえ

アイテム特徴量テーブル。remote_typehologres に設定されている場合に必要です。以下のサブパラメーターが含まれます。

  • key:必須。item_id 列の名前。

  • name:必須。特徴量テーブルの名前。

  • value:任意。ロードする列の名前。複数の列名を指定する場合は、カンマ (,) で区切ります。

  • condition:任意。アイテムをフィルタリングするための WHERE 句。例:style_id<10000

  • timekey:任意。増分更新のためのタイムスタンプまたは整数値を含む列を指定します。サポートされる形式:timestamp および int

  • static:任意。特徴量が静的であり、定期的な更新が不要であることを示します。

複数のテーブルからアイテムデータを読み取ることができます。形式は以下のとおりです。

"tables": [{"key":"table1", ...},{"key":"table2", ...}]

テーブルに同じ名前の列がある場合、配列で後ろに記述されたテーブルの列が、前に記述されたテーブルの列を上書きします。

"tables": {

"key": "goods_id",

"name": "public.ali_rec_item_feature"

}

url

いいえ

Hologres のアクセスアドレス。

"url": "postgresql://LTAI************@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec"

プロセッサによる PAI-FeatureStore アクセスのためのパラメーター

fs_project

いいえ

PAI-FeatureStore プロジェクトの名前。PAI-FeatureStore を使用する場合は、このパラメーターが必要です。詳細については、「フィーチャーストアプロジェクトの構成」をご参照ください。

"fs_project": "fs_demo"

fs_model

いいえ

PAI-FeatureStore 内のモデル特徴量の名前。

"fs_model": "fs_rank_v1"

fs_entity

いいえ

PAI-FeatureStore 内のエンティティの名前。

"fs_entity": "item"

region

いいえ

PAI-FeatureStore が配置されているリージョン。

"リージョン": "cn-beijing"

access_key_id

いいえ

PAI-FeatureStore にアクセスするための AccessKey ID。

"access_key_id": "xxxxx"

access_key_secret

いいえ

PAI-FeatureStore にアクセスするための AccessKey Secret。

"access_key_secret": "xxxxx"

featuredb_username

いいえ

FeatureDB のユーザー名。

"featuredb_username": "xxxxx"

featuredb_password

いいえ

FeatureDB のパスワード。

"featuredb_password": "xxxxx"

load_feature_from_offlinestore

いいえ

PAI-FeatureStore のオフラインストアから直接オフライン特徴量を取得するかどうかを指定します。有効値:

  1. True:PAI-FeatureStore オフラインストア (MaxCompute) からデータを取得します。

  2. False (デフォルト):PAI-FeatureStore オンラインストアからデータを取得します。

"load_feature_from_offlinestore": True

iterate_featuredb_interval

いいえ

リアルタイム統計特徴量の更新間隔。単位:秒。

更新間隔を短くすると、特徴量のリアルタイム性能が向上しますが、リアルタイム特徴量が頻繁に変化する場合、読み取りコストが増加する可能性があります。精度とコストのバランスを考慮してください。

"iterate_featuredb_interval": 5

input_tile:自動特徴量拡張パラメーター

INPUT_TILE

いいえ

INPUT_TILE 環境変数を 1 に設定すると、アイテム特徴量の自動ブロードキャストが有効になります。単一リクエスト内で同じ値を持つ特徴量 (user_id など) については、単一の値のみを渡すことができます。INPUT_TILE 環境変数を 2 に設定すると、tile 操作がさらに遅延され、特徴量埋め込みのクエリ後に実行されるため、計算負荷がさらに軽減されます。

  • メリット:リクエストサイズ、ネットワーク伝送時間、および計算時間を削減します。

  • 有効化方法:INPUT_TILE 環境変数を 1 または 2 に設定します。

説明
  • この最適化は、EasyRec 1.3 以降のバージョンでサポートされています。

  • fg_modetf に設定されている場合、この最適化は自動的に有効になります。この環境変数を設定する必要はありません。

  • fg_modenormal に設定されている場合、EasyRec 2.9 以降のバージョンでは INPUT_TILE が自動的に 1 に設定されます。

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

 }

]

ADAPTE_FG_CONFIG

いいえ

古いバージョンの FeatureGenerator を使用してトレーニングされたモデルとの互換性を確保するために、この変数を有効にしてください。

"processor_envs":

[

{

"name": "ADAPTE_FG_CONFIG",

"value": "true"

 }

]

DISABLE_FG_PRECISION

いいえ

古い FeatureGenerator バージョンに基づくモデルとの互換性を確保するために使用します。旧バージョンでは、デフォルトで float 特徴量が 6 桁の有効数字に制限されていましたが、新バージョンでは制限されません。この変数を false に設定すると、旧バージョンの制限が適用されます。

"processor_envs":

[

{

"name": "DISABLE_FG_PRECISION",

"value": "false"

 }

]

EasyRec プロセッサの推論最適化パラメーター

パラメーター

必須

説明

TF_XLA_FLAGS

いいえ

GPU 上で、Accelerated Linear Algebra (XLA) を使用してモデルをコンパイルおよび最適化し、演算子を自動的に融合します。

"processor_envs":

[

{

"name": "TF_XLA_FLAGS",

"value": "--tf_xla_auto_jit=2"

},

{

"name": "XLA_FLAGS",

"value": "--xla_gpu_cuda_data_dir=/usr/local/cuda/"

},

{

"name": "XLA_ALIGN_SIZE",

"value": "64"

}

]

TF スケジューリングパラメーター

いいえ

inter_op_parallelism_threads:異なる操作を実行するためのスレッド数を制御します。

intra_op_parallelism_threads:単一の操作内で使用されるスレッド数を制御します。

32 コア CPU の場合、これらのパラメーターを 16 に設定すると、通常高いパフォーマンスが得られます。これらの 2 つのパラメーターの合計は、CPU コア数を超えてはなりません。

"model_config": {

"inter_op_parallelism_threads": 16,

"intra_op_parallelism_threads": 16,

}

rpc.worker_threads

いいえ

PAI-EAS 構成のメタデータセクション内のパラメーター。このパラメーターをインスタンスの CPU コア数に設定します。たとえば、インスタンスに 15 個の CPU コアがある場合、worker_threads を 15 に設定します。

"metadata": {

"rpc": {

"worker_threads": 15

}

ステップ 2:サービスの呼び出し

2.1 ネットワーク構成

PAI-Rec エンジンおよびモデルスコアリングサービスは、PAI EAS 上にデプロイされます。この構成には、直接的なネットワーク接続が必要です。PAI EAS インスタンスページで右上隅の VPC をクリックし、サービスが同じ VPC、vSwitch、およびセキュリティグループを使用するように構成します。詳細については、「EAS からのパブリックリソースまたは内部リソースへのアクセス」をご参照ください。Hologres を使用する場合は、同じ VPC 設定を使用していることを確認してください。次の図に例を示します。

image

2.2 サービス情報の取得

EasyRec モデルサービスをデプロイした後、Elastic Algorithm Service (EAS) ページに移動します。サービス方法 列で目的のサービスの 呼び出し方法 をクリックし、アクセスエンドポイントおよびトークンを確認します。

2.3 SDK 呼び出しの例

EasyRec モデルサービスは、入力および出力の両方に Protocol Buffers (Protobuf) 形式を使用します。そのため、PAI EAS コンソールから直接サービスをテストすることはできません。

サービスを呼び出す前に、ステップ 1 のデプロイ時に model_config で設定した fg_mode を特定する必要があります。モードによって、クライアントの呼び出し方法が完全に異なります。

デプロイモード (fg_mode)

SDK リクエストクラス

normal または tf (組み込み特徴量エンジニアリングあり)

EasyRecRequest

bypass (組み込み特徴量エンジニアリングなし)

TFRequest

FG を含む:fg_mode=normal または tf

Java

Maven 環境の構成方法については、「Java SDK の説明」をご参照ください。以下のコードは、ali_rec_rnk_with_fg サービスへのリクエスト送信例を示しています。

import com.aliyun.openservices.eas.predict.http.*;
import com.aliyun.openservices.eas.predict.request.EasyRecRequest;

PredictClient client = new PredictClient(new HttpConfig());
// パブリックゲートウェイ経由でサービスにアクセスするには、ユーザー ID (UID) で始まるエンドポイントを使用します。この情報は、EAS コンソールのサービス呼び出し詳細で確認できます。
client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_with_fg");
// ご利用のサービストークンに置き換えてください。
client.setToken("******");

EasyRecRequest easyrecRequest = new EasyRecRequest(separator);
// userFeatures: ユーザー特徴量。特徴量は \u0002 (CTRL_B) で区切られ、特徴量名と値はコロン (:) で区切られます。
//  user_fea0:user_fea0_val\u0002user_fea1:user_fea1_val
// 特徴量値の形式については、https://easyrec.readthedocs.io/latest/feature/rtp_fg.html をご参照ください。
easyrecRequest.appendUserFeatureString(userFeatures);
// 1 つのユーザー特徴量を個別に追加することもできます:
// easyrecRequest.addUserFeature(String userFeaName, T userFeaValue)。
// 特徴量値の型 T は、String、float、long、または int です。

// contextFeatures: コンテキスト特徴量。特徴量は \u0002 (CTRL_B) で区切られます。特徴量名と値はコロン (:) で区切られます。単一の特徴量に対する複数の値もコロンで区切られます。
//   ctxt_fea0:ctxt_fea0_ival0:ctxt_fea0_ival1:ctxt_fea0_ival2\u0002ctxt_fea1:ctxt_fea1_ival0:ctxt_fea1_ival1:ctxt_fea1_ival2
easyrecRequest.appendContextFeatureString(contextFeatures);
// 1 つのコンテキスト特徴量を個別に追加することもできます:
// easyrecRequest.addContextFeature(String ctxtFeaName, List<Object> ctxtFeaValue)。
// ctxtFeaValue の型は、String、Float、Long、または Integer です。

// itemIdStr: 予測対象のアイテム ID リスト。カンマ (,) で区切られます。
easyrecRequest.appendItemStr(itemIdStr, ",");
// 1 つのアイテム ID を個別に追加することもできます:
// easyrecRequest.appendItemId(String itemId)

easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);

for (Map.Entry<String, easyrecPredictProtos.Results> entry : response.getResultsMap().entrySet()) {
    String key = entry.getKey();
    easyrecPredictProtos.Results value = entry.getValue();
    System.out.print("key: " + key);
    for (int i = 0; i < value.getScoresCount(); i++) {
        System.out.format("value: %.6g\n", value.getScores(i));
    }
}

// FG によって処理された特徴量を取得し、オフライン特徴量との一貫性を確認します。
// DebugLevel を 1 に設定すると、生成された特徴量が返されます。
easyrecRequest.setDebugLevel(1);
easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
    System.out.println(itemId);
    System.out.println(genFeas.get(itemId));
}
Python

環境の構成方法については、「Python SDK の説明」をご参照ください。本番アプリケーションには Java クライアントの使用を推奨します。以下のコードは例です。

from eas_prediction import PredictClient

from eas_prediction.easyrec_request import EasyRecRequest
from eas_prediction.easyrec_predict_pb2 import PBFeature
from eas_prediction.easyrec_predict_pb2 import PBRequest

if __name__ == '__main__':
    endpoint = 'http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com'
    service_name = 'ali_rec_rnk_with_fg'
    token = '******'

    client = PredictClient(endpoint, service_name)
    client.set_token(token)
    client.init()

    req = PBRequest()
    uid = PBFeature()
    uid.string_feature = 'u0001'
    req.user_features['user_id'] = uid
    age = PBFeature()
    age.int_feature = 12
    req.user_features['age'] = age
    weight = PBFeature()
    weight.float_feature = 129.8
    req.user_features['weight'] = weight

    req.item_ids.extend(['item_0001', 'item_0002', 'item_0003'])
    
    easyrec_req = EasyRecRequest()
    easyrec_req.add_feed(req, debug_level=0)
    res = client.predict(easyrec_req)
    print(res)

パラメーターの説明は以下のとおりです。

  • endpoint:サービスエンドポイント。ユーザー ID (UID) で始まる必要があります。PAI EAS オンラインモデルサービス ページで、ご利用のサービスの サービス方法 列にある 呼び出し方法 をクリックしてエンドポイントを取得できます。

  • service_name:サービス名。PAI EAS オンラインモデルサービスページで確認できます。

  • token:サービストークン。呼び出し方法 ダイアログボックスで取得できます。

FG を含まない:fg_mode=bypass

Java

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[]{3}, new String []{ "u0001", "u0001", "u0001"});
      	request.addFeed("age", TFDataType.DT_FLOAT, 
                        new long[]{3}, new float []{ 18.0f, 18.0f, 18.0f});
        // 注:INPUT_TILE=2 を設定した場合、すべてのアイテムで同じ値を持つ特徴量は 1 回だけ渡す必要があります:
        //    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[]{3}, 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 メソッドを呼び出します。例:
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // 直接ネットワーク接続は、EAS コンソールで有効にする必要があります。EAS サービスにアクセスするために使用するソース vSwitch を指定する必要があります。
        // 直接ネットワーク接続により、安定性とパフォーマンスが向上します。
        client.setEndpoint("xxxxxxx.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 xxxxxxx.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

詳細については、「Python SDK の説明」をご参照ください。Python のパフォーマンスが低いため、デバッグ用途のみに使用し、本番環境では Java SDK の使用を推奨します。以下のコードは、ali_rec_rnk_no_fg サービスへのリクエスト送信例を示しています。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest

if __name__ == '__main__':
    client = PredictClient('http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
    client.set_token('')
    client.init()
    
    # 注:'server_default' をご利用のモデルの実際の signature_name に置き換えてください。詳細については、SDK ドキュメントをご参照ください。
    req = TFRequest('server_default') 
    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 最適化を有効にした後、すべてのアイテムで同じ値を持つ特徴量は 1 回だけ渡す必要があります。
    #   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', [3], TFRequest.DT_STRING, 
        ['i0001', 'i0002', 'i0003'])
    for x in range(0, 100):
        resp = client.predict(req)
        print(resp)

2.4 カスタムサービスリクエストの構築

Python または Java 以外の言語を使用してサービスを呼び出すには、.proto ファイルから予測リクエストコードを手動で生成する必要があります。以下の Protocol Buffers 定義を使用して、必要なコードを生成できます。

  • tf_predict.proto:TensorFlow モデルのリクエスト定義

    syntax = "proto3";
    
    option cc_enable_arenas = true;
    option go_package = ".;tf";
    option java_package = "com.aliyun.openservices.eas.predict.proto";
    option java_outer_classname = "PredictProtos";
    
    enum ArrayDataType {
      // DataType の有効な値ではありません。DataType フィールドが
      // 設定されていないことを示すために使用されます。
      DT_INVALID = 0;
    
      // すべての計算デバイスがサポートすることが期待されるデータ型。
      DT_FLOAT = 1;
      DT_DOUBLE = 2;
      DT_INT32 = 3;
      DT_UINT8 = 4;
      DT_INT16 = 5;
      DT_INT8 = 6;
      DT_STRING = 7;
      DT_COMPLEX64 = 8;  // 単精度複素数
      DT_INT64 = 9;
      DT_BOOL = 10;
      DT_QINT8 = 11;     // 量子化 int8
      DT_QUINT8 = 12;    // 量子化 uint8
      DT_QINT32 = 13;    // 量子化 int32
      DT_BFLOAT16 = 14;  // 16 ビットに切り捨てられた Float32。キャスト演算子専用。
      DT_QINT16 = 15;    // 量子化 int16
      DT_QUINT16 = 16;   // 量子化 uint16
      DT_UINT16 = 17;
      DT_COMPLEX128 = 18;  // 倍精度複素数
      DT_HALF = 19;
      DT_RESOURCE = 20;
      DT_VARIANT = 21;  // 任意の C++ データ型
    }
    
    // 配列の次元
    message ArrayShape {
      repeated int64 dim = 1 [packed = true];
    }
    
    // 配列を表すプロトコルバッファー
    message ArrayProto {
      // データ型。
      ArrayDataType dtype = 1;
    
      // 配列の形状。
      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];
    
      // DT_BOOL。
      repeated bool bool_val = 8 [packed = true];
    }
    
    // PredictRequest は、実行する TensorFlow モデル、
    // 入力がテンソルにどのようにマッピングされるか、
    // 出力がユーザーに返される前にどのようにフィルタリングされるかを指定します。
    message PredictRequest {
      // 評価する名前付き署名。指定しない場合、デフォルトの署名が使用されます。
      string signature_name = 1;
    
      // 入力テンソル。
      // 入力テンソルの名前はエイリアス名です。エイリアスから実際の入力テンソル名へのマッピングは、
      // モデルエクスポート内のキー "inputs" の下に名前付き汎用署名として格納されていることが期待されます。
      // "inputs" という名前の汎用署名にリストされた各エイリアスは、
      // 予測を実行するために正確に 1 回提供する必要があります。
      map<string, ArrayProto> inputs = 2;
    
      // 出力フィルター。
      // 指定された名前はエイリアス名です。エイリアスから実際の出力テンソル名へのマッピングは、
      // モデルエクスポート内のキー "outputs" の下に名前付き汎用署名として格納されていることが期待されます。
      // ここで指定されたテンソルのみが実行/フェッチされ、返されます。何も指定しない場合、
      // 名前付き署名で指定されたすべてのテンソルが実行/フェッチされ、返されます。
      repeated string output_filter = 3;
      
      // デバッグフラグ
      // 0: 予測結果のみを返し、デバッグ情報を返しません。
      // 100: 予測結果を返し、リクエストを model_dir に保存します。
      // 101: タイムラインを model_dir に保存します。
      int32 debug_level = 100;
    }
    
    // 成功した PredictRequest の応答。
    message PredictResponse {
      // 出力テンソル。
      map<string, ArrayProto> outputs = 1;
    }
  • easyrec_predict.proto:FG を含む TensorFlow モデルのリクエスト定義

    syntax = "proto3";
    
    option cc_enable_arenas = true;
    option go_package = ".;easyrec";
    option java_package = "com.aliyun.openservices.eas.predict.proto";
    option java_outer_classname = "EasyRecPredictProtos";
    
    import "tf_predict.proto";
    
    // コンテキスト特徴量
    message ContextFeatures {
      repeated PBFeature features = 1;
    }
    
    message PBFeature {
      oneof value {
        int32 int_feature = 1;
        int64 long_feature = 2;
        string string_feature = 3;
        float float_feature = 4;
      }
    }
    
    // PBRequest はアグリゲーターへのリクエストを指定します。
    message PBRequest {
      // デバッグフラグ
      // 0: 予測結果のみを返し、デバッグ情報を返しません。
      // 3: FG モジュールによって生成された特徴量を文字列形式で返します。特徴量の値は \u0002 で区切られます。
      //    これは、特徴量の一貫性を確認したり、オンラインディープ ラーニング用サンプルを生成したりするために使用できます。
      // 100: 予測結果を返し、リクエストを model_dir に保存します。
      // 101: タイムラインを model_dir に保存します。
      // 102: DSSM や MIND などのリコールモデルの場合、Faiss による検索結果だけでなく、ユーザーの埋め込みベクターも返します。
      int32 debug_level = 1;
    
      // ユーザー特徴量
      map<string, PBFeature> user_features = 2;
    
      // アイテム ID。静的(毎日更新される)アイテム特徴量は、各プロセッサノード上に存在する特徴量キャッシュから item_ids を使用してフェッチされます。
      repeated string item_ids = 3;
    
      // 各アイテムのコンテキスト特徴量。リアルタイムアイテム特徴量は、コンテキスト特徴量として渡すことができます。
      map<string, ContextFeatures> context_features = 4;
    
      // 埋め込み取得のための近傍数。
      int32 faiss_neigh_num = 5;
    }
    
    // 戻り値
    message Results {
      repeated double scores = 1 [packed = true];
    }
    
    enum StatusCode {
      OK = 0;
      INPUT_EMPTY = 1;
      EXCEPTION = 2;
    }
    
    // PBResponse はアグリゲーターへの応答を指定します。
    message PBResponse {
      // 結果
      map<string, Results> results = 1;
    
      // アイテム特徴量
      map<string, string> item_features = 2;
    
      // FG によって生成された特徴量
      map<string, string> generate_features = 3;
    
      // コンテキスト特徴量
      map<string, ContextFeatures> context_features = 4;
    
      string error_msg = 5;
    
      StatusCode status_code = 6;
    
      // アイテム ID
      repeated string item_ids = 7;
    
      repeated string outputs = 8;
    
      // すべての FG 入力特徴量
      map<string, string> raw_features = 9;
    
      // 出力テンソル
      map<string, ArrayProto> tf_outputs = 10;
    }