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