京东广告算法架构体系建设--高性能计算方案最佳实践 | 京东零售广告技术团队

news2024/10/6 12:25:07

1、前言

推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide & Deep相对简单的网络结构进行建模,容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区,基于Transformer用户行为序列和Attention的建模逐渐成为主流,这个阶段模型的特点是参数的体量、网络结构复杂度呈指数级增长,算法建模的创新工作往往由于吞吐和耗时的性能算力问题,导致无法落地于在线推理获得效果收益。传统通过扩容资源的方式,其边际效应也在减弱,算力优化存在诸多挑战:

1、高算力需求下的资源成本边际效应问题:集群资源扩容是提升算力的一种传统方案,但算力需求的增加往往需要成倍数的资源增长才能抹平,带来了极强的边际递减效应。

2、复杂算法模型的在线推理算力扩展问题:推理引擎要求低延迟和高吞吐,而随着模型算法复杂度提升,突破计算资源算力上限(存储、计算),推理耗时显著增加,无法满足实时推荐系统的性能要求。

针对上述挑战和问题,广告算法架构在迭代演变的过程中,构建了一系列的优化体系,主要集中在两个方面:

1、架构层面:设计分布式分图异构计算框架,通过模型分图,分布式推理实现算力的向外扩展;CPU&GPU异构硬件差异化部署,算法结构与计算硬件资源相得益彰,最大化硬件适配性,实现算力的指数级增长。算力扩展的架构使得后续垂向优化成为可能,可以针对特定业务需求进行深度定制和调整。

2、高算力推理引擎层面:从底层架构出发,GPU算子调度和计算逻辑精细化优化,深入挖掘GPU专用计算设备的潜力,实现对推理性能的显著提升。

2、分布式分图异构计算框架

分布式分图异构计算框架是我们针对算力扩展问题提出的解决方案,通过模型结构化拆分,分布式分图计算,CPU&GPU异构硬件差异化部署,使算法结构与计算硬件资源高度适配,充分发挥各自优势。基于CPU计算集群构建大规模稀疏模型建模,利用内存资源易扩展等优势,支撑千亿规模参数的高性能推理。基于GPU计算集群构建稠密模型建模,利用高算力优势,支撑超长用户行为序列建模,为算法建模的创新提供了坚实的架构基础。我们基于该框架进一步研发并落地了京东零售首个Online Learning建模场景,使得模型可以感知人、货、场的实时变化。同时GPU服务集群作为独立于整体服务体系的组成部分,便于针对GPU推理引擎进行专项优化,从而便捷地进行性能提升措施的实施。

图1 分布式分图异构计算框架

3、高算力推理引擎

为了打造高算力推理引擎,开始深入调研基于GPU推理引擎优化推理性能的可行性,GPU作为一种高度并行的多核处理器,具备极强的并行计算能力,由于GPU高度并行化的结构,先天适合以稠密矩阵计算为主的NLP、CV领域。但直接应用于推荐领域会存在TP99耗时上涨,资源利用率不高等问题。这主要与推荐领域模型的自身特点相关:

1、建模过程复杂:为建模用户与商品关系,推荐领域模型建模不仅包含DNN等稠密计算部分,还存在大量针对稀疏特征的Embedding建模方式以及特征预处理等模块,集合了IO密集与计算密集两大特性,造成计算过程与GPU亲和性不高,难以充分发挥GPU的硬件优势。

2、模型规模大:推荐领域模型以稀疏参数为主,百G规模参数无法完全加载至GPU显存,稀疏参数交换导致带宽需求高,造成GPU无法充分利用。

3、模型结构复杂:用户行为序列建模成为模型建模的主流方法,而用户特征的多样性(浏览行为、购买行为、加购行为)需要单独建模以提升模型对用户的感知能力,因此造成模型分支结构多,结构复杂。TensorFlow推理框架虽然提供了算子级别的建模方案,通过堆叠细粒度算子完成各种复杂的模型建模,灵活的支撑了多种行为序列建模方式。但也因此造成了算子粒度过细,单算子计算量小,不易于GPU充分调度的问题,尤其是对于在线推理本身计算量就相对较小的场景问题更为致命。

得益于分布式分图异构计算框架,有效解决了上述1,2问题,并且可以让我们针对GPU算子调度和计算逻辑精细化优化,深入挖掘GPU专用计算设备的潜力,实现对推理性能的显著提升。具体工作体现在以下三个方面:a)TensorBatch:通过聚合计算请求提升GPU计算吞吐;b)深度学习编译器:通过自动化的算子融合、图优化等方式优化模型推理性能;c)多流计算:通过打造GPU多计算通道,构建真正的并行计算推理引擎。

