Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

代码逐梦
• 阅读 762

导读

稀疏 CTR 模型是用于预测点击率的一类深度学习模型的统称。通过处理高维稀疏特征数据实现高效的广告点击率预测,准确的 CTR 预测可以更好地进行广告投放决策,提升广告投放效果。在稀疏 CTR 模型场景下,通常使用大量高维稀疏特征,这类 Embedding 矩阵造成了巨大的存储开销。本文介绍了蚂蚁 AI Infra 团队在 TFPlus 项目中提出的 Hybrid Embedding 方案,以应对海量 Embedding 带来的存储资源、特征治理方面的挑战。

背景

在实际场景中,稀疏 CTR 模型会使用大量高维稀疏特征,如商品 ID、用户 ID 等,这些特征的取值可能非常稀疏。处理这样的稀疏 Embedding 矩阵需要引入巨量的存储和通信开销。实际场景中,稀疏层参数可达千亿甚至万亿,给系统设计带来巨大挑战。

由于传统的 TensorFlow Variable 存在静态 Shape 难以预估、特征冲突等问题,TFPlus 引擎基于 TensorFlow 的自定义算子的扩展能力,实现了 KvVariable 内存参数服务器。KvVariable 采用分布式哈希存储方案,针对稀疏 CTR 模型的超大 Embedding 层进行了一系列优化,如配合 DLRover 支持 Embedding 层的弹性扩缩容,增量更新方式提升模型上线速度,提供了特征裁剪、特征淘汰等能力。

在蚂蚁的推荐场景,KvVariable 内存参数服务器得到了广泛的应用,具体方案如下:

  1. 训练:采用了数据并行和模型并行的方式,并基于“有分片,无副本” (With-sharding,No-replica) 架构。多个 worker 节点进行异步的数据并行计算,负责执行深度神经网络的前向传播和反向传播计算;多个 ps 节点进行模型并行计算,负责稀疏 Embedding 参数的分片存储、收集汇总梯度以及参数的更新。
  2. 推理:采用了“无分片、有副本” (No-sharding,With-replicas) 架构。在这种架构中,不对稀疏 CTR 模型的 Embedding 进行分片存储,而是使用多个副本 (replicas) 来存储相同的数据。每个副本都包含完整的 Embedding 数据,并且可以独立地进行推理,从而提高系统的可靠性。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

KvVariable 内存参数服务器方案通过分布式的扩展能力,一定程度上解决了单机处理海量特征的瓶颈问题,但没有很好地解决稀疏 CTR 模型对于内存资源日益增长的需求。同时,采用参数服务器的方式增加集群规模时,会引入额外的通信开销和稳定性下降,下面将具体分析。

问题分析

分布式内存参数服务器一定程度上解决了单机处理海量特征的瓶颈问题,但仍然存在很多不足:

  • 通信:增加存储节点,意味着系统通信成本的增加 (线性关系)
  • 稳定性:增加存储节点,意味着系统稳定性的降低 (指数关系)

此外,在蚂蚁的推荐场景中,受集群资源总量限制和业务预算限制,资源问题是一个比较大的痛点:

  • 有限的资源:资源总量受限于 ROI 和业务预算。这意味着系统可能无法支持超出资源限制的模型的训练和推理部署。更大的模型、更多的参数可以实现对商品和用户更精细的刻画,从而获得更好的推荐效果。但是,由于资源的限制,推荐系统可能无法支持更大模型的训练和推理。
  • 成本挑战:稀疏 CTR 模型需要海量存储,内存方案比较昂贵,希望能够寻求更具性价比的存储方案实现降本增效。
  • 资源难以预估:在线学习场景中,由于数据分布的变化,模型可能会持续增长,导致系统内存占用不断增加,进而导致资源用量超出预先设定的配额,出现内存不足 (OOM) 的问题。这将对推荐系统的稳定性和效果产生负面影响。
  • 特征治理:Embedding 作为一种特征数据可能被多任务使用,如果每个任务都维护一份完整的 Embedding 副本,将导致数据冗余和资源浪费的问题。

Hybrid Embedding

全新设计的 Embedding 存储架构

基于以上问题,AI Infra 团队提出了一种基于多层存储的 Hybrid Embedding 方案,对 KvVariable 参数服务器进行了极致优化,以满足日益增长的稀疏 Embedding 的存储需求,并提高训练稀疏 CTR 模型的性价比。此外,通过 Embedding Service,解决了 Embedding 特征的冗余问题,满足了特征治理的需求。下面将重点介绍 Hybrid Embedding 中的关键技术。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

NVMe SSD

NVMe 等高速读写设备的发展对解决推荐系统内存资源问题提供了有力的支持,相较于传统的 SATA 存储设备,NVMe 设备具有 10 倍的读写速度,随机读写可达每秒 900K/275K IOPS,PCIe Gen4 下理论带宽 7.8GB/s,延迟 80us。

Embedding Service

