喜马拉雅作者:李超、陶云、许晨昱、胡文俊、张抹黑、张玉静、赵云鹏、张猛
疾速落地大模型训练和推理能力,带来业务指标和后续算法优化空间的显著晋升。
业务介绍
喜马拉雅 app 的次要举荐场景有:每日必听、今日热点、私人 FM、猜你喜爱、VIP 信息流、发现页举荐等。
喜马拉雅 AI 云,是面向公司人员提供的一套从数据、特色、模型到服务的全流程一站式算法工具平台。
其特点在于提供了数据、画像、特色、模型、组件、利用等多个资源管理能力,通过可视化建模界面以及算法组件化能力,反对用户通过拖拽链接形式生成残缺的数据 -> 特色 -> 样本 -> 模型 -> 服务的残缺工作流程。平台还反对丰盛的特色、模型参数化定制能力,使得用户不必频繁批改代码仅在 UI 界面填写参数即实现调参、工作多场景反对等,极大的升高了用户的应用老本,晋升了公司整体算法开发效率。
平台上一个常见的深度模型训练 DAG 如下图所示:
目前平台反对了喜马拉雅多个 app 的举荐、广告、搜寻举荐等支流业务场景,以及画像产出、数据分析、BI 数据生成等多个定制化开发场景。
单干背景
随着公司算法能力的迅速晋升以及搜广推业务的一直增长,平台举荐技术栈疾速从机器学习过渡到深度学习,并对样本量级、特色维度、模型复杂度有着一直增长的需要。平台次要的深度技术框架是通过 spark 实现数据处理和 parquet 模式保留,通过 k8s 实现 gpu 资源调度,应用 tensorflow 实现模型训练。在具体实现过程中,有 2 类次要的痛点:
高维稠密特色反对
- hash 抵触问题: 个别对高维 ID 的简化操作就是 hash。咱们测试发现特定特色在 hash 到千万级别空间后抵触率能达到 20% 以上,要升高到 5% 以内须要裁减到五倍以上空间,失去了压缩的意义。咱们自研实现了一种多重 hash 计划,通过将高维 id 映射到 3 个万级空间,雷同场景下抵触率升高到 0.2‰,参数量升高 95%。但上线后发现也有缺点,即对长序列 id 特色列表,会裁减到原有 3 倍长度,显著升高了模型的推理性能。
- 特色入场 / 登场 / 变长: 这些均是对高维 ID 特色的根底要求。通过正当的配置这些参数,能够实现高维稠密大模型部署模型大小的缩减以及模型指标的稳固。使得反对十亿特色维度以上模型的训练和部署成为可能。
模型疾速迭代
- 模型分钟级别更新: 以后我司次要业务的模型更新个别是天级别。在特定须要高频响应的业务中,须要晋升到小时级或者分钟级。其距离次要受限于数据回流、数据处理、模型训练,以及模型上传的总耗时。如果仅是将上述天级的流程放慢 (kafka 数据流),最现实状况也就能做到小时级,无奈做到更快迭代。同时,因为每次部署均是一个全量模型,模型增大后,线上服务加载模型时的不可用工夫也会显著增长。
综上所述,为解决上述问题,以及为将来倒退预留肯定的技术可扩大空间,咱们打算采纳业内支流开源技术 + 落地实施方案。在考查阿里的 DeepRec、腾讯的 TFRA/DynamicEmbedding,以及 Nivida 的 HugeCTR 框架后,咱们决定采纳阿里提供的开源 DeepRec。
DeepRec 性能落地
高维稠密特色
在搜寻、举荐和广告畛域,特色往往具备高维稠密的特点,原生 Tensorflow 对稠密参数反对是通过在图中创立一个固定 shape 的 variable,而后把稠密特色通过 hash+mod 的形式 mapping 到 Variable 中来实现的。这会带来 4 个突出的问题:第一是稠密特色的抵触,比方不同的稠密 ID mapping 到同一个行内,第二是设置 shape 太大会导致内存的空洞,第三是 static 的 shape,当用户一旦确定该 shape 在后续训练都不能够批改,在在线学习的场景中稠密特色量的变动也是正当的场景,第四点是低效的 IO,在稠密模型导出 checkpoint 的时候会全量的导出。
在 DeepRec 中,Embedding Variable 应用动静的相似 HashMap 数据结构存储稠密参数,保障了稠密特色数目是能够弹性伸缩,在保障特色不抵触的状况下,也肯定水平的节约了内存资源。围绕这个性能,Embedding Variable 针对业务场景,反对了特色的准入 (特色入场),特色的淘汰 (特色登场),以及利用不同介质混合存储 Embedding Variable 进步特色规模,升高存储老本等性能。
高维稠密特色 ID 反对
高维 id 特色如用户 id、商品 id 等始终是深度模型特色的次要解决对象。模型引入这类特色、以及其延长的穿插特色后,特色维度能够轻易超出 biillon 级别。常见的 hash 解决方案往往又会陷入抵触率和模型参数的均衡问题中。通过应用 DeepRec 的 EmbeddingVariable,以额定 ”EV” 的 op 治理模型训练中每个特色 id 的更新应用状况,并辅以针对每个特色的参数设置,能够无效的均衡高维稠密 id 以及最终模型的参数量大小。同时,是否开启 ”EV” 也能够针对每个特色进行配置,敞开后就是原生的 tensorflow 实现。用户能够针对是否高维 id,自行判断开启或敞开该选项,应用非常灵活。以下是咱们基于 DeepRec 高维稠密特色能力,在咱们 AI 云平台落地后的用户应用界面图示:
特色入场、登场
咱们在实践中抉择了基于 Counter 的特色准入以及基于 global step 的特色淘汰性能,通过严格测试,性能合乎预期。在理论的应用过程中,咱们的教训是:全量特色能够默认敞开 ”EV” 选项,只针对高维稠密特色开启;能够先开启准入选项,设置一个比拟大的值,训练模型。而后基于 EV 剖析工具查看具体情况做灵便调整。最终模型开始长周期滚动更新时,依照需要开启登场选项。其中须要留神的是,入场和登场的次数设置,前者是这个 id 的更新频次、后者是总训练的 step 数 (batchsize),有较大区别。还有就是验证集的数据也会参加 EV 记录。
未入场特色
DeepRec 看待未入场和入场后的特色,其初始值逻辑是一样的。即在训练启动时,初始化一个较小的 embedding-table 矩阵 (相似规范的 embedding 初始化),上述 id 进入后,不做初始化而在该矩阵中查取 (随机)。未入场前,不参加梯度更新,入场后参加更新。线上 serving 时,对立返回默认值 (0)。DeepRec 反对了未入场特色与入场特色初始化值可灵便配置的性能。咱们在理论应用中,对于上述的未入场的特色,均对立设置初始化默认值为 0,对齐了训练和推理,也便于后续进行 mask 操作。对于入场后的特色沿用之前的参数初始化形式。针对上述入场、登场,以及未入场的特色的解决逻辑,咱们做了以下示意图帮忙用户了解:
EV 剖析
EV 剖析是模型训练调参中的一个重要工具。DeepRec 提供了剖析函数,咱们将此做成一个性能组件供用户应用。以下是咱们模型增量更新时的一个残缺流程图,模型 EV 剖析组件能够在每次训练完结后进行,提供特色名称、id 值、向量、更新频次、最近更新 step 等具体细节,帮忙用户分析模型和样本状况,从而进行相干参数配置,或者调整上游样本数据:
特色多级存储
DeepRec 的特色多级存储性能,次要解决训练时模型参数量过大,pod 内存无奈承载的状况,这个正是咱们目前碰到的次要问题。用户能够配置保留 embedding 参数要应用的存储 (HBM,DRAM 以及 SSD),之后多级存储会基于肯定的 cache 策略主动地抉择将高频被拜访到的特色保留到小容量的高速存储中,其余特色则搁置到大容量的低速存储。联合举荐场景中特色拜访的歪斜性 (20% 的特色拜访数占总拜访数的 80% 以上),能够在训练效率不受显著影响的状况下无效地缩小模型的内存使用量,升高模型训练的老本。目前咱们正在和阿里云单干落地该性能。
实时训练
DeepRec 的另一个次要性能是提供了增量模型的导出性能。即仅将增量训练的变动的参数导出成 ckpt,线上仅新加载这部分文件。这样能将模型更新所需的文件大小从上百 G 升高到几 KB 大小。应用这个性能,能够解决模型部署上线的模型传输和模型加载耗时,使得线上分钟级别的模型更新成为可能。咱们从新优化了流批一体的训练流程,实现了基于增量模型的全流程验证。并在业务场景实现了 10 分钟级别的模型迭代测试。以下是咱们基于 DeepRec 流批一体模型训练的流程示意图:
线上推理
- processor: DeepRec 官网曾经提供了对应的 libserving_processor.so 文件,也能够依照用户应用的版本自行编译,反对模型自动识别、增量更新、SessionGroup 等性能。满足业务须要。
- PAI-EAS: 阿里云还提供了 PAI-EAS 在线推理服务。用户只须要将模型文件部署到 oss 上,能够间接应用其在线推理性能。该服务还提供了常见的压测、扩缩容、线上 debug、性能监控以及日志等性能,能够满足一站式部署须要。咱们对此进行了测试,在专线开明的前提下,rt 等性能指标合乎上线要求。
总体收益
- 模型训练: 整体流程革新结束之后,咱们在单 worker 训练中 GPU 均匀利用率晋升到 40% 以上 (视具体模型),训练环节整体耗时缩小 50% 以上。
- 模型上线收益: 咱们目前在一个支流举荐场景中实现了全量上线。在对齐特色和样本状况下,在次要指标 ctr、ptr 等就有 2%~3%+ 的正向收益,rt、超时率等推理指标根本持平。在引入简略的高维 id 及穿插特色后,其正向收益也有 2%~3%+。其余支流业务场景模型也在逐渐切换中。
将来布局
咱们对后续的一些性能也在进行摸索,以便更好的撑持业务需要:
- SessionGroup: DeepRec 提供的线推理能力。在模型达到肯定大小后,线上推理须要相应的内存。以实体物理机进行超大内存划分,往往会造成对应的 CPU 资源无奈失去反复利用。该性能即在同一 pod 上,模型内存共享的状况下,提供并发推理能力。使得单节点的资源利用率,以及撑持 QPS 下限失去显著晋升。咱们曾经发展对该性能的测试。
- 模型压缩和量化: 目前模型训练过程以及模型导出的文件中,均蕴含相应的 EV 信息。在高维 id 场景中会占用很大一部分空间。在线上推理阶段能够舍弃该局部,放慢模型传输及加载,以及升高内存应用。同时,基于 DeepRec 生成的模型量化裁剪,咱们也在钻研中。
- 多模型推理、GPU 推理等: 基于 DeepRec 提供的 CUDA Multi-Stream 和 CUDA Graph 的能力,能够极大的晋升 Inference 场景下 GPU 的应用效率,基于 GPU 进行模型的推理能够进一步晋升对简单模型的推理的效率以及升高推理的老本。
感激
感激 DeepRec 社区在单干共建阶段提供的技术支持,其技术精湛、服务激情、响应疾速。帮忙咱们疾速落地大模型训练和推理能力,带来了业务指标和后续算法优化空间的显著晋升。特此感激!