算法|深度解析开源推荐算法框架 EasyRec 的核心概念和优势( 二 )


优势
和其他建模框架相比 , EasyRec在以下几个方面具备显著的优势:
支持多平台和多数据源训练 支持的平台包括: MaxCompute(原ODPS) DataScience(基于Kubernete) DLC(deep learning container) Alink 本地; 支持的数据源包括: OSS HDFS HIVE MaxCompute Table Kafka Datahub; 用户通常只需要定义自己的模型 , 在本地测试通过后 , 就可以在多种分布式平台上进行训练; 支持多种Tensorflow版本(=1.12=2.4 PAI-TF) , 能够无缝的对接用户的环境 , 不需要对代码做迁移和改动; 支持主流的特征工程的实现 , 特别是显示交叉特征 , 能够显著得提升效果; 支持HPO自动调参 , 显著降低了用户的调参工作量 , 并在多个场景中提升了模型效果; 实现了主流的深度模型 , 覆盖召回、排序、粗排、重排、多目标、多兴趣等; 支持EarlyStop BestExport 特征重要性 , 特征选择、模型蒸馏等高级功能 。 架构
EasyRec建模框架整体上是基于Estimator的数据并行训练方式 , 通过Parameter Server的结构支持多机多卡的训练 。 EasyRec的主要模块包括输入、特征构造、深度模型、Loss和Metric , 每个模块都可以自定义 。 针对用户在用TF进行训练可能遇到的多种问题 , 如worker退出失败、使用num_epoch evaluator无法退出、auc计算不准确等 , EasyRec做了深度优化 。 针对AdamOptimizer训练速度慢 , 异步训练慢机 , hash冲突 , 大样本空间负采样等问题 , EasyRec结合PAI TF(PAI优化过的tensorflow)和AliGraph也做了深度优化 。
模型 EasyRec内置了业界先进的深度学习模型 覆盖了推荐全链路的需求 , 包括召回、粗排、排序、重排、多目标、冷启动等 。

同时EasyRec也支持用户自定义模型 。 如下所示 , 在EasyRec里面实现自定义模型 , 只需要定义模型结构、Loss、Metric三个部分 , 数据处理和特征工程是可以直接复用框架提供的能力的 , 因此能够显著节省用户的建模时间和成本 , 能够将精力focus在模型结构的探索上 。 针对常见的模型类型如RankModel、MultiTaskModel等 , Loss和Metric部分也可以直接复用父类的定义 。

自动调参和自动特征工程 EasyRec自动调参接入了PAI automl自动调参的能力 , 实现了对多种参数的自动调优 。 EasyRec里面定义的任意参数都是可以搜索的 , 常见的参数包括hash_bucket_size embedding_dim learning_rate , dropout batch_norm 特征选择等 。 当你对某些参数拿不准时 , 就可以启动自动调参来帮助你寻找最优的设置;通过自动寻优得到的参数通常会比拍脑袋设置的参数要好 , 有时候还会带来意外的惊喜 。
特征工程通常是提升推荐效果的关键 , 做高阶的特征组合通常有助于提升模型效果 , 但是高阶组合的空间非常大 , 无脑组合会导致特征爆炸 , 拖累训练和推理的速度 。 因此 , EasyRec引入了自动特征工程(AutoFeature)的能力 , 自动寻找有提升的高阶特征 , 进一步提升模型的效果 。

搜索结果(top5):

模型部署 EasyRec模型可以一键部署到PAI EAS环境 , 也可以通过tf serving部署 。 为了提升inference性能 , EasyRec引入了PAI Blade的能力做placement优化 , op fusion , 子图去重等功能 , 通过上述优化qps提升30%以上 , rt下降50% 。 未来还将引入FP16的功能 , 进一步提升inference性能 , 降低memory的消耗 。 为了支持超大规模的Embedding , EasyRec对大模型做了拆分和op替换 , 将Embedding存储到Redis等分布式缓存里面 , 突破了内存的限制 。 从Redis获取embedding会比内存慢 , 通过对高频id进行cache等来降低对redis的访问来提升embedding lookup的速度 。

特征一致性 特征工程是搜广推流程里面的关键部分 , 也通常是造成线上线下效果不一致的原因 。 为了能够在快速迭代中保持离线在线的一致性 , 通常采用的方法是线上线下采用同一套代码 。 离线训练数据的构造流程:首先构造user feature(包含实时和离线两部分) item feature和context_feature , 然后join上训练样本(包含label) , 最后经过特征工程的jar包生成输入EasyRec的训练样本 。 上线的流程:将user feature(离线部分)和item feature导入Redis、Hologres等分布式存储 , 推荐引擎根据user_id和item_id去查询对应的特征 , 调用特征工程的库进行加工之后 , 送入EasyRec模型预测 。 在线部分的实时特征通常是使用blink、alink等支持流式计算的平台来生成的 , 而离线部分的实时特征构造有两种方式:离线模拟和在线落特征 。 这两种方式各有优缺点:由于日志丢失等问题 , 离线模拟通常会和线上有少量的不一致;在线落特征如果要增加新的特征通常要等待比较长的时间才能攒够样本 。 我们的解决方案是在线将用户行为的序列落下来 , 然后离线通过相同的jar包来加工出各种统计特征 , 如1h/2h/../24h的点击次数 。