EasyRec可以帮助您快速构建推荐模型。本文以读取MaxCompute表数据为例,介绍如何使用EasyRec进行模型训练、配置任务例行化及部署模型。
前提条件
- 开通OSS,并创建Bucket,详情请参见开通OSS服务和创建存储空间。
重要 创建Bucket时,不要开通版本控制,否则同名文件无法覆盖。
- 开通PAI,并完成OSS访问授权,详情请参见开通和云产品依赖与授权:Designer。
- 购买DataWorks,您可以根据需要选择合适的资源类型(建议使用按量计费),详情请参见购买指引。
- 如果使用子账号部署模型,则需要为其授权部署权限,建议添加PAI-EAS涉及的所有权限点,详情请参见云产品依赖与授权:EAS。
背景信息
- 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。
- input_fields
- FeatureConfig配置
常用特征主要包括:
- IdFeature(离散值特征/ID类特征)
例如user_id、item_id、category_id、age及星座均属于IdFeature。
- RawFeature(连续值类特征)
RawFeature类特征可以在PAI-Studio中先进行离散化(例如等频、等距或自动离散化),变成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的大小 。 - IdFeature(离散值特征/ID类特征)
数据集
本文使用天池平台上的淘宝点击数据,详情请参见数据集。
步骤一:创建工作流
- 进入数据开发页面。
- 登录DataWorks控制台。
- 在左侧导航栏,单击工作空间列表。
- 选择工作空间所在地域后,单击相应工作空间后的数据开发。
- 鼠标悬停至
图标,单击业务流程。
- 在新建业务流程对话框,输入业务名称和描述。
重要 业务名称必须是大小写字母、中文、数字、下划线(_)及小数点(.),且不能超过128个字符。
- 单击新建。
- 在业务流程页面,创建机器学习节点。
- 拖拽 至右侧画布。
- 在新建节点页面的节点名称文本框,输入prepare_train_data,其他参数使用默认值。
- 单击提交。
- 在业务流程页面,创建MaxCompute SQL节点。
- 拖拽 至右侧画布。
- 在新建节点页面的节点名称文本框,输入EasyRec_train,其他参数使用默认值。
- 单击提交。
- 在业务流程页面,创建Shell节点。
- 拖拽
至右侧画布。
- 在新建节点页面的节点名称文本框,输入deploy,其他参数使用默认值。
- 单击提交。
- 拖拽
步骤二:训练并部署模型
- 准备数据。
将天池平台上淘宝点击数据整合后的表为 pai_online_project.easyrec_demo_taobao_ori_data,该数据集除大部分STRING类型的IdFeature类特征外,还有一列DOUBLE类型的Price特征(RawFeature类特征),需要使用PAI-Studio的 分箱组件进行特征工程,您可以为已创建的机器学习节点关联如下PAI-Studio实验(只能关联与DataWorks在同一地域的PAI-Studio实验),详情请参见 创建机器学习(PAI)节点。
具体的实验流程如下。
序号 描述 ① 读入数据。 ② 分割出训练数据。 ③ 分割出评估数据。 ④ Shuffle过程。 ⑤ 使用分箱组件,进行等频离散。 ⑥ 根据等频离散的结果,对数据进行转换。 ⑦ 将训练数据写入表。 ⑧ 将评估数据写入表。 - 训练并导出模型。
在已创建的DataWorks的MaxCompute SQL节点中,执行如下命令,进行模型训练。
命令中的参数如下所示,需要根据实际情况替换参数值。pai -name easy_rec_ext -project algo_public -Dcmd=train -Dtables="odps://pai_online_project/tables/easyrec_demo_taobao_train_data,odps://pai_online_project/tables/easyrec_demo_taobao_test_data" -Dcluster='{\"ps\":{\"count\":2,\"cpu\":1000,\"memory\":40000},\"worker\":{\"count\":8,\"cpu\":1000,\"memory\":40000}}' -Darn='acs:ram::XXXXX:role/aliyunodpspaidefaultrole' -Dbuckets='oss://bucket_name.oss-cn-region_name-internal.aliyuncs.com/' -Dconfig='oss://test-rec/avazu/conf/multitower.config' -DossHost=oss-cn-region_name-internal.aliyuncs.com -Dwith_evaluator=1;
参数 描述 示例 project 工程名。EasyRec算法所在的project,默认为algo_public,通常不需要修改。仅特殊情况(EasyRec官方另行通知时)才需要修改。 algo_public cmd 需要配置为固定值train。 train tables 使用训练表及评估表,多张表以英文逗号(“,”)分隔。 "odps://pai_online_project/tables/easyrec_demo_taobao_train_data,odps://pai_online_project/tables/easyrec_demo_taobao_test_data" cluster 分布式运行任务信息,详情请参见PAI-TF任务参数介绍中的cluster参数介绍。 '{\"ps\":{\"count\":2,\"cpu\":1000,\"memory\":40000},\"worker\":{\"count\":8,\"cpu\":1000,\"memory\":40000}}' arn ARN的角色名称。您可以进入PAI-Studio项目,在左侧导航栏单击设置,在基本设置页面的OSS访问授权区域,获取ARN。 'acs:ram::XXXXX:role/aliyunodpspaidefaultrole' buckets 用于指定算法将要读取的OSS bucket。 'oss://bucket_name.oss-cn-region_name-internal.aliyuncs.com/' config 模型Config文件的OSS路径,您可以参考此处的MultiTower模型Config文件(下载Config示例)。 'oss://test-rec/avazu/conf/multitower.config' ossHost OSS Endpoint,地域和Endpoint对照表请参见公共云下OSS Region和Endpoint对照表。 oss-cn-region_name-internal.aliyuncs.com with_evaluator 是否在训练时使用一个Worker进行评估。通常设置8个Worker,其中七个Worker进行训练,一个Woker进行评估(计算测试集的AUC)。取值范围如下: - 0:训练时不使用Worker进行评估。
- 1:训练时使用一个Worker进行评估。
1 训练完成后,系统会自动将模型导出至config
配置路径下的 /export/final/目录。 - 部署模型(该步骤中的命令均在已创建的DataWorks的Shell节点中执行)。
步骤三:配置任务例行化
- 生成训练和评估样本表。
- 调用EasyRec训练并导出模型。
- 将EasyRec导出后的模型部署到PAI-EAS。

