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

Artificial Intelligence Recommendation:PAI の EAS をモデル推論に使用し、EasyRec をモデル学習に使用しない場合に、レコメンデーションエンジンを EasyRec プロセッサに接続する

最終更新日:Apr 04, 2025

このトピックでは、EasyRec をモデル学習に使用しない場合に、Platform for AI(PAI)の Elastic Algorithm Service(EAS)をモデル推論に使用する手順について説明します。詳細については、「EasyRec プロセッサ」をご参照ください。

背景情報

モデル学習を他の環境で完了しているものの、モデル推論には EAS が提供する高性能サービスを使用したい場合があります。

手順 1:モデルを準備する

SavedModel 形式で TensorFlow モデルをエクスポートし、アクセス可能なストレージロケーション(Object Storage Service(OSS)のバケットなど)にアップロード済みであることを確認します。

手順 2:サービス構成ファイルを設定する

echo.json などのサービス構成ファイルを作成し、関連パラメーターを設定します。次のコードは、構成ファイルの例です。

bizdate=$1
cat << EOF > echo.json
{
  "name":"ali_rec_rnk_no_fg",
  "metadata": {
    "instance": 2,
    "rpc": {
      "enable_jemalloc": 1,
      "max_queue_size": 100
    }
  },
  "cloud": {
    "computing": {
      "instance_type": "ecs.g7.large"",
      "instances": null
    }
  },
  "model_config": {
    "fg_mode": "bypass"  // 特徴量生成(FG)をバイパスモードに設定
  },
  "processor": "easyrec-1.9",
  "processor_envs": [
    {
      "name": "INPUT_TILE",
      "value": "2"
    }
  ],
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final/" // モデルファイルのパス
      }
    }
  ],
  "warm_up_data_path": "oss://easyrec/ali_rec_sln_acc_rnk/rnk_warm_up.bin" // ウォームアップデータのパス
}

EOF

この例では、fg_mode フィールドの値は bypass に設定されています。これは、特徴量生成(FG)が有効ではなく、TensorFlow モデルのみがデプロイされることを示します。

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

パラメーター

必須

説明

processor

はい

EasyRec プロセッサの名前。

"processor": "easyrec"

fg_mode

はい

特徴量エンジニアリングモード。有効な値:

  • tf:FG 有効モード。このモードでは、FG はオペレーターとして TensorFlow グラフに埋め込まれ、グラフはパフォーマンスを向上させるために最適化されます。

  • bypass:FG 無効モード。このモードでは、TensorFlow モデルのみがデプロイされます。

  • このモードは、カスタム特徴量処理シナリオに適しています。

  • このモードを使用する場合、Item Feature Cache および FeatureStore に関連するパラメーターを設定する必要はありません。

"fg_mode": "tf"

outputs

はい

TensorFlow モデルの出力変数の名前。例:probs_ctr。複数の名前はカンマ(,)で区切ります。出力変数の名前を取得するには、TensorFlow コマンド saved_model_cli を実行します。

"outputs":"probs_ctr,probs_cvr"

save_req

いいえ

返されたデータファイルをモデルディレクトリに保存するかどうかを指定します。ファイルは、ウォームアップとパフォーマンステストに使用できます。有効な値:

  • true:返されたデータファイルをモデルディレクトリに保存します。

  • false(デフォルト):返されたデータファイルをモデルディレクトリに保存しません。最適なパフォーマンスを得るには、本番環境でこのパラメーターを false に設定することをお勧めします。

"save_req": "false"

Item Feature Cache に関連するパラメーター

period

はい

アイテム特徴量が更新される間隔。単位:分。更新が数日ごとに行われる場合は、サービスの更新時にアイテム特徴量が毎日更新されるため、このパラメーターを 1 日より大きい値(例:2880)に設定します。

"period": 2880

remote_type

はい

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

  • hologres:SQL インターフェースを使用して Hologres インスタンスからデータを読み書きします。この方法は、大量のデータを格納およびクエリする場合に適しています。

  • none:Item Feature Cache からアイテム特徴量を取得する代わりに、リクエストを送信してアイテム特徴量を追加します。この値を指定する場合は、tables パラメーターを [] に設定します。

"remote_type": "hologres"

tables

いいえ

アイテム特徴量テーブル。このパラメーターは、remote_type パラメーターを hologres に設定した場合にのみ必須です。このパラメーターには、次のフィールドが含まれます。

  • 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****************:yourAccessKeySecret@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec"

FeatureStore に関連するパラメーター

fs_project

いいえ

FeatureStore プロジェクトの名前。FeatureStore を使用する場合は、このパラメーターが必須です。詳細については、「FeatureStore プロジェクトを設定する」をご参照ください。

"fs_project": "fs_demo"

fs_model

いいえ

FeatureStore のモデル特徴量の名前。

"fs_model": "fs_rank_v1"

fs_entity

いいえ

FeatureStore の特徴量エンティティの名前。

"fs_entity": "item"

region

いいえ

FeatureStore サービスがデプロイされているリージョン。

"region": "cn-beijing"

access_key_id

いいえ

FeatureStore サービスの AccessKey ID。

"access_key_id": "LTAI****************"

access_key_secret

いいえ