3.1、TensorBatch

广告精排模型推理主要表现是单个请求耗时较短(毫秒级),同时每个请求中gpu kernel调用次数较多,每次gpu kernel的调度都会伴随相应的kernel launch,琐碎繁多的kernel launch会严重制约GPU模型的吞吐能力,同时会导致模型系统耗时较高,通过Nsight性能分析性能数据如下。

图2 大批量KernelLaunch操作

kernel launch 本质上是从host端核函数调用到GPU开始计算之间的这段时间,主要包括准备计算需要数据的传输和执行需要warp线程束的获取,无论是数据的传输还是选取执行所需要的warp线程束,多个请求之间是可以实现共享的,因此我们核心解决问题的思路是将多个模型推理请求合并成一个请求,完成模型推理后在对结果再进行合理的分割,减少请求级别 kernel launch 的数量,极大的提升kernel launch的效率,从而进一步提升GPU模型的吞吐能力,架构方案如 图3, 例如 1个模型请求经过tensorflow推理需要进行 1000 次 kernel launch,3个请求需要3000次kernel launch,如果将3个请求合并成1个请求,那么kernel launch数量会从3000 降至1000。

图3 Tensor Batch架构图

请求级别算子融合在广告精排模型进行全量上线,在GPU利用率不变的情况下,GPU模型吞吐能力提升2倍。请求级别融合本质是优化GPU kernel launch 效率,但是优化GPU kernel launch 效率方案不止一种,下面详细介绍一下基于"深度学习编译器"的算子融合。

3.2、深度学习编译器

KernelLaunch效率问题优化方面,我们首先采用了TensorBatch方案,在广告算法场景,调试聚合数量在5-8左右较为合适(聚合后广告数200-1000)。虽然对请求进行了聚合,但算子执行的TimeLine仍较稀疏,如图5所示,该现象解释了GPU无法得到充分利用的原因。针对这一现象,我们进一步研发了基于深度学习编译器的算子融合方案,通过算子融合n次 KernelLaunch至1次,大大降低整体KernelLaunch耗时,同时通过图优化等策略进一步提升模型的推理性能。

图4 GPU Kernel计算稀疏

3.2.1 深度学习编译器分桶预编译技术

XLA(Accelerated Linear Algebra)是google开源的深度学习编译器,将高级别的模型描述转换成高效的可执行代码,自动化的解决算子融合、内存管理、数据布局转换等问题。该框架已融合进Tensorflow开源框架中,并提供较友好的编程接口。但原生深度学习编译器在推荐领域模型应用方面存在一系列问题:

a)同一个XLA Graph针对不同的Tensor输入属性(数量、维度、类型)会触发不同的编译流程,形成多个XLA Runtime(编译结果),导致开源方案只适用于CV领域,定长输入(图像维度不变)的场景。推荐领域模型变长特征(用户行为序列)的存在使得在推理过程构建万级别数量的XLA Runtime(编译结果),在显存消耗上不可接受。

b)Tensorflow-XLA为运行时编译(JIT),编译过程缓慢,通常完成一个XLA Runtime的编译耗时长达1秒,且对CPU、GPU资源占用较大,在广告高实时场景下,耗时不可接受。

针对上述问题,我们研发了深度学习编译器分桶预编译技术。为避免不同特征维度导致的多次编译问题,首先对算法结构进行XLA子图划分,形成多个XLA子图。其次针对XLA子图的输入特征变长情况,实现分桶Padding能力,降低XLA Runtime编译数量,解决了编译中遇到的显存问题。最后通过模型XLA子图分桶标记算法,在模型加载阶段进行预编译,解决运行时编译耗时问题。

在深度学习编译器技术加持下,我们将广告推荐精排模型的算子调度次数从553次优化至190次,XLA子图模块的算子执行的TimeLine得到极大改善,单次推理耗时从14ms优化至9ms。

图5 XLA Runtime

3.2.2 深度学习编译器异步编译技术

通过深度学习编译器分桶预编译技术,我们解决了99.9%的问题,但仍有异常流量导致特征维度超出预设的分桶范围,导致触发运行时编译的可能。作为一个高稳定的在线系统,我们进一步实现了异步编译技术,解决异常流量带来的耗时问题:

a)模型构图方面,同时保留XLA子图与模型原图。