- 打开节点页面。
您可以通过以下任意一种方式打开 EasyRec_train节点:
- 双击EasyRec_train节点。
- 右键单击EasyRec_train,在快捷菜单,单击打开节点。
- 在节点页面,单击页面右侧的调度配置。
- 在调度配置页面的基础属性区域,为参数传入时间参数,以区分不同天的任务。
- 在调度配置页面的调度依赖区域,配置上下游节点,详情请参见配置同周期调度依赖。说明 如果节点无上游依赖,则使用工作空间根节点。
- 单击Shell节点页面上方的
图标,保存配置。
- 在业务流程页面,单击上方的
图标。
Debug
运行EasyRec命令时,DataWorks会打印Logview。您通过Logview可以快速查看模型训练效果或定位错误。
- 在浏览器中打开Logview(即下图红框中链接)。
- 在日志页面的ODPS Tasks区域,双击ODPS Tasks实例。
- 在Worker运行页面,可以根据需要选择查看的Task实例及Worker对应的实例。
其中:
- worker 0为训练worker(worker 0、worker 2~worker 7均为训练worker),单击stderr列下的
图标,即可查看训练进程。
每log_step_count_steps步,打印一次日志。
- worker1为评估worker,单击stderr列下的
图标,即可查看模型在评估集上的指标。
- worker 0为训练worker(worker 0、worker 2~worker 7均为训练worker),单击stderr列下的
后续步骤
您可以在PAI-EAS中查看已经部署的模型,并在线调用该服务,详情请参见公网地址调用。