FeatureStore サービスの AccessKey シークレット。

"access_key_secret": "yourAccessKeySecret"

load_feature_from_offlinestore

いいえ

FeatureStore のオフラインデータストアからオフライン特徴量データを取得するかどうかを指定します。有効な値:

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

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

"load_feature_from_offlinestore": True

自動ブロードキャストに関連するパラメーター

INPUT_TILE

いいえ

アイテム特徴量配列の自動ブロードキャストを有効にします。リクエストでアイテム特徴量(user_id など)の値が同じである場合、値を 1 回指定すると、配列に複製されます。

  • 自動ブロードキャストにより、リクエストサイズ、ネットワーク転送時間、および計算時間を削減できます。

  • 自動ブロードキャストを有効にするには、INPUT_TILE パラメーターを 2 に設定します。

  • このパラメーターは、EasyRec 1.3 以降のバージョンでサポートされています。

  • fg_mode パラメーターを tf に設定すると、自動ブロードキャストはデフォルトで有効になります。このパラメーターを設定する必要はありません。

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

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

前の手順で作成したサービス構成ファイルをデプロイするには、EASCMD を使用します。

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

出力ログを確認して、サービスが正常にデプロイされたことを確認します。サービスがデプロイされた後、サービスのアクセスアドレスを取得できます。

手順 4:サービスを呼び出す

EasyRec モデルサービスを呼び出す

bypass モードを使用する場合は、Java SDK または Python SDK を使用して、EasyRec プロセッサのリクエスト形式に基づいてモデルサービスを呼び出すことができます。

Java SDK の使用例

Java SDK を使用する前に、Maven 環境を設定する必要があります。Maven 環境の設定方法については、「Java 用 SDK」をご参照ください。ali_rec_rnk_no_fg サービスを呼び出すサンプルコード:

import java.util.List;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;

public class TestEasyRec {
    public static TFRequest buildPredictRequest() {
        TFRequest request = new TFRequest();
 
        request.addFeed("user_id", TFDataType.DT_STRING, 
                        new long[]{5}, new String []{ "u0001", "u0001", "u0001"});
      	request.addFeed("age", TFDataType.DT_FLOAT, 
                        new long[]{5}, new float []{ 18.0f, 18.0f, 18.0f});
        // 注:INPUT_TILE パラメーターを 2 に設定すると、コードを次のように簡略化できます。
        //    request.addFeed("user_id", TFDataType.DT_STRING,
        //            new long[]{1}, new String []{ "u0001" });
        //    request.addFeed("age", TFDataType.DT_FLOAT, 
        //            new long[]{1}, new float []{ 18.0f});
      	request.addFeed("item_id", TFDataType.DT_STRING, 
                        new long[]{5}, new String []{ "i0001", "i0002", "i0003"});  
        request.addFetch("probs");
      	return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());

        // setDirectEndpoint を呼び出して、VPC 直接接続チャネルを使用してサービスにアクセスします。
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // PAI コンソールの EAS ページで VPC 直接接続チャネルを作成する必要があります。
        // ゲートウェイを使用するよりも、直接接続チャネルを使用することで、安定性とパフォーマンスが向上します。
        client.setEndpoint("yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("ali_rec_rnk_no_fg");
        client.setToken("");
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            try {
                TFResponse response = client.predict(buildPredictRequest());
                // probs:出力フィールドの名前。cURL コマンドを実行して、モデルの入力と出力を表示できます。
                //   curl yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com -H "Authorization:{token}"
                List<Float> result = response.getFloatVals("probs");
                System.out.print("Predict Result: [");
                for (int j = 0; j < result.size(); j++) {
                    System.out.print(result.get(j).floatValue());
                    if (j != result.size() - 1) {
                        System.out.print(", ");
                    }
                }
                System.out.print("]\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");
        client.shutdown();
    }
}

Python SDK の使用例

Python SDK の使用方法については、「Python 用 SDK」をご参照ください。パフォーマンスが制限されているため、Python SDK はデバッグのみに使用することをお勧めします。ali_rec_rnk_no_fg サービスを呼び出すサンプルコード:

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction.tf_request_pb2 import TFRequest

if __name__ == '__main__':
    client = PredictClient('http://yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
    client.set_token('')
    client.init()

    req = TFRequest()
    req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
    req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
    # 注:INPUT_TILE パラメーターを 2 に設定すると、コードを次のように簡略化できます。
    #   req.add_feed('user_id', [1], TFRequest.DT_STRING, ['u0001'])
    #   req.add_feed('age', [1], TFRequest.DT_FLOAT, [18.0])
    req.add_feed('item_id', [5], TFRequest.DT_STRING, 
        ['i0001', 'i0002', 'i0003'])
    for x in range(0, 100):
        resp = client.predict(req)
        print(resp)

カスタムサービスリクエストを作成することもできます。詳細については、「リクエスト構文」をご参照ください。

手順 5:サービスのパフォーマンスを監視および最適化する

サービスのデプロイ後、サービスのパフォーマンスをテストし、テスト結果に基づいてサービスのパフォーマンスと安定性を最適化することをお勧めします。

まとめ

上記の手順に従うことで、EasyRec をモデル学習に使用せずに、EAS をモデル推論に使用できます。