加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

NVIDIA助力DeepRec为vivo推荐业务实现高性能GPU推理优化

2023/01/17
2218
阅读需 21 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

简介

  • 本案例中,vivo 人工智能推荐算法组自研的推荐服务平台,使用阿里巴巴开源大规模稀疏模型训练和预测引擎 DeepRec,在稀疏模型训练(稀疏功能、I/O优化)和高性能推理框架层面,实现其搜广推各类业务场景下,算法开发和上线的全链路优化。
  • 其中,在 GPU 线上推理服务优化上,vivo 使用 DeepRec 提供的 Device Placement Optimization,以及 NVIDIA CUDA multi-stream,MPS (Multi-Process Service) / Multi-context 和 NVIDIA GPU 计算专家团队在multi-stream 基础上开发的 MergeStream 功能,显著提升了线上推理服务的 GPU 有效利用率。

客户简介及应用背景

vivo人工智能推荐算法组的业务包含了信息流、视频、音乐、广告等搜索/广告/推荐各类业务,基本涵盖了搜广推各类型的业务。

为了支撑上述场景的算法开发上线,vivo自研了集特征数据、模型开发、模型推理等流程于一体的推荐服务平台。通过成熟、规范的推荐组件及服务,该平台为vivo内各推荐业务(广告、信息流等)提供一站式的推荐解决方案,便于业务快速构建推荐服务及算法策略高效迭代。

图片来源于vivo

vivo人工智能推荐算法组在深耕业务同时,在积极探索适用于搜索/广告/推荐大规模性稀疏性算法训练框架。分别探索了TensorNet/XDL/TFRA等框架及组件,这些框架组件在分布式、稀疏性功能上做了扩展,能够弥补TensorFlow在搜索/广告/推荐大规模性稀疏性场景不足,但是在通用性、易用性以及功能特点上,这些框架存在各种不足。

作为DeepRec最早的一批社区用户,vivo在DeepRec还是内部项目时,就与DeepRec开发者保持密切的合作。经过一年积累与打磨,vivo见证了DeepRec从内部项目到开源再到后续多个release版本的发布。在合作中,DeepRec赋能vivo各个业务增长,vivo也作为DeepRec深度用户,将业务中的需求以及使用中的问题积极回馈到DeepRec开源社区。