b)推理过程动态选择,命中分桶情况则选择XLA Runtime执行,未命中则选择原图执行,同时服务后台触发异步XLA编译,供下次请求使用。

图6 深度学习编译器异步编译

3.3、多流计算

图7 GPU多流计算背景

Tensorflow深度学习框架虽然提供了GPU计算能力,但其CPU到GPU的交互通道仅为单通道模式。在线并发推理的场景下,存在算子调度互斥、算子计算阻塞排队等问题。针对上述痛点我们设计了GPU多通道模式-多流计算架构,真正实现了GPU的并发计算能力。

我们对Tensorflow框架中的底层GPU通道的创建和分配机制进行了深入的改造与升级,赋予了其在面对同一模型时,针对不同的在线请求,动态选择GPU通道进行运算的能力。每个GPU通道独立持有一份CUDA Stream和CUDA Context,既消除了算子并发调度导致的GPU资源争抢问题,也使得不同请求拥有独立的计算通道,提升GPU并行粒度。

图8 多GPU通道

多GPU通道(多CudaStream + 多CudaContext)解决了KernelLaunch调度问题,算子调度可以并行执行,减少了执行的GAP。但在GPU硬件层面,CudaContext采用分时复用原则,即此某一时刻只有一个CudaContext被调度执行,没有完全达到算子计算间的并行。

图9 GPU Kernel交错计算

MPS + 多流计算框架实现真正意义的并行计算

MPS局限性:MPS(Multi-Process Service)是英伟达为充分利用GPU资源的一种解决方案。MPS多进程服务,每个进程有自己的上下文管理机制,MPS使用合并共享的并行模式,即将多个任务合并成一个上下文,因此可以同时跑多个任务,是真正意义上的并行。但MPS方案需要多进程服务的场景下才能生效,这种情况下单卡显存无法承载多进程任务,显存成为瓶颈,MPS机制失效,无法充分利用GPU算力。

图10 Multi-Process Service局限性

因此,我们升级了多流计算架构,将MPS与自研的多CudaStream + 多CudaContext的多流计算架构相结合,解决了显存瓶颈的问题,最终通过单进程模型部署实现真正的并行计算。

图11 GPU Kernel并行计算

综上,我们实现了完整的GPU多流计算框架:创建多组通信渠道打通软件和硬件通道,融合调度Context实现真正的计算并行化。

图12 GPU多流计算架构图

4、总结

综上,通过设计高性能的计算方案,打造新一代算法架构推理体系,在架构层面通过分布式分图异构方案很好的解决了高算力需求下的资源成本边际效应问题,在高算力推理引擎层面,通过一系列的专项优化,让GPU的算力得到充分的释放,实现复杂算法模型算力的扩展。目前新一代的高性能计算方案已经在广告多个业务线进行了落地实践,推荐首页CTR模型、推荐通用信息CTR模型、推荐商详CTR的规模扩展至千亿,助力推荐、搜索等核心业务取得显著的效果收益。

高性能算法推理系统是算法架构体系的重要组成部分,为算法建模的创新提供了算力基础,算力优化是一个极富挑战性的领域,它需要我们在技术层面上不断进行探索、学习和创新。目前,我们正在着手规划下一代推理算法架构体系,其最显著的特点将是算法、计算能力和架构的深度融合,以及在线和离线一体化的设计方案。

作者:京东零售-平台运营与营销中心-广告研发部-系统技术部-算法应用组

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot137欢迪迈手机商城设计与开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

HBase介绍

一、HBase简介 1.1、HBase是什么 Google在200-2006发表了GFS、MapReduce、BigTable三篇 论文 ,号称“三驾马车”,开启了大数据的时代。 GFS是Google File System,开源实现是HDFS(Hadoop File System)。 MapReduce…

全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

前言 最近开始做这个裂缝识别的任务了,大大小小的问题我已经摸得差不多了,然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务,也就是我们说的裂缝识别的任务。作为前言,先来说说场景: 现在相…

初识webpack(一)概念、入口配置、输出配置、loader等

目录 (一)概念 webpack的依赖图 (二)webpack的基本使用 (三)webpack的配置文件 1.入口(entry)配置 2.输出(output)配置 (三)loader 1.css文件处理 (1)安装css-loader和style-loader (2)在webpack.config.js中配置loader 2.less文件处理 3.postcss的使用 (1)安装…

相片修复框架-GFPGAN

