全部產品
Search
文件中心

Artificial Intelligence Recommendation:如果不用EasyRec訓練,只用EAS推理,如何對接

更新時間:Apr 02, 2025

此文檔指導使用者在不使用EasyRec訓練的情況下,僅使用EAS進行模型推理的具體步驟。詳細內容基於EasyRec Processor

背景

在某些情況下,使用者可能已經在其他環境完成了模型訓練,但希望使用EAS提供的高效能服務進行模型推理。

步驟一:準備模型

確保你的模型已經以TensorFlow的SavedModel格式匯出,並上傳到一個可訪問的儲存位置,如OSS(阿里雲Object Storage Service服務)。

步驟二:佈建服務部署檔案

建立一個服務組態檔,例如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"
  },
  "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。

"processor": "easyrec"

fg_mode

用於指定特徵工程模式,取值如下:

  • tf:為TensorFlow模式,使用FG。通過將FG以TF運算元嵌入TensorFlow計算圖並進行圖最佳化,從而獲得更高效能。

  • bypass:不使用FG,僅部署TensorFlow模型。

  • 適用於自訂特徵處理的情境。

  • 該模式下不需要配置 Item Feature Cache相關參數和Processor訪問FeatureStore相關參數。

"fg_mode": "tf"

outputs

tf模型預測的輸出變數名稱,如probs_ctr。如果是多個則用逗號分隔。如果不清楚輸出變數名稱,請執行tf的命令saved_model_cli來查看。

"outputs":"probs_ctr,probs_cvr"

save_req

是否將請求獲得的資料檔案儲存到模型目錄下,儲存的檔案可以用來做warmup和效能測試。取值如下:

  • true:是。

  • false(預設值):否。生產環境建議設定成false,否則會影響效能。

"save_req": "false"

Item Feature Cache相關參數

period

Item feature cache特徵周期性更新的間隔,單位是分鐘。如果Item特徵是天級更新的話, 一般設定的值大於一天即可(例如2880,1天1440分鐘,2880即表示兩天),一天之內就不需要更新特徵了,因為每天例行更新服務的時候同時也會更新特徵。

"period": 2880

remote_type

Item特徵資料來源, 目前支援:

  • hologres:通過SQL介面進行資料讀取和寫入,適用于海量資料的儲存和查詢。

  • none: 不使用Item特徵緩衝,item特徵通過請求傳入,此時tables應設定為[]

"remote_type": "hologres"

tables

Item特徵表,當remote_typehologres時需要配置,包含以下參數:

  • key:必填,item_id列名。

  • name:必填,特徵表名。

  • value:可選,需要載入的列名,多個列名之間用半形逗號(,)分隔。

  • condition:可選,where子語句支援篩選Item。例如style_id<10000。

  • timekey:可選,用於Item的累加式更新,用於指定更新的時間戳記或整型值。支援的格式:timestamp和int。

  • static:可選,表示靜態特徵,不用周期性更新。

支援從多個表中讀取輸入Item資料,配置格式為:

"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"

Processor訪問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 產品所在的地區。

"region": "cn-beijing"

access_key_id

FeatureStore 產品的 access_key_id。

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

access_key_secret

FeatureStore 產品的 access_key_secret。

"access_key_secret": "yourAccessKeySecret"

load_feature_from_offlinestore

離線特徵是否直接從FeatureStore OfflineStore中擷取資料,取值如下:

  1. True:是,會從FeatureStore OfflineStore中擷取資料。

  2. False(預設值):否,會從FeatureStore OnlineStore中擷取資料。

"load_feature_from_offlinestore": True

input_tile: 特徵自動擴充相關參數

INPUT_TILE

支援item feature自動broadcast,對於一次請求裡面值都相同的feature(例如user_id),可以只傳一個值。

  • 優勢:減少了請求大小、網路傳輸時間和計算時間。

  • 開啟:設定INPUT_TILE環境變數為2。

說明

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

  • easyrec-1.3及其以上版本支援該最佳化。

  • fg_mode=tf時,已自動開啟該最佳化,不需要再單獨設定該環境變數。

步驟三:部署服務

使用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

根據輸出日誌確保服務部署成功。服務成功部署後,你會獲得服務的訪問地址。

步驟四:調用服務

EasyRec模型服務的調用

在bypass模式下,根據EasyRec Processor的請求格式,使用Java或Python進行服務調用。

對於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[]{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,那麼上述值都相同的feature可以只傳一次:
        //    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方法, 如: 
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // 網路直連需打通在EAS控制台開通,提供用於訪問EAS服務的源vswitch,
        // 網路直連具有更好的穩定性和效能。
        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的樣本

請參考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.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)

您也可以自行構建服務要求,詳情請參見請求格式

步驟五:監控和最佳化

部署服務後,建議進行效能測試,並根據反饋最佳化服務效能和穩定性。

結語

通過以上步驟,你將能夠在不使用EasyRec訓練的情況下,使用EAS進行模型推理。