EasyRec可以幫助您快速構建推薦模型。本文以讀取MaxCompute表數據為例,介紹如何使用EasyRec進行模型訓練、配置任務例行化及部署模型。
前提條件
開通OSS,并創建Bucket,詳情請參見開通OSS服務和控制臺創建存儲空間。
重要創建Bucket時,不要開通版本控制,否則同名文件無法覆蓋。
開通PAI,并完成OSS訪問授權,詳情請參見開通和云產品依賴與授權:Designer。
購買DataWorks,您可以根據需要選擇合適的資源類型(建議使用按量計費),詳情請參見購買指引。
如果使用子賬號部署模型,則需要為其授權部署權限,建議添加EAS涉及的所有權限點,詳情請參見云產品依賴與授權:EAS。
背景信息
EasyRec算法庫是阿里云PAI的推薦算法工具,包含DeepFM、DIN、MultiTower及DSSM等經典推薦排序和召回算法,可以幫助您在PAI平臺上快速訓練推薦算法模型、驗證模型效果及部署。EasyRec算法庫已經在信息推送、游戲、直播及競價廣告商等客戶的生產環境中部署,能夠大幅提升模型訓練效率。EasyRec算法庫的DataConfig配置和FeatureConfig配置要求如下:
DataConfig配置
input_fields
EasyRec支持讀取MaxCompute數據或HDFS數據,MaxCompute表中的每一列或CSV文件中的某一列,都需要與data_config中的一個input_fields對應,且字段順序一致。input_fields的字段詳情如下表所示。
字段
描述
示例
input_name
便于在feature_configs及data_config.label_fields中引用。
input_fields: { input_name: "label" input_type: FLOAT default_val:"" }
input_type
輸入類型,默認值為STRING。
default_val
數據為空時的默認填充值,通常設置為空字符串。根據input_type不同取值,default_val配置示例如下:
input_type為INT類型時,如果使用填充值6,則default_val配置為"6"。
input_type為FLOAT類型時,如果使用填充值0.5,則default_val配置為"0.5"。
說明input_fields的字段順序必須與MaxCompute表中的字段順序一致。
input_fields與CSV文件中的字段順序必須一致(CSV文件無Header)。
input_fields中的input_type字段必須與MaxCompute表或CSV文件對應列的類型一致,或是可以轉換的類型。例如:
MaxCompute表中STRING類型的“64”,可以轉換為INT類型的64。
MaxCompute表中STRING類型的“abc”,不能轉換為INT類型。
input_type
默認為CSVInput。如果在MaxCompute上,則使用OdpsInputV2。
separator
使用CSV格式的輸入時,需要指定separator作為列之間的分隔符。默認使用半角逗號(,)分隔。您也可以使用二進制分隔符,例如'\001'或'\002'。
label_fields
Label相關的列名,根據算法需要可以設置多個,例如多目標算法。該列名必須在data_config中存在。
prefetch_size
Data Prefetch,以Batch為單位,默認值為32。設置prefetch_size可以提高數據加載的速度,防止數據瓶頸。
shuffle
設置該參數,可以對訓練數據進行Shuffle,以獲得更好的訓練結果。
shuffle_buffer_size
Shuffle Queue的大小,表示每次Shuffle的數據量。該參數取值越大,訓練效果越好。建議在訓練前進行一次充分的Shuffle。
FeatureConfig配置
常用特征主要包括:
IdFeature(離散值特征/ID類特征)
例如user_id、item_id、category_id、age及星座均屬于IdFeature。
RawFeature(連續值類特征)
RawFeature類特征可以在Designer中先進行離散化(例如等頻、等距或自動離散化),變成IdFeature。也可以直接在feature_configs中配置離散化區間。
TagFeature(多值特征/標簽類特征)
TagFeature類特征格式通常為“XX|XX|XX”。例如,文章標簽特征為“娛樂|搞笑|熱門”,其中豎杠(“|”)為分隔符。
SequenceFeature(行為序列類特征)
SequenceFeature類特征格式通常為“XX|XX|XX”。例如,用戶行為序列特征為"item_id1|item_id2|item_id3",其中豎杠(“|”)為分隔符。該特征通常在DIN算法或BST算法中使用。
ComboFeature(組合特征)
對輸入的離散值進行組合
各特征的共用字段及特有字段如下。
表 1. 各特征的共用字段 字段
描述
input_names
輸入的字段。根據實際需要,可以設置1個或多個字段。
feature_name
特征名稱。如果未設置該字段,則默認為input_names[0]。
shared_names
其它輸入的數據列。僅適用于只有一個input_names的特征,不適用于有多個input_names的特征(例如ComboFeature)。
表 2. 各特征的特有字段 特征
字段
描述
示例
IdFeature
embedding_dim
Embedding Dimension。
feature_configs { input_names: "uid" feature_type: IdFeature embedding_dim: 64 hash_bucket_size: 100000 }
重要不能同時指定hash_bucket_size、 num_buckets、vocab_list及vocab_file,只能指定其中之一。
hash_bucket_size
Hash Bucket的大小,取值策略如下:
對于user_id等規模比較大的特征,Hash沖突影響比較小,可以將hash_bucket_size設置為
number_user_ids/ratio
,ratio通常為10~100。對于星座等規模比較小的特征,Hash沖突影響比較大,可以將hash_bucket_size設置為
number_xingzuo_ids*ratio
,ratio通常為5~10。
num_buckets
Buckets Number。僅當輸入為INT類型時,可以使用該參數。
vocab_list
指定詞表,適合取值比較少,可以枚舉的特征。例如星期、月份或星座。
vocab_file
使用文件指定詞表,用于指定比較大的詞表。
RawFeature
boundaries
分桶的值,通過一個數組進行設置。
feature_configs { input_names: "ctr" feature_type: RawFeature boundaries: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] embedding_dim: 8 }
embedding_dim
如果設置了分桶,則需要配置Embedding Dimension。
TagFeature
separator
分割符,默認為豎杠(“|”)。
feature_configs { input_names: "article_tag" feature_type: TagFeature embedding_dim: 16 hash_bucket_size: 1000 }
hash_bucket_size
Hash分桶大小,配置策略與IdFeature類似。
num_buckets
輸入為整數時(例如6|20|32),可以配置該參數為其中的最大值。
embedding_dim
Embedding Dimension,與IdFeature中的該參數類似。
SequenceFeature
embedding_dim
Embedding Dimension。
feature_configs { input_names: "play_sequence" feature_type: SequenceFeature embedding_dim: 64 hash_bucket_size: 100000 }
hash_bucket_size
配置策略同IdFeature中的該參數。
ComboFeature
input_names
需要組合的特征名,數量大于或等于2,來自data_config.input_fields.input_name。
feature_configs { input_names: ["age", "sex"] feature_type: ComboFeature embedding_dim: 16 hash_bucket_size: 1000 }
embedding_dim
Embedding Dimension,類似IdFeature中的該參數。
hash_bucket_size
Hash Bucket的大小 。
數據集
本文使用天池平臺上的淘寶點擊數據,詳情請參見數據集。
步驟一:創建工作流
進入數據開發頁面。
登錄DataWorks控制臺,切換至目標地域后,單擊左側導航欄的 ,在下拉框中選擇對應工作空間后單擊進入數據開發。
在數據開發頁面,鼠標懸停至圖標,單擊新建業務流程。
在新建業務流程對話框中,輸入業務名稱和描述。
單擊新建。
在業務流程頁面,創建PAI Designer節點。
單擊新建節點,拖拽 至右側畫布。
在新建節點頁面的名稱文本框中,輸入prepare_train_data,其他參數使用默認值。
單擊確認。
在業務流程頁面,創建MaxCompute SQL節點。
拖拽 至右側畫布。
在新建節點頁面的名稱文本框,輸入EasyRec_train,其他參數使用默認值。
單擊確認。
在業務流程頁面,創建Shell節點。
拖拽 至右側畫布。
在新建節點頁面的名稱文本框,輸入deploy,其他參數使用默認值。
單擊確認。
步驟二:訓練并部署模型
準備數據。
您可以直接使用處理后的樣本表:訓練表為pai_online_project.easyrec_demo_taobao_train_data,評估表為pai_online_project.easyrec_demo_taobao_test_data,即省略PAI Designer節點,直接從MaxCompute SQL節點開始。
您也可以按照以下流程準備數據。將天池平臺上淘寶點擊數據整合后的表為pai_online_project.easyrec_demo_taobao_ori_data,該數據集除大部分STRING類型的IdFeature類特征外,還有一列DOUBLE類型的Price特征(RawFeature類特征),需要使用Designer的分箱組件進行特征工程,您可以為已創建的機器學習節點關聯如下Designer工作流(只能關聯與DataWorks在同一地域的Designer工作流),詳情請參見創建機器學習(PAI)節點。具體的實驗流程如下。
序號
描述
①
讀入數據。
②
分割出訓練數據。
③
分割出評估數據。
④
Shuffle過程。
⑤
使用分箱組件,進行等頻離散。
⑥
根據等頻離散的結果,對數據進行轉換。
⑦
將訓練數據寫入表。
⑧
將評估數據寫入表。
訓練并導出模型。
在已創建的DataWorks的MaxCompute SQL節點中,執行如下命令,進行模型訓練。
PAI -project algo_public -name easy_rec_ext -Darn="acs:ram::XXXXX:role/AliyunODPSPAIDefaultRole" -Dbuckets="oss://examplebucket/xxx/" -Dcluster="{\"ps\":{\"count\":2,\"cpu\":1000,\"memory\":40000},\"worker\":{\"count\":8,\"cpu\":1000,\"memory\":40000}}" -Dcmd="train" -Dconfig="oss://examplebucket/xxx/multitower.config" -DossHost="oss-cn-region_name-internal.aliyuncs.com" -Dtrain_tables="odps://pai_online_project/tables/easyrec_demo_taobao_train_data" -Deval_tables="odps://pai_online_project/tables/easyrec_demo_taobao_test_data" -Dmodel_dir="oss://examplebucket/xxx/" -Dwith_evaluator=1;
命令中的參數如下所示,需要根據實際情況替換參數值。
參數
描述
示例
project
工程名。EasyRec算法所在的project,默認為algo_public,通常不需要修改。僅特殊情況(EasyRec官方另行通知時)才需要修改。
algo_public
arn
ARN的角色名稱。您可以登錄PAI控制臺,在 頁面的Designer區域,單擊操作列下的查看授權信息,獲取arn。
"acs:ram::XXXXX:role/AliyunODPSPAIDefaultRole"
buckets
用于指定算法將要讀取的OSS bucket。
"oss://examplebucket/xxx/"
cluster
分布式運行任務信息,詳情請參見PAI-TF任務參數介紹中的cluster參數介紹。
"{\"ps\":{\"count\":2,\"cpu\":1000,\"memory\":40000},\"worker\":{\"count\":8,\"cpu\":1000,\"memory\":40000}}"
cmd
需要配置為固定值train。
"train"
config
模型Config文件的OSS路徑,您可以參考此處的MultiTower模型Config文件(下載Config示例)。
"oss://examplebucket/xxx/multitower.config"
ossHost
OSS Endpoint,地域和Endpoint對照表請參見公共云下OSS Region和Endpoint對照表。
oss-cn-region_name-internal.aliyuncs.com
train_tables
訓練表,多個訓練表之間使用半角逗號(,)分隔。
"odps://pai_online_project/tables/easyrec_demo_taobao_train_data"
eval_tables
評估表,多個評估表之間使用半角逗號(,)分隔。
"odps://pai_online_project/tables/easyrec_demo_taobao_test_data"
model_dir
模型目錄,將會覆蓋config配置的模型路徑,一般在周期性調度時使用。
"oss://examplebucket/xxx/"
with_evaluator
是否在訓練時使用一個Worker進行評估。通常設置8個Worker,其中七個Worker進行訓練,一個Worker進行評估(計算測試集的AUC)。取值范圍如下:
0:訓練時不使用Worker進行評估。
1:訓練時使用一個Worker進行評估。
1
訓練完成后,系統會自動將模型導出至
model_dir
配置路徑下的/export/final/目錄。部署模型(該步驟中的命令均在已創建的DataWorks的Shell節點中執行)。
執行如下命令編寫描述服務相關信息(模型存儲位置及資源規格等)的JSON文件,該文件的詳細參數請參見創建服務,如下僅給出編寫JSON文件的示例命令,需要您根據實際情況修改參數值。
ymd=$1 #獲取例行化配置中設置的日期參數。 cat << EOF > echo.json { "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "instance": 1, "name": "model_name" }, "model_path": "your_model_path", "processor": "tensorflow_cpu_1.12", } EOF
其中:model_path需要配置為上述步驟已生成的模型路徑;name配置為模型服務名稱,同地域內唯一。
部署模型。
您可以根據實際部署情況,選擇創建服務或更新服務:
如果首次部署服務,則可以使用如下命令,創建新服務。
/home/admin/usertools/tools/eascmd -i <yourAccessId> -k <yourAccessKey> -e <OSS Endpoint> create <echo.json>
參數
描述
示例
<yourAccessId>
阿里云賬號的AccessKey ID。
無
<yourAccessKey>
阿里云賬號的AccessKey Secret。
無
<OSS Endpoint>
將模型部署至某地域,此參數為該地域對應的Endpoint,取值詳情請參見命令使用說明中地域與Endpoint的對應關系表。
pai-eas.cn-shanghai.aliyuncs.com
<echo.json>
上一步中編寫的描述服務相關信息(模型存儲位置及資源規格等)的JSON文件名稱。
echo.json
如果存在已經部署的服務,則可以使用如下命令,更新服務。
/home/admin/usertools/tools/eascmd -i <yourAccessId> -k <yourAccessKey> -e <Endpoint> modify <cn-beijing/model_name> -s echo.json
參數
描述
示例
<yourAccessId>
阿里云賬號的AccessKey ID。
無
<yourAccessKey>
阿里云賬號的AccessKey Secret。
無
<Endpoint>
將模型部署至某地域,此參數為該地域對應的Endpoint,取值詳情請參見命令使用說明中地域與Endpoint的對應關系表。
pai-eas.cn-shanghai.aliyuncs.com
<cn-beijing/model_name>
模型地址與OSS數據所在地域一致。該模型名稱指描述服務相關信息JSON文件中,name參數的取值。
cn-beijing/model_name
<echo.json>
描述服務相關信息的JSON文件名稱。
echo.json
步驟三:配置任務例行化
以天級別更新的模型為例,需要每天例行進行以下操作:
生成訓練和評估樣本表。
調用EasyRec進行訓練并導出模型。
將EasyRec導出后的模型部署到EAS。
在DataWorks中創建的業務流程如下所示。您需要自行配置各節點的屬性及調度依賴等關系,此處僅以EasyRec_train節點為例,介紹如何配置節點屬性及調度依賴。
打開節點頁面。
您可以通過以下任意一種方式打開EasyRec_train節點:
雙擊EasyRec_train節點。
右鍵單擊EasyRec_train,在快捷菜單中,單擊打開節點。
在節點頁面,單擊頁面右側的調度配置。
在調度配置頁面的調度參數區域,配置時間參數,以區分不同天的任務。
在調度配置頁面的調度依賴區域,配置上下游節點,詳情請參見配置同周期調度依賴。
說明如果節點無上游依賴,則使用工作空間根節點。
單擊Shell節點頁面上方的圖標,保存配置。
在業務流程頁面,單擊上方的圖標,運行Shell節點。
Debug
運行EasyRec命令時,DataWorks會打印Logview。您可以通過Logview快速查看模型訓練效果或定位錯誤。
在瀏覽器中打開Logview(即下圖紅框中的鏈接)。
在日志頁面的Job Details頁簽,雙擊ODPS Tasks實例。
在日志頁面的ODPS Tasks區域,單擊ODPS Tasks實例。
在Worker運行頁面,可以根據需要選擇查看對應的實例。
其中:
worker 0為訓練worker(worker 0、worker 2~worker 7均為訓練worker),單擊StdEarr列下的圖標,即可查看訓練進程。每log_step_count_steps步,打印一次日志。
worker1為評估worker,單擊stderr列下的圖標,即可查看模型在評估集上的指標。
后續步驟
您可以在EAS中查看已經部署的模型,并在線調用該服務,詳情請參見服務在線調試。