一 GFPGAN 介绍 GFPGAN 是一个由腾讯 ARC 团队开发的用于人脸图像生成和优化的 GAN 模型。在github可以找到开源的代码,它由两个主要模块组成: 退化移除模块 (U-Net):用于从低分辨率、低质量的人脸图像中恢复出高质量的人脸图像。 生成式脸部…

软件工程知识梳理6-运行和维护

软件维护需要的工作量很大,大型软件的维护成本高达开发成本的4倍左右。所以,软件工程的主要目的就是要提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本。 定义:软件已经交付使用之后,…

【爬虫专区】批量下载PDF (无反爬)

天命:只要没反爬,一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构,很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可,其实没啥难度的 imp…

腾讯云幻兽帕鲁Palworld服务器价格表,2024年2月最新

腾讯云幻兽帕鲁服务器价格32元起,4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年,支持4-8个玩家;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月,支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…

PVE 7.4-17 中开启vGPU显卡虚拟化

要为VM提供图形引擎,一般分为3种: 1、软件模拟图形-性能差 2、显卡直通-性能最好,一个虚拟机独享一个显卡 3、vGPU-性能好,多个虚拟机共享一个显卡 目前市面上的主流GPU厂家有intel、amd、nvidia,本篇文章主要介绍nvi…

Intercom与HelpLook:搭建知识库哪个更符合你的需求?

在当今信息化日益发展的时代,知识库作为一种集中存储和管理企业信息的重要工具,已经被越来越多的公司所采用。它有助于企业提升效率,改进服务质量,更好地与客户进行沟通。Intercom和HelpLook近两年在这个领域的讨论度不断变高&…

网络层 IP协议(1)

前置知识 主机:配有IP地址,但是不进行路由控制的设备 路由器:既配置了IP地址,又能进行路由控制的设备 节点:主机和路由器的总称 IP协议主要完成的任务就是 地址管理和路由选择 地址管理:使用一套地址体系,将网络设备的地址描述出来 路由选择:一个数据报如何从源地址到目的地址 …

摄影分享|基于Springboot的摄影分享网站设计与实现(源码+数据库+文档)

摄影分享网站目录 目录 基于Springboot的摄影分享网站设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、图片素材管理 3、视频素材管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐…

excel 选中指定区域

问题 excel 选中指定区域 详细问题 笔者有一个excel数据集,数据量较大,如何快速选中指定区域 解决方案 步骤1、 点击起始单元格 确定单元格坐标(建议直接CtrlC复制至剪贴板) 具体操作入下图所示 步骤2、 点击结束单元格 …

数与抽象之自然数

自然数 “自然数的抽象与内在属性:图7中的纯粹五性” “自然”是数学家对我们所熟悉的1,2,3,4这样的数字所赋予的称呼。自然数是最基本的数学对象,但它们似乎并没有引导我们去抽象地思考。毕竟,单单一个数…

【Linux网络编程一】网络基础(网络框架)

【Linux网络编程一】网络基础(网络框架) 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点:网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装&…

【教学类-34-01】20240130纸尺1.0 (A4横版5条,刻度25*5=125CM)

作品展示: 背景需求: 大3班一位孩子用“骰子统计纸”制作了一个身高刻度表 【教学类-40-01】A4骰子纸模制作1.0(飞机形 5.5CM纸盒骰子1个记录纸1条)(点数是不同的符号图案)-CSDN博客文章浏览阅读160次。【…

查看阿里云maven仓中某个库有哪些版本

起因 最近项目上有做视频业务,方案是使用阿里云的短视频服务,其中也有使用到阿里云的上传SDK,过程中有遇一个上传SDK的内部崩溃,崩溃栈如下: Back traces starts. java.lang.NullPointerException: Attempt to invok…

【Qt】—— Qt Creator界⾯认识

目录 (一)左边栏 (二)代码编辑区 (三)UI设计界⾯ (四)构建区 (一)左边栏 在编辑模式下,左边竖排的两个窗⼝叫做"边栏"。 ①是项⽬…

指针的深入理解(三)

这一节主要使用复习回调函数, 利用冒泡模拟实现qsort函数。 qsort 排序使用冒泡排序,主要难点在于运用元素个数和字节数以及基地址控制元素的比较: if里面使用了一个判断函数,qsort可以排序任意的数据,原因就是因为可…

立体边界,让arcgis出图更酷炫一些

就是这样子的那个图—— 本期我们还是用长沙市为例, 来手把手的演示制作立体边界, 就是这个样子的边界—— 第一步—准备底图 其实你准备什么底图都可以哈,例如调用天地图、下载个影像图,或者用其他什么的底图,都是…