Embedding Service 是提供一站式高扩展性嵌入式服务的技术,通常用于将离散的输入特征 (如文本、用户 ID、商品 ID 等) 映射到对应的向量。它作为一个独立的服务嵌入到机器学习模型中,供模型在线训练和推理使用。用户事先通过离线训练或在线学习的方式生成表征向量,存储在 Embedding Service 中。同一个 Embedding 向量可被多任务或多副本共享使用,避免数据冗余和资源浪费。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

层次化存储与冷热特征

层次化存储思想基于数据的访问频率和访问速度的不同,将数据划分为多个层级,并根据不同层级的存储介质和访问速度,将数据存储在不同的层级中。通常,存储介质的容量与访存速度成反比,较高层级的存储介质 (如内存、高速缓存等) 访问速度较快但容量较小,适合存储频繁访问的热数据;而较低层级的存储介质 (如磁盘、分布式文件系统等) 容量较大但访问速度较慢,适合存储访问较少的冷数据。

稀疏 Embedding 特征在训练中通常服从幂律分布,低频特征占比大,高频特征占比小。因此,可以根据频次信息对 Embedding 进行冷热分组,分配在不同的存储介质中。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

技术选型

为了保证层次化存储的读写性能,高效地利用 NVMe SSD 实现随机读写很重要。为此,我们对比了业界多款 SSD KV 存储,针对广告推荐模型模型训练到一定程度后特征分布趋于稳定,存在大量随机读、更新操作的特点进行分析。

  1. 读方面:LevelDB、RocksDB 等采用常规 LSM Tree+SSTable 结构的存储,随机读需要进行层次访问文件与 O(log N) 的查询,性能存在一定瓶颈;采用 B+tree 的存储由于层级较少,虽然需要一定次数的查询,对比 LSM Tree 结构查询性能更好且稳定。
  2. 更新:常规 LSM Tree 结构的存储定期写入磁盘,有较好的写入性能;而 B+tree 在写入修改时需要大量移位操作。

最终我们选择了一款蚂蚁内部自研的高性能 SSD 存储引擎 PHStore,其能够提供高效的 SSD 随机读写能力,在保证写入性能的同时,随机读性能远优于上述存储架构。在提供高读写性能的同时,该存储引擎还有高可用、高可靠的容错机制以及线性扩展能力,使得我们能够方便地基于其提供的分布式服务构建 Embedding Service。

重点工作

  1. 基于 LFU 算法依据频次信息实现动态的冷热特征划分,并依据时段内特征查询的 IOPS 与缓存命中率计算缓存容量,从而实现动态的缓存更新策略。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

  1. 我们设计了一套索引 Meta 表的结构,以实现特征的精准查询,采用 Lazy Load 的方式更新缓存,定期更新时段内发生变化的增量 IDs,尽量平衡缓存命中率与冷热表置换对训练性能的影响。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

  1. 对 Embedding 查询进行了一系列优化,在前反向传播过程中对参数进行拼接、缓存,实现一次传播一次查询,成倍减少 SSD 的访问频次。
  2. 在模型容错方面,实现了混合存储的动态分片,均匀地将参数量与 IO 负载分布在存储节点上,当即将发生 OOM 或到达 IO 瓶颈时,配合 DLRover 的调度进行无感知的扩容。

效果与总结

我们对比了业内常见的模型结构,如 DeepFM、DLRM、Transformer 等,均在性能不明显下降的情况下达到明显的内存优化。

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

在蚂蚁推荐场景中,目前,Hybrid Embedding 已全面应用于在线学习场景,在性能几乎与 DRAM kv 存储打平的同时,大部分原本被 Embedding 占用的内存资源被优化,ps 节点内存平均节省 50%左右。

本文介绍了蚂蚁推荐系统 DLRover 采用的大规模稀疏存储 Hybrid Embedding 方案,该方案不仅实现了在系统应用中降低成本和提高效率的目标,还为不断增长的模型参数规模打下了技术基础。未来,我们将继续优化 Hybrid Embedding 以满足高性能训练需求,将其应用于更多的业务场景中。

TFPlus 项目后续会协同大模型技术栈的训练加速方案一起在 DLRover 项目中开源,敬请关注:https://github.com/intelligent-machine-learning/dlrover

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
深度学习技术开发与应用
关键点1.强化学习的发展历程2.马尔可夫决策过程3.动态规划4.无模型预测学习5.无模型控制学习6.价值函数逼近7.策略梯度方法8.深度强化学习DQN算法系列9.深度策略梯度DDPG,PPO等第一天9:0012:0014:0017:00一、强化学习概述1.强化学习介绍2.强化学习与其它机器学习的不同3.强化学习发展历史4.强化学习典
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
CSCNN:新一代京东电商广告排序模型
导读:随着电商平台对图像信息的大量引入,通过图像分析来进行广告点击率判断就成了新的趋势。本次分享的主题为CSCNN:新一代京东电商广告排序模型,主要介绍视觉信息在CTR排序模型中的应用。一方面,我们将介绍在工业场景下使用CNN将图像加入CTR模型联合建模的方法;另一方面,我们指出传统用于分类任务的CNN并不适合电商场景。将电商场景中丰富的、具有强视觉先验的"
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
代码逐梦
代码逐梦
Lv1
热爱的事情都要不留余力。
文章
3
粉丝
0
获赞
0