本文主要介紹使用FeatureStore Python SDK完成特征平臺在推薦場景中全流程的創建以及上線的過程。
前提條件
在開始執行操作前,請確認您已完成以下準備工作。
依賴產品 | 具體操作 |
人工智能平臺 PAI |
|
云原生大數據計算服務 MaxCompute |
|
實時數倉 Hologres |
|
大數據開發治理平臺 DataWorks |
|
一、準備數據
同步數據表
一般對于推薦場景,需要準備以下數據表:user側的特征表、item側的特征表、Label表、序列特征表和行為表。
為方便實踐操作,我們在MaxCompute的pai_online_project項目中提前準備了模擬生成的用戶表、物料表、Label表、序列特征表和行為表進行示例說明。您需要在DataWorks中執行SQL命令,將以上表從pai_online_project項目同步到自己的MaxCompute中。具體操作步驟如下:
登錄DataWorks控制臺。
在左側導航欄單擊數據開發與治理 > 數據開發。
選擇已創建的DataWorks工作空間后,單擊進入數據開發。
鼠標懸停至新建,選擇新建節點 > MaxCompute > ODPS SQL,在彈出的頁面中配置節點參數。
參數
取值建議
引擎實例
選擇已創建的MaxCompute引擎。
節點類型
ODPS SQL
路徑
業務流程/Workflow/MaxCompute
名稱
可自定義名稱。
單擊確認。
在新建節點區域運行以下SQL命令,將用戶表、物料表、Label表、序列特征表和行為表從pai_online_project項目同步到自己的MaxCompute中。資源組選擇已創建的獨享資源組。
同步用戶表:rec_sln_demo_user_table_preprocess_all_feature_v1(單擊查看詳情)
CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table_preprocess_all_feature_v1 like pai_online_project.rec_sln_demo_user_table_preprocess_all_feature_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_user_table_preprocess_all_feature_v1 PARTITION (ds) SELECT * FROM pai_online_project.rec_sln_demo_user_table_preprocess_all_feature_v1 WHERE ds >= '20231022' and ds <='20231024'
運行后可以獲取以下三個分區的數據:
ds=20231022
ds=20231023
ds=20231024
同步物料表:rec_sln_demo_item_table_preprocess_all_feature_v1(單擊查看詳情)
CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table_preprocess_all_feature_v1 like pai_online_project.rec_sln_demo_item_table_preprocess_all_feature_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_item_table_preprocess_all_feature_v1 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_item_table_preprocess_all_feature_v1 WHERE ds >= '20231022' and ds <='20231024'
運行后可以獲取以下三個分區的數據:
ds=20231022
ds=20231023
ds=20231024
同步Label表:rec_sln_demo_label_table(單擊查看詳情)
CREATE TABLE IF NOT EXISTS rec_sln_demo_label_table like pai_online_project.rec_sln_demo_label_table STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_label_table PARTITION (ds) SELECT * FROM pai_online_project.rec_sln_demo_label_table WHERE ds >= '20231022' and ds <='20231024'
運行后可以獲取以下三個分區的數據:
ds=20231022
ds=20231023
ds=20231024
同步序列特征表:rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3(單擊查看詳情)
CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3 like pai_online_project.rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3 WHERE ds >= '20231022' and ds <='20231024'
運行后可以獲取以下三個分區的數據:
ds=20231022
ds=20231023
ds=20231024
同步行為表:rec_sln_demo_behavior_table_preprocess_v3(單擊查看詳情)
CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_v3 like pai_online_project.rec_sln_demo_behavior_table_preprocess_v3 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_v3 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_behavior_table_preprocess_v3 WHERE ds >= '20231022' and ds <='20231024'
完成上述操作后,您可以在自己的工作空間內查看已同步的表,后續的實踐操作將以這五張表為例進行說明。
配置數據源
FeatureStore一般需要配置兩個數據源:離線數據源(MaxCompute)和在線數據源(Hologres/GraphCompute/TableStore)。本文以MaxCompute和Hologres為例進行說明。
登錄PAI控制臺,在左側導航欄單擊數據準備>特征平臺(FeatureStore)。
選擇工作空間后,單擊進入FeatureStore。
配置MaxCompute數據源。
在數據源頁簽,單擊新建數據源,在彈出的頁面中配置MaxCompute數據源具體參數。
參數
取值建議
類型
MaxCompute
名稱
可自定義名稱。
MaxCompute項目名
選擇已創建的MaxCompute項目。
請復制語句并單擊立即前往,同步數據至Hologres,在DataWorks執行該語句后,即可完成授權。
說明授權操作需要您的賬號擁有admin權限,具體操作詳情請參見通過命令管理用戶權限或通過控制臺管理用戶權限。
完成后單擊提交。
配置Hologres數據源。
在數據源頁簽,單擊新建數據源,在彈出的頁面中配置Hologres數據源具體參數。
參數
取值建議
類型
Hologres
名稱
可自定義名稱。
實例ID
選擇已創建的Hologres實例名稱。
數據庫名稱
選擇已創建的實例數據庫。
完成后單擊提交。
對Hologres進行授權,具體操作詳情請參見配置數據源。
二、FeatureStore Python SDK創建流程
安裝特征平臺Python SDK, 要求在Python3環境下運行。以下代碼均建議在Jupyter Notebook環境下運行。
! pip install https://feature-store-py.oss-cn-beijing.aliyuncs.com/package/feature_store_py-1.3.1-py3-none-any.whl
導入需要的功能模塊。
import unittest
import sys
import os
from os.path import dirname, join, abspath
from feature_store_py.fs_client import FeatureStoreClient, build_feature_store_client
from feature_store_py.fs_project import FeatureStoreProject
from feature_store_py.fs_datasource import UrlDataSource, MaxComputeDataSource, DatahubDataSource, HologresDataSource, SparkDataSource, LabelInput, TrainingSetOutput
from feature_store_py.fs_type import FSTYPE
from feature_store_py.fs_schema import OpenSchema, OpenField
from feature_store_py.fs_feature_view import FeatureView
from feature_store_py.fs_features import FeatureSelector
from feature_store_py.fs_config import LabelInputConfig, PartitionConfig, FeatureViewConfig, TrainSetOutputConfig, SequenceFeatureConfig, SequenceTableConfig
import logging
logger = logging.getLogger("foo")
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
特征工程項目
您可以通過特征平臺創建多個項目空間,每個項目空間是獨立的。具體操作,請參見配置FeatureStore項目。運行Notebook需要FeatureStore服務端配合運行,開通特征平臺后需要配置數據源,具體操作請參見配置數據源。
其中,offline_datasource_id指的是離線數據源ID,online_datasource_id指的是在線數據源ID。
此處以項目名稱是fs_movie進行說明。
access_id = ''
access_ak = ''
region = 'cn-beijing'
fs = FeatureStoreClient(access_key_id=access_id, access_key_secret=access_ak, region=region)
cur_project_name = "fs_demo"
project = fs.get_project(cur_project_name)
if project is None:
raise ValueError("Need to create project : fs_movie")
運行以下代碼獲取當前的project并打印其信息。
project = fs.get_project(cur_project_name)
project.print_summary()
特征實體(FeatureEntity)
特征實體描述了一組相關的特征集合。多個特征視圖可以關聯一個特征實體。每個實體都會有一個JoinId,通過JoinId可以關聯多個特征視圖特征。每一個特征視圖都有一個主鍵(索引鍵)來獲取它的特征數據,但是索引鍵可以和JoinId定義的名稱不一樣。
一般在推薦系統中,特征只關聯user和item兩個特征實體,即特征屬于user側或者item側。此處以創建 user和item兩個特征實體為例進行說明。
創建user entity
user_entity_name = "user" user_join_id = 'user_id' user_entity = project.get_entity(user_entity_name) if user_entity is None: user_entity = project.create_entity(name = user_entity_name, join_id=user_join_id) user_entity.print_summary()
創建item entity
item_entity_name = "item" join_id = 'item_id' item_entity = project.get_entity(item_entity_name) if item_entity is None: item_entity = project.create_entity(name = item_entity_name, join_id=join_id) item_entity.print_summary()
特征視圖(FeatureView)
FeatureStore是一個專門用來管理和組織特征數據的平臺,外部數據需要通過特征視圖進入FeatureStore。特征視圖定義了數據從哪里來(DataSource)、需要進行哪些預處理或轉換操作(如特征工程/Transformation)、特征的數據結構(包含特征名稱和類型在內的特征schema)、數據存儲的位置(OnlineStore/OfflineStore),并提供特征元信息管理,如主鍵、事件時間、分區鍵、特征實體以及有效期設定ttl(默認-1表示永久有效,正數則表示在線查詢時會取ttl內的最新特征數據)。
特征視圖分為三種類型:Batch FeatureView(離線特征,或者T-1天特征)、Stream FeatureView(實時特征)、Sequence FeatureView(序列特征)。
Batch FeatureView(離線特征視圖)
將離線數據注入到FeatureStore的OfflineStore中,并可以根據需求同步至OnlineStore以支持實時查詢。一般的離線特征,或者T-1天的特征。
注冊user側離線特征表
將rec_sln_demo_user_table_preprocess_all_feature_v1注冊到特征平臺。
user_feature_view_name = "user_table_preprocess_all_feature_v1" user_table_name = "rec_sln_demo_user_table_preprocess_all_feature_v1" user_feature_view = project.get_feature_view(user_feature_view_name) if user_feature_view is None: ds = MaxComputeDataSource(project.offline_datasource_id, user_table_name) user_feature_view = project.create_batch_feature_view(name=user_feature_view_name, datasource=ds, online=True, entity= user_entity_name, primary_key='user_id', register=True) print(user_feature_view)
將離線數據源中的rec_sln_demo_user_table_preprocess_all_feature_v1中20231023分區的數據同步到在線數據源。
user_task = user_feature_view.publish_table({'ds':'20231023'}) user_task.wait()
查看任務運行情況。
user_task.print_summary()
注冊item側離線特征表
將rec_sln_demo_item_table_preprocess_all_feature_v1表注冊到特征平臺。
item_feature_view_name = "item_table_preprocess_all_feature_v1" item_table_name = "rec_sln_demo_item_table_preprocess_all_feature_v1" item_feature_view = project.get_feature_view(item_feature_view_name) if item_feature_view is None: ds = MaxComputeDataSource(project.offline_datasource_id, item_table_name) item_feature_view = project.create_batch_feature_view(name=item_feature_view_name, datasource=ds, online = True, entity= item_entity_name, primary_key='item_id', register=True) print(item_feature_view)
將離線數據源中的rec_sln_demo_item_table_preprocess_all_feature_v1中20231023分區的數據同步到在線數據源。
item_task = item_feature_view.publish_table({'ds':'20231023'}) item_task.wait()
查看任務運行情況。
item_task.print_summary()
Sequence FeatureView(實時序列視圖)
支持離線寫入序列特征,以及查詢和讀取實時序列特征。一般在推薦場景中,離線序列特征表(記為F1)前期由模擬生成,后續可以直接由線上日志代替。而在線實時序列的查詢中,會查詢兩張在線行為表的數據,一張為T-1天的行為表(記為B1),另外一張為T天當天的實時行為表(記為B2)。B2是實時計算更新的特征,同時查詢B1和B2行為表后拼出該用戶的特征序列,然后與其他特征合在一起送到模型打分。
在線T-1天的行為表B1一般是由離線T-1天行為表(記為A1)同步,同步過程中,特征平臺會自動完成去重等操作。 在線T天的行為表B2目前需要您通過API接口或Flink等阿里云產品寫入。
因此在注冊實時特征視圖過程中,相當于特征平臺同時維護管理了四張表:離線序列表F1、離線T-1天的行為表A1、在線T-1天的行為表B1、在線T天的行為表B2。
注冊時,只需要提供離線序列表F1,離線T-1天的行為表A1即可,在線行為表和同步去重過程由特征平臺完成。
注冊實時特征視圖。
seq_feature_view_name = "wide_seq_feature_v3" seq_feature_view = project.get_feature_view(seq_feature_view_name) if seq_feature_view is None: seq_table_name = "rec_sln_demo_behavior_table_preprocess_sequence_wide_seq_feature_v3" behavior_table_name = 'rec_sln_demo_behavior_table_preprocess_v3' ds = MaxComputeDataSource(project.offline_datasource_id, behavior_table_name) event_time = 'event_unix_time' # 行為表中的 event time 字段名 item_id = 'item_id' # 行為表中的 item_id 字段名 event = 'event' # 行為表中的 event 字段名 # deduplication_method = 1, 表示 ['user_id', 'item_id', 'event'] 去重 # deduplication_method = 2, 表示 ['user_id', 'item_id', 'event', 'event_time'] 去重 sequence_feature_config_list = [SequenceFeatureConfig(offline_seq_name='click_seq_50_seq', seq_event='click', online_seq_name='click_seq_50', seq_len=50)] # offline_seq_name 指的是離線序列表中序列特征字段名,seq_event 指的是行為字段名,online_seq_name 指的是特征平臺在線 Go SDK 查出該 user 對應的行為序列 item_ids 后,會以該名稱命名。 # seq_len 指的是序列長度,大于該長度的序列會被截斷。 seq_table_config = SequenceTableConfig(table_name=seq_table_name, primary_key='user_id', event_time='event_unix_time') seq_feature_view = project.create_sequence_feature_view(seq_feature_view_name, datasource=ds, event_time=event_time, item_id=item_id, event=event, deduplication_method=1, sequence_feature_config=sequence_feature_config_list, sequence_table_config=seq_table_config, entity=user_entity_name) # seq_feature_view.print_summary() print(seq_feature_view)
將離線數據源中rec_sln_demo_behavior_table_preprocess_v3中20231023分區的數據同步到在線數據源。同步時會自動檢查是否有前N天分區的數據,如果沒有會自動補充,N可以通過
days_to_load
指定,默認是30,一般取30即可。seq_task = seq_feature_view.publish_table({'ds':'20231023'}, days_to_load=30) seq_task.wait()
查看任務運行情況。
seq_task.print_summary()
Stream FeatureView(實時特征視圖)
將數據直接寫入OnlineStore,并同時同步到OfflineStore。用于特征實時更新的場景,例如商品的價格、銷量的實時更新。
Label 表注冊
label_table_name = 'rec_sln_demo_label_table'
ds = MaxComputeDataSource(data_source_id=project.offline_datasource_id, table=label_table_name)
label_table = project.get_label_table(label_table_name)
if label_table is None:
label_table = project.create_label_table(datasource=ds, event_time='event_unix_time')
print(label_table)
獲取在線特征
獲取在線特征用于排查離線在線一致性,數據分析等需求,目前優先支持 Hologres。
user_feature_view_name = "user_table_preprocess_all_feature_v1"
user_feature_view = project.get_feature_view(user_feature_view_name)
ret_features_1 = user_feature_view.get_online_features(join_ids={'user_id':['169898460', '148811946']}, features=['user_id', 'gender', 'age', 'city'])
print("ret_features = ", ret_features_1)
TrainingSet
訓練模型時,首先要構造樣本表,樣本表由Label數據和特征數據組成。在與FeatureStore交互時,Label數據需要由客戶提供,并且需要定義要獲取的特征名稱,然后根據主鍵進行point-in-time join(存在event_time的情況下)。
# 指定 Label 表
label_table_name = 'rec_sln_demo_label_table'
output_ds = MaxComputeDataSource(data_source_id=project.offline_datasource_id)
train_set_output = TrainingSetOutput(output_ds)
user_feature_view_name = "user_table_preprocess_all_feature_v1"
user_feature_selector = FeatureSelector(user_feature_view_name, '*') # '*' 代表選擇全部特征
item_feature_view_name = "item_table_preprocess_all_feature_v1"
item_feature_selector = FeatureSelector(item_feature_view_name, '*')
seq_feature_view_name = "wide_seq_feature_v3"
seq_feature_selector = FeatureSelector(seq_feature_view_name, ['click_seq_50_seq'])
train_set = project.create_training_set(label_table_name=label_table_name, train_set_output= train_set_output, feature_selectors=[user_feature_selector, item_feature_selector, seq_feature_selector])
print("train_set = ", train_set)
模型特征
訓練模型并部署成服務后,進行業務預測。其中,訓練樣本可以從上文的train_set獲得。
model_name = "fs_rank_v2"
cur_model = project.get_model(model_name)
if cur_model is None:
cur_model = project.create_model(model_name, train_set)
print("cur_model_train_set_table_name = ", cur_model.train_set_table_name)
三、導出樣本表并訓練模型
實際訓練時,需要導出樣本表。
導出樣本表
指定Label表以及各個特征視圖的分區、event_time。
cur_day = '20231024'
pre_day = '20231023'
label_partitions = PartitionConfig(name = 'ds', value = cur_day)
label_input_config = LabelInputConfig(partition_config=label_partitions)
user_partitions = PartitionConfig(name = 'ds', value = pre_day)
feature_view_user_config = FeatureViewConfig(name = 'user_table_preprocess_all_feature_v1',
partition_config=user_partitions)
item_partitions = PartitionConfig(name = 'ds', value = pre_day)
feature_view_item_config = FeatureViewConfig(name = 'item_table_preprocess_all_feature_v1',
partition_config=item_partitions)
seq_partitions = PartitionConfig(name = 'ds', value = cur_day)
feature_view_seq_config = FeatureViewConfig(name = 'wide_seq_feature_v3', partition_config=seq_partitions, event_time='event_unix_time', equal=True)
feature_view_config_list = [feature_view_user_config, feature_view_item_config, feature_view_seq_config]
train_set_partitions = PartitionConfig(name = 'ds', value = cur_day)
train_set_output_config = TrainSetOutputConfig(partition_config=train_set_partitions)
model_name = 'fs_rank_v2'
cur_model = project.get_model(model_name)
task = cur_model.export_train_set(label_input_config, feature_view_config_list, train_set_output_config)
task.wait()
print("task_summary = ", task.task_summary)
訓練模型
EasyRec是一個開源的推薦系統框架,可以與FeatureStore無縫銜接,進行訓練模型、導出模型、上線模型的操作。推薦您將fs_demo_fs_rank_v2_trainning_set表作為輸入,使用EasyRec訓練模型。
更多EasyRec相關的問題,請通過釘釘群(32260796)加入阿里云人工智能平臺PAI咨詢群聯系我們。
四、上線模型
訓練并導出模型后,可以進行部署和上線的操作。如果是自建推薦系統,FeatureStore提供FeatureStore Python/Go/Cpp/Java SDK,可以與各式各樣的自建推薦系統進行銜接。您也可以通過釘釘群(32260796)聯系我們咨詢和商討具體方案。如果是阿里云系列產品,可以和FeatureStore無縫銜接,快速搭建推薦系統上線。
本文以阿里云系列產品為例介紹上線模型操作。
例行同步數據節點
上線前需要將數據同步節點例行,即例行將數據從離線數據源同步到在線數據源中
登錄DataWorks控制臺。
在左側導航欄單擊數據開發與治理 > 數據開發。
選擇已創建的DataWorks工作空間后,單擊進入數據開發。
同步例行user表。
鼠標懸停至新建,選擇新建節點 > MaxCompute > PyODPS 3。
在彈出的頁面中配置節點參數,單擊確認。
復制以下內容到腳本中,完成user_table_preprocess_all_feature_v1例行同步。
user_table_preprocess_all_feature_v1 同步例行(單擊查看詳情)
from feature_store_py.fs_client import FeatureStoreClient import datetime from feature_store_py.fs_datasource import MaxComputeDataSource import sys cur_day = args['dt'] print('cur_day = ', cur_day) access_key_id = o.account.access_id access_key_secret = o.account.secret_access_key fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region='cn-beijing') cur_project_name = 'fs_demo' project = fs.get_project(cur_project_name) feature_view_name = 'user_table_preprocess_all_feature_v1' batch_feature_view = project.get_feature_view(feature_view_name) task = batch_feature_view.publish_table(partitions={'ds':cur_day}, mode='Overwrite') task.wait() task.print_summary()
單擊右側調度配置,在彈出的頁面中配置調度參數。
參數
取值建議
調度參數
參數名
dt
參數值
$[yyyymmdd-1]
資源屬性
調度資源組
選擇已創建的獨享資源組。
調度依賴
選擇已創建的user表。
節點配置并測試完成后,保存并提交節點配置。
執行補數據操作。操作詳情請參見同步數據表。
同步例行item表。
鼠標懸停至新建,選擇新建節點 > MaxCompute > PyODPS 3。
在彈出的頁面中配置節點參數,單擊確認。
復制以下內容到腳本中。
item_table_preprocess_all_feature_v1 同步例行(單擊查看詳情)
from feature_store_py.fs_client import FeatureStoreClient import datetime from feature_store_py.fs_datasource import MaxComputeDataSource import sys cur_day = args['dt'] print('cur_day = ', cur_day) access_key_id = o.account.access_id access_key_secret = o.account.secret_access_key fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region='cn-beijing') cur_project_name = 'fs_demo' project = fs.get_project(cur_project_name) feature_view_name = 'item_table_preprocess_all_feature_v1' batch_feature_view = project.get_feature_view(feature_view_name) task = batch_feature_view.publish_table(partitions={'ds':cur_day}, mode='Overwrite') task.wait() task.print_summary()
單擊右側調度配置,在彈出的頁面中配置調度參數。
參數
取值建議
調度參數
參數名
dt
參數值
$[yyyymmdd-1]
資源屬性
調度資源組
選擇已創建的獨享資源組。
調度依賴
選擇已創建的item表。
節點配置并測試完成后,保存并提交節點配置。
執行補數據操作。操作詳情請參見同步數據表。
同步實時序列行為表。
鼠標懸停至新建,選擇新建節點 > MaxCompute > PyODPS 3。
在彈出的頁面中配置節點參數,單擊確認。
復制以下內容到腳本中。
wide_seq_feature_v3 同步例行(單擊查看詳情)
from feature_store_py.fs_client import FeatureStoreClient import datetime from feature_store_py.fs_datasource import MaxComputeDataSource import sys cur_day = args['dt'] print('cur_day = ', cur_day) access_key_id = o.account.access_id access_key_secret = o.account.secret_access_key fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region='cn-beijing') cur_project_name = 'fs_demo' project = fs.get_project(cur_project_name) feature_view_name = 'wide_seq_feature_v3' batch_feature_view = project.get_feature_view(feature_view_name) task = batch_feature_view.publish_table(partitions={'ds':cur_day},days_to_load=30) task.wait() task.print_summary()
單擊右側調度配置,在彈出的頁面中配置調度參數。
參數
取值建議
調度參數
參數名
dt
參數值
$[yyyymmdd-1]
資源屬性
調度資源組
選擇已創建的獨享資源組。
調度依賴
選擇已創建的item表。
節點配置并測試完成后,保存并提交節點配置。
執行補數據操作。操作詳情請參見同步數據表。
同步完成后,可以在Hologres中查看最新同步的特征。
創建與部署EAS模型服務
模型服務是為了接收推薦引擎的請求,根據請求為item集合打分并返回分數。其中EasyRec Processor內部包含了FeatureStore Cpp SDK,可以實現低延時、高性能的獲取特征操作,EasyRec Processor從Feature Store Cpp SDK取得特征后,送入模型進行推理,拿到打分后返回給推薦引擎。
部署模型服務的流程如下。
登錄DataWorks控制臺。
在左側導航欄單擊數據開發與治理 > 數據開發。
選擇已創建的DataWorks工作空間后,單擊進入數據開發。
鼠標懸停至新建,選擇新建節點 > MaxCompute > PyODPS 3。
在彈出的頁面中配置節點參數,單擊確認。
復制以下內容到腳本中。
import os import json config = { "name": "fs_demo_v1", "metadata": { "cpu": 4, "rpc.max_queue_size": 256, "rpc.enable_jemalloc": 1, "gateway": "default", "memory": 16000 }, "model_path": f"oss://beijing0009/EasyRec/deploy/rec_sln_demo_dbmtl_v1/{args['ymd']}/export/final_with_fg", "model_config": { "access_key_id": f'{o.account.access_id}', "access_key_secret": f'{o.account.secret_access_key}', "region": "cn-beijing", "fs_project": "fs_demo", "fs_model": "fs_rank_v2", "fs_entity": "item", "load_feature_from_offlinestore": True, "steady_mode": True, "period": 2880, "outputs": "probs_is_click,y_ln_playtime,probs_is_praise", "fg_mode": "tf" }, "processor": "easyrec-1.8", "processor_type": "cpp" } 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-beijing.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-beijing.aliyuncs.com modify fs_demo_v1 -s echo.json")
單擊右側調度配置,在彈出的頁面中配置調度參數。
參數
取值建議
調度參數
參數名
dt
參數值
$[yyyymmdd-1]
資源屬性
調度資源組
選擇已創建的獨享資源組。
調度依賴
選擇對應的訓練任務和item_table_preprocess_all_feature_v1。
節點配置并測試完成后,運行查看部署情況。
部署完成后,注釋掉第34行代碼,并將37行取消注釋,提交任務例行。
(可選)您可以在EAS模型在線服務頁面的推理服務頁簽,查看已部署的服務。操作詳情請參見服務部署:控制臺。
配置PAI-Rec
PAI-Rec是推薦引擎服務,其中集成了FeatureStore的Go SDK,可以與FeatureStore和EAS無縫銜接。
具體配置步驟如下。
配置FeatureStoreConfs。
RegionId
:修改為產品實際所在區域,此處以cn-beijing為例。ProjectName
:已創建的FeatureStore項目名稱,fs_demo。
"FeatureStoreConfs": { "pairec-fs": { "RegionId": "cn-beijing", "AccessId": "${AccessKey}", "AccessKey": "${AccessSecret}", "ProjectName": "fs_demo" } },
配置FeatureConfs。
FeatureStoreName
:和上一步FeatureStoreConfs中的設置pairec-fs保持一致。FeatureStoreModelName
:已創建的模型特征名稱,fs_rank_v1。FeatureStoreEntityName
:已創建的特征實體名稱,user。表示PAI-Rec引擎中通過FeatureStore Go SDK去獲取模型fs_rank_v1中特征實體為user側的特征。
"FeatureConfs": { "recreation_rec": { "AsynLoadFeature": true, "FeatureLoadConfs": [ { "FeatureDaoConf": { "AdapterType": "featurestore", "FeatureStoreName": "pairec-fs", "FeatureKey": "user:uid", "FeatureStoreModelName": "fs_rank_v1", "FeatureStoreEntityName": "user", "FeatureStore": "user" } } ] } },
配置AlgoConfs。
此配置代表告訴PAI-Rec去連接哪一個EAS模型打分服務。
Name
:和部署的EAS服務名稱一致。Url
和Auth
:EAS服務給出的信息,您可以在EAS模型在線服務頁面單擊服務名稱,然后在服務詳情頁簽單擊查看調用信息獲取URL和Token。更多詳細配置可參見PAI-Rec和EAS常見問題。
"AlgoConfs": [ { "Name": "fs_demo_v1", "Type": "EAS", "EasConf": { "Processor": "EasyRec", "Timeout": 300, "ResponseFuncName": "easyrecMutValResponseFunc", "Url": "eas_url_xxx", "EndpointType": "DIRECT", "Auth": "eas_token" } } ],
配置完成后,關于如何使用PAI-Rec,請參見什么是推薦系統開發平臺PAI-Rec。