议题简介
AI时代,数据、算法、算力是三大核心要素,而算法工程作为运作载体,提供AI能力的业务价值变现。
美团作为一家科技零售公司,很早就在搜索、推荐、广告方向践行用AI“帮大家吃的更好、生活更好”,持续打磨算法体系和算法工程体系,以追求极致的用户体验。
本次技术沙龙,旨在分享稀疏场景下的算法工程内容,包括训练、特征、推理三个方向遇到的系统挑战与取得的阶段性成果。
什么是稀疏场景/稠密场景
稀疏场景
稀疏场景是指在数据集中,大量的特征值是缺失的或者为0。这种情况在多维数据集中很常见,特别是那些涉及大量分类或多级别特征(如文本数据、用户行为数据等)的领域。例如,一个用于推荐系统的用户-物品交互矩阵通常是稀疏的,因为一个用户只可能与库存中很小一部分的物品有交互。
稠密场景
与稀疏场景相反,稠密场景是指数据集中的大多数特征值都是有意义的(非零或非缺失)。这种情况下的数据通常更加容易处理,因为几乎每一项数据都携带有价值的信息。
稀疏模型美团过去5年发展情况
- 数据:外卖订单量,百万 → 千万;建模窗口:周 → 月 → 年
- 模型:个性化交互建模,建模大小从 G → 百G;多模态,模型计算从百万FLOPs → 亿FLOPs
- 算例:CPU算力每两年翻1倍的摩尔定律逐步消退;GPU算力每10年1000倍的老黄定律开始登场
在算力供给与业务发展严重不匹配的情况下,需要算法工程,在软、硬件下协同做功,才能更好支撑业务的发展
美团深度学习推荐系统模型训练挑战
大规模稀疏参数
- 个体从几百 → 几千,增长了近10倍
- 总参数量从几亿 → 百亿,增长了10 ~ 20倍
- 如何更加灵活、高效的存储大规模稀疏参数?
海量的样本
- 训练样本从百亿 → 千亿,增长了近10倍
- 如何保障业务能在1天内完成训练?
模型复杂度
- 越来越复杂,模型单步计算时间增长10倍以上
- 如何在复杂度持续提升的情况下,仍然保障系统的性能?
大规模集群部署
- 大规模集群运行时,会遇到慢机和宕机
- 如何自动处理异常,保障系统的稳定运行?
CPU训练框架实践
架构选择:TensorFlow PS分布式训练架构
TensorFlow PS分布式训练架构是TensorFlow框架中用于实现Parameter Server(参数服务器)的分布式训练模式。在这种架构下,参数服务器(PS)负责存储和更新模型参数,而各个Worker节点则负责计算梯度和更新参数。这种分布式训练架构可以有效地加快大规模神经网络的训练速度,并且适用于处理稀疏数据的情况。
在稀疏场景下,由于数据大多是稀疏的,因此传统的数据并行训练方式可能会导致通信开销过大。TensorFlow PS分布式训练架构通过将参数服务器作为中心节点,负责参数的存储和更新,可以更有效地处理稀疏数据的训练过程。通过参数服务器的中心化管理,可以减少Worker节点之间的通信量,加速梯度的传输和模型参数的更新。
遇到问题:对于大流量业务,一次训练实验,从几个小时增长到了几天
问题分析:Profling工具链
问题分析工具链
- TF原生是单步采样,不支持全局监控
- TF原生指标太粗,未展示通信算子全链路耗时
- 全链路细粒度埋点,与公司原CAT打通
自动化实验框架
- 抽象实验过程(数据、模型、参数)、
- 自动采集各类监控指标
- 自动化、多轮实验并生成报告
通过实验,系统分析:
- 稀疏特征个数增加10X,单次请求压力变大:通讯压力、PS并发压力
- 总参数增长10~20X:PS需要更多内存,需要扩更多PS
- 模型计算增加10X:单位算力吞吐降低,不优化要扩更多Worker
- 训练样本扩大10X,通过扩展Worker加速,总访问请求压力:通讯压力、PS并发压力
考虑横向扩展PS堆资源,看能否解决问题 ⬇
核心挑战:有限PS实例下的分布式计算优化
解决方案:高性能弹性稀疏参数
大规模稀疏参数使用tf variable弊端
- 参数大小需要提前设定,带来巨大的空间浪费
- 不支持动态伸缩,无法支持Online Learning
方案:
- 基于HashTable实现了自动弹性伸缩参数,避免开辟几余空间
- 支持自动分片,分布式存储,解决参数存储扩展性问题
- API设计上保持与社区版本兼容,用户接入成本低
解决大规模稀疏参数高效存储问题
解决方案:PS架构的训练吞吐优化
PS负载均衡优化
- 所有稀疏参数和大的稠密参数自动、均匀的切分到每个PS上
- 解决了原生Adam优化器,B参数全局热点的问题(复制+冗余计算)
单实例PS并发优化
- 核心数据结构HashTable选用了高并发的tbb::concurrent_hash_map
- 基于内存池化的方式优化HashTable的内存管理
通信优化
- 通信协议:使用更高效的通信协议rdma
- ·聚合通信:合并稀疏参数+对应的动量+对应低频过滤计数器的通信
计算和通信的重叠
- 在整个训练过程,通信和计算会相互等待,延迟时间占比48%
- 参数查询、参数训练、参数更新串行逻辑流水线化,但会影响算法精度
- 只处理影响小&通讯占大头的稀疏参数(95%+通讯),且控制并行步数、让算法精度控制在接受范围内
整体优化效果
- 分布式扩展性从1百 worker->上千 worker
- 大规模训练同资源吞吐提升2倍以上
- 支持公司1年样本1天内完成训练