DeepRec (https://github.com/alibaba/DeepRec)是阿里巴巴集团提供的针对搜索、推荐、广告场景模型的训练/预测引擎,在分布式、图优化、算子、Runtime等方面对稀疏模型进行了深度性能优化,提供了丰富的高维稀疏特征功能的支持。基于DeepRec进行模型迭代不仅能带来更好的业务效果,同时在Training/Inference性能有明显的性能提升。

图片来源于阿里巴巴

通过业务实践,在稀疏模型训练层面,vivo使用DeepRec提供的基于Embedding Variable (官方文档链接)的动态Embedding功能和特征准入 (官方文档链接)/淘汰功能(官方文档链接),解决了使用TensorFlow原生Embedding Layer 的三个痛点,包括可拓展性差,hash冲突导致模型训练有损,无法处理冗余的稀疏特征;并在内部尝试对训练数据存储格式做I/O优化。

图片来源于阿里巴巴

使用动态Embedding和特征准入/淘汰功能实现的收益如下:

  1. 静态 Embedding 升级到动态 Embedding:使用 DeepRec 的动态 Embedding 替换 TensorFlow 的静态 Embedding 后,保证所有特征 Embedding 无冲突,离线 AUC 提升 0.5%,线上点击率提升 1.2%,同时模型体积缩小 20%。
  2. ID 特征的利用:在使用 TensorFlow 时,vivo 尝试过对 ID 特征进行 hash 处理输入模型,实验表明这种操作对比基线具有负收益。这是由于 ID 特征过于稀疏,同时 ID 具有唯一指示性,hash 处理会带来大量的 Embedding 冲突。基于动态 Embedding,使用 ID 特征离线 AUC 提升0.4%,线上点击率提升 0.6%。同时配合 global step 特征淘汰,离线 AUC 提升 0.1%,线上点击率提升 0.5%。

Embedding Variable 流程示意图,图片来源于阿里巴巴

在I/O优化上,目前vivo内部使用的是TFRecord数据格式存储训练数据,存在占用存储空间大,非明文存储的两个缺陷。而DeepRec的Parquet是一种列式存储的数据格式,能够节省存储资源,加快数据读取速度。使用Parquet Dataset 支持读取Parquet文件,开箱即用,无需额外安装第三库,使用简单方便。同时,Parquet Dataset 能够加快数据读取速度,提高模型训练的I/O性能。

vivo内部尝试使用Parquet Dataset 来替换现有TFRecord,提高训练速度30%,减少样本存储成本38%,降低带宽成本。同时,vivo内部支持hive查询Parquet文件,算法工程师能够高效快捷地分析样本数据。

在高性能推理框架层面,由于在业务逐渐发展过程中,广告召回量增长3.5倍,同时目标预估数增加两倍,推理计算复杂度增加,超时率超过5%,严重影响线上服务可用性以及业务指标。因此,vivo尝试探索升级改造现有推理服务,保证业务可持续发展。vivo借助DeepRec开源的诸多推理优化功能,在CPU推理改造以及GPU推理升级方面进行探索,并取得一定收益。

客户挑战

在CPU推理优化层面,vivo在使用DeepRec提供的基于ShareNothing架构的SessionGroup后,明显缓解了直接使用TensorFlow的C++接口调用Session::Run而导致的CPU使用率低的问题,在保证latency的前提下极大提高了QPS,单机QPS提升高达80%,单机CPU利用率提升75%。

但是经过SessionGroup的优化,虽然CPU推理性能得到改善,超时率依旧无法得到缓解。鉴于多目标模型目标塔数较多、模型中使用Attention、LayerNorm、GateNet等复杂结构、特征多,存在大量稀疏特征三点原因,vivo尝试探索GPU推理来优化线上性能。

应用方案

Device Placement Optimization:

通常,对于稀疏特征的处理一般是将其Embedding化,由于模型中存在大量的稀疏特征,因此vivo的广告模型使用大量的Embedding算子。从推理的timeline可以看出,Embedding算子分散在timeline的各个阶段,导致大量的GPU kernel launch 以及数据拷贝,因此图计算非常耗时。

图片来源于阿里巴巴

Device Placement Optimization 完全将Embedding Layer placed 到CPU上,解决了Embedding layer 内部存在的CPU和GPU之间大量数据拷贝的问题。

图片来源于阿里巴巴

Device Placement Optimization性能优化明显,CPU算子(主要是Embedding Layer)的计算集中在timeline的最开端,之后GPU主要负责网络层的计算。相较于CPU推理,Device Placement Optimization P99 降低35%。

NVIDIA CUDA Multi-Stream 功能:

在推理过程中,vivo发现单流执行导致GPU的利用率不高,无法充分挖掘GPU算力。DeepRec支持用户使用multi-stream功能,多stream并发计算,提升GPU利用率。多线程并发launch kernel 时,存在较大的锁开销,极大影响了kernel launch 的效率,这里的锁与CUDA Driver 中 的Context相关。因此可以通过使用MPS/Multi-context来避免launch过程中锁开销,从而进一步提升GPU的有效利用率。

图片来源于阿里巴巴

此外,模型中存在大量的H2D以及D2H的数据拷贝,在原生代码中,计算stream和拷贝stream是独立的,这会导致stream之间存在大量同步开销,同时对于在Recv算子之后的计算算子,必须等到MemCopy完成之后才能被launch执行,MemCopy和launch难以overlap执行。基于以上问题,NVIDIA GPU 计算专家团队在multi-stream功能基础上进一步优化,开发了MergeStream功能,允许MemCopy和计算使用相同的stream,从而减少上述的同步开销以及允许Recv之后计算算子launch开销被overlap。

图片来源于阿里巴巴

vivo在线上推理服务中使用了multi-stream功能,P99降低18%。更进一步地,在使用MergeStream功能后,P99降低11%。

编译优化 – BladeDISC:

BladeDISC(https://github.com/alibaba/BladeDISC)是阿里集团自主研发的、原生支持存在动态尺寸模型的深度学习编译器。DeepRec中 集成了 BladeDISC,通过使用BladeDISC内置的aStitch大尺度算子融合技术对于存在较多访存密集型算子的模型有显著的效果。利用BladeDISC对模型进行编译优化,推理性能得到大幅度提升。

BladeDISC将大量访存密集型算子编译成一个大的融合算子,可以大大减少框架调度和kernel launch的开销。区别于其他深度学习编译器的是,BladeDISC还会通过优化GPU不同层次存储(特别是SharedMemory)的使用来提升了访存操作和Op间数据交换的性能。图中可以看到,绿色是Blade DISC优化合并的算子替代了原图中大量的算子。

图片来源于阿里巴巴

图片来源于阿里巴巴

另外,由于线上模型比较复杂,为了进一步减少编译耗时、提升部署效率,vivo启用了BladeDISC的编译缓存功能。开启此功能时,BladeDISC仅会在新旧版本模型的Graph结构发生改变时触发编译,如果新旧模型仅有权重变更则复用之前的编译结果。经过验证,编译缓存在保证正确性的同时,几乎掩盖了编译模型的开销,模型更新速度与之前几乎相同。在使用BladeDISC功能后,线上服务P99降低21%。

使用效果及影响

DeepRec提供大量的解决方案可以帮助用户快速实施GPU推理。经过一系列优化,相较于CPU推理,GPU推理P99降低50%,GPU利用率平均在60%以上。此外,线上一张NVIDIA T4 Tensor Core GPU 的推理性能超过两台Xeon 6330 112Core 的CPU机器,节省了大量的机器资源。

基于CPU的分布式异步训练存在两个问题:一是异步训练会损失训练精度,模型难以收敛到最佳;二是随着模型结构逐渐复杂,训练性能会急剧下降。未来,vivo打算尝试基于GPU的同步训练来加速复杂模型训练。DeepRec支持两种GPU同步框架:NVIDIA Merlin Sparse Operation Kit (SOK) 和HybridBackend。后续vivo将尝试这两种GPU同步训练来加速模型训练。

NVIDIA计算专家团队也与DeepRec技术团队深入合作,为在稀疏功能层面的Embedding Variable GPU 支持、在同步训练层面的Merlin SOK 集成,以及图优化层面的Embedding子图Fusion功能开发提供技术支持。

Embedding Variable GPU 支持介绍 (官方文档链接):

DeepRec设计并提供了一套支持动态Embedding语义的Embedding Variable,在特征无损训练的同时以最经济的方式使用内存资源,使得超大规模特征的模型更容易增量上线。进一步地,因为GPU具有强大的并行计算能力,对于Embedding Variable 底层的Hash Table 查找、插入等操作也具有明显的加速作用。同时,对于模型计算部分若使用GPU,则使用GPU上的Embedding Variable 也可避免Host和Device上的数据拷贝,提高整体性能。因此增加了Embedding Variable 的GPU支持。

GPU版本的Embedding Variable 通过NVIDIA cuCollection 作为底层Hash Table 的实现,可以明显加速Embedding相关的操作,而且使用方便,在具有NVIDIA GPU 的环境中会自动启用,也可以手动放置在合适的GPU设备上。性能测试显示GPU版本相比于CPU版本,Embedding部分会有2倍 以上的加速。

分布式训练集成Merlin SOK 介绍 (官方文档链接):

DeepMerlin SOK 是NVIDIA Merlin 团队基于Merlin SOK 提供的针对神经网络中稀疏操作的加速插件库,使用DeepMerlin SOK 可对DeepRec中相关的Embedding操作进行加速和分布式训练的支持。

该SOK的设计理念就是希望同时兼容灵活性和高性能。在灵活性方面,使用SOK不会对用户使用 DeepRec本身的功能有影响,可以和DeepRec提供的Embedding Variable 完全兼容,也会集成到 DeepRec的高级接口方便用户的使用。在高性能方面,SOK主要从两方面去考虑,一方面,在算法设计上,通过reduce操作来减少搬运的数据量,另一方面,在实现上,主要通过算子融合技术,融合多表的查询和通信,提供稀疏操作的性能。性能测试显示SOK能够提供接近于线性的扩展能力,在8 GPU 下相比1 GPU 能够达到6.5倍的加速效果。

Embedding子图Fusion功能介绍 (官方文档链接):

DeepRec及TensorFlow原生的embedding lookup 相关API,如safe_embedding_lookup_sparse,会创建比较多细碎的算子,且部分算子只有CPU实现。因此在GPU上执行时容易出现kernel launch bound 的问题以及额外H2D & D2H 拷贝,造成低GPU利用率,降低执行速度。

针对此场景,NVIDIA计算专家团队与DeepRec合作,共同定制开发了支持在NVIDIA GPU 上执行的Embedding子图Fusion功能,并对GPU高算力高吞吐的特点进行了针对性优化:提供一组接口以及相关Fusion算子,通过算子融合,减少需要launch的kernel数量,优化访存,提供高性能的实现,达到加速执行的目的。

Embedding Fusion 功能易用,从Python层面提供接口及开关,用户无需修改代码即可快速使用。加速效果方面,单独从Embedding模块看,GPU Embedding Fusion 可以提供2倍左右的加速。从整体模型来看,加速效果取决于Embedding模块的耗时占比。在几个测试模型上,此功能可以提供1.2倍左右的整体性能加速。

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
STM32F103CBT6 1 STMicroelectronics Mainstream Performance line, Arm Cortex-M3 MCU with 128 Kbytes of Flash memory, 72 MHz CPU, motor control, USB and CAN

ECAD模型

下载ECAD模型
$11.49 查看
STM32F103VET6 1 STMicroelectronics Mainstream Performance line, Arm Cortex-M3 MCU with 512 Kbytes of Flash memory, 72 MHz CPU, motor control, USB and CAN

ECAD模型

下载ECAD模型
$16.64 查看
STM32F429ZIT6XXXTR 1 STMicroelectronics IC,MICROCONTROLLER,32-BIT,CORTEX-M4F CPU,CMOS,QFP,144PIN,PLASTIC
暂无数据 查看

相关推荐

电子产业图谱