简介: 用阿里云GPU计算实例来满足UC极致性价比需求

文丨阿里云神龙计算平台AI加速团队 & UC搜索架构部推理引擎团队

导语:作为国产行列里占有率排名第一的移动浏览器,UC浏览器自身承载着数以亿计的用户量,当前UC浏览器每天的服务请求对服务器的算力及带宽要求极高,因此也带来了巨额的运营成本。因为业务是动态变化的,UC对计算资源也有动态扩缩容的需求。阿里云GPU云服务器是提供GPU算力的弹性计算服务,具有超强的计算能力,服务于深度学习、科学计算、图形可视化、视频处理多种应用场景,能为客户提供软件与硬件结合的完整服务体系,助力客户在实际业务中实现资源的灵活分配、弹性扩展、算力的提升以及成本的控制。而基于阿里云GPU云服务器的神龙AI加速引擎(AIACC)是为了极致性能而生,旨在打造世界级无与伦比的AI性能体验,同时为了客户降本增效,实现共赢。据悉,刚公布的最新世界MLPerfTM推理榜单中,基于阿里云GPU云服务器的AIACC首次突破封闭式场景世界第一。

本篇文章将带大家了解阿里云AIACC如何基于阿里云GPU云服务器助力UC浏览器的搜索业务平衡计算性能与运营成本之间的矛盾,使其大幅实现降本增效,成功在阿里云的GPU云服务器落地。

背  景

1. 业务背景

UC搜索承载着UC主要业务入口,场景包括:大搜、各种垂搜业务、夸克app等。搜索流程一般经过几个阶段:召回 –> 粗排 -> 精排(L2->L4) -> 混排等。架构如下:

在业务中,L3/L4排序部分都使用了QTC核心模型。随着业务流量的增长,目前精排打分阶段面临巨大挑战,延迟和吞吐都要兼得。

2. QTC模型

下图是用TF-summary对QTC模型做可视化,

QTC模型属于排序核心模型,模型结构分为3个BERT+ 多层Conv + 多层MLP等,其中Bert输入seq length最大长度是512。模型总共有大约4500个算子,计算量巨大。

3. 原始性能

最初采用了NV提供的Faster-Transformer这一套软件来优化QTC模型的推理,但由于Faster-Transformer只能加速BERT网络,导致推理时需要做多个子图割裂运行,加上其余网络部分也未做优化,从而整体性能并不好。针对A100机型,做了基于这套方案的性能评估,延迟控制在30ms下,QTC模型只能跑到350QPS。

4. 挑战与目标

随着模型效果带来的业务收益,促使业务流量不断增加,在算法预算前提下,扩量面临比较大的挑战。一方面资源不够,一方面资源也没有完全利用起来导致的吞吐不够,同时观察分析在GPU使用率达到90%以上时延迟会出现飙升的情况,这种情况对于稳定性带来了不小的影响。如何在原来预算的基础上提高吞吐、降低延迟、提升性价比最终规模化上线为业务赋能成为最大的挑战。

结合搜索业务的特点,针对QTC模型在GPU上推理提出了几个方面的需求:

1.  为了保证算法的效果,推理时模型输出的误差控制在千分位;

2.  为了保证终端用户在搜索时的体验,精排部分的推理耗时在30ms以内;

3.  在有限的预算下满足业务的需求,即QPS需要远高于原有解决方案;

综合业务方各个方面的需求,UC制定如下的目标:

在A100机型上,保证精度的前提下,QTC模型耗时在30ms以内,QPS达到1120以上。

优  化

1. 优化路线

TensorRT是Nvidia开发的针对模型推理的高性能软件库,但QTC模型复杂度高,无法整体直接用TensorRT load。此外,直接用TensorRT load时部分层会被拆成细粒度的op,性能较差。对QTC模型做深度的分析之后,结论是用TensorRT以及其plugin支持的op可以覆盖QTC模型的op,但是现有的parser无法按照需要的粒度去解析QTC模型并映射到TensorRT上。

针对上述问题,AIACC从模型定义层,直接解析QTC模型并映射到TensorRT上,避免转PB后大的operator被拆分成细粒度的operator,以达到最佳性能。此外,这么做也便于以不同的粒度进行模型精度的分析,以不同的粒度实现op的融合与替换,方面集成AIACC的高性能Kernel进来。

2. Enable TensorRT & 精度对齐

2.1 映射正确性验证

解析QTC模型并映射到TensorRT上的过程中,首先要解决的问题是映射的正确性验证。对正确性验证,首先要解决基准是什么这个问题。我们拿到的信息为一份模型结构的代码与一个训练中的checkpoint。基于业务方给的有限的信息,完成了从训练框架侧load checkpoint的逻辑,并根据需求,留下了可以获取任意中间结果的接口。在验证映射正确性的过程中,我们以训练框架侧运行推理的结果为对比的baseline,和我们构建的TensorRT侧的Engine的运行结果做对比,来判断是否正确的把QTC模型映射到TensorRT上。

下面以一个self-attention层为例,展开怎么做QTC模型到TensorRT的映射并保证运算结果的一致。

在TensorRT侧,为了校验映射的正确性,需要有推理的脚本来验证build好的engine的正确性。同在训练框架侧构建正确性的baseline类似,我们基于TensorRT开发了一套load build好的engine并做推理的脚本,来获取engine的推理结果,用于和训练框架侧的baseline做对比。

TensorRT为了追求更高的性能,对self-attention层的运算做了等价变化,把部分转换提前到模型build阶段,进而减少模型推理需要的operation。其他的一些细节,包括mask处理、数据类型、hidden size等,按照类似逻辑,一一对齐后,我们即可在TensorRT侧构建出运行结果与训练框架侧运行结果一致的engine。

对比TensorRT直接load checkpoint的模式,在我们的映射中,把self-attention映射为1个op,避免了拆成多个细碎op而导致的性能问题。这种模式下self-attention的信息在一个节点上,也方便我们后续做kernel的优化,例如融合self-attention内部的GEMM等多个操作,以达到更好的新能。

2.2 数值问题解决

数值问题是AI任务中很难定位解决的一类问题,因为没有编译器或者其他的报错提示来帮助我们定位问题。在把QTC模型映射到TensorRT的时候,遇到了数值问题,现象为多个相同的基础模块叠加导致中间的feature map中有NAN的异常值,进而导致最终的结果误差远远超出业务团队要求的千分位。

第一时间把这个问题定为数值问题,是因为在QTC模型到TensorRT映射过程中,每一个子模块我们都做了单元测试来验证映射的正确性,不存在映射错误导致的异常。此外,为了推理的性能,我们开启了FP16,部分中间的运算是用FP16进行,FP16的表达能力相比FP32差很多,这是引入数值问题的一个风险点。多个相同的基础模块叠加导致最终的输出中有NAN的异常值,大概率是因为计算中出现了极大or极小的数值,导致某些操作,例如做exp/除法的时候,出现的异常的行为。

分析清楚问题后,解决问题的方法也很简单,完善TensorRT中这部分exp计算逻辑,避免exp计算中出现大的负值即可。

2.3 其他的N个问题的概述

在把QTC模型映射到TensorRT并对齐精度的过程中,我们还遇到了其他一系列大大小小的其他问题,这里不一一展开,只在简单列举一下,包括用shuffle替换reduce来提高实现reshape的运算的效率,用identity层来实现data type cast的逻辑,conv层的参数转换,pooling的padding处理,reshape后接FC层参数排布等问题。

3. 关键Kernel优化

seq_length=35/512时,TensorRT未对Multi-Head Attention做针对性优化。seq_length为512的Bert耗时占比较大,如果对这部分做针对性优化,会获取较大幅度的性能提升。对这部分的优化我们分两步进行,第一步优化了seq_length=512的Multi-Head Attention中的softmax的实现,第二步则是针对seq_length为35/512的case做了类似TensorRT针对seq_length=64的情形下做的融合。

下图是seq_length为512的情况下,未优化前的一个Transformer层调用的Kernel,其中绿框中的kernel为第一步优化的Kernel,红框中的部分则是第二步优化中融合为一个。

4. Enable CUDA-Graph

CUDA Graph是一个把所有kernel算子结合(capture)成Graph,然后整体launch这个Graph,减少频繁的kernel launch来带的开销以及kernel中间的gap。下图是普通的kernel执行和Graph执行的区别。可以看出,在kernel执行时因为需要CPU和GPU切换,造成小算子间会有比较大的GPU idle时间(gap引起),同时如果小算子执行的时间比较短,那么launch的时间占比就成了大头,造成GPU利用率低下。

在CUDA11版本和Ampere架构下,CUDA Graph本身做了很大的改进,在CUDA内部做了并行化处理。

从机制图可以看到,CUDA内部在执行Graph时,查找依赖关系,如果发现无直接依赖且目前资源满足算子执行(比如:stream processor/share memory/register等)则并行执行,提高GPU利用率。同时我们也对CUDA Graph下做了一些优化(比如增加memory cache机制、graph min update、multi-stream处理等)更好地提升了性能。

Enable CUDA Graph有两种方式,其中流捕获提供了一种从现有的基于流的 API 创建图的机制。在QTC模型中,通过流捕获的方式来加速基于TensorRT构建的图。Enable CUDA Graph后,在A100上延迟有3%下降,吞吐提高了4%,在GPU使用率高时latency也更稳定。

业 务 结 果

下图中,Faster-Transformer是指UC原有的基于Faster-Transformer的在GPU上的解决方案;AIACC-Optimization是我们优化后的性能数据:

在UC的生产环境中,A100机型上QPS达到了1330,为最初Faster-Transformer版本的3.8倍,超出了预设的目标。

目前,采用AIACC这一系列优化的QTC模型已经在部分搜索业务上线使用,后续即将大规模线上使用。按最低的预期使用量来计算,每年能节省达数千万的成本。

在这次合作中,UC搜索精排应用在阿里云GPU云服务器上运行的性价比得到了显著提升,可以把业务批量部署在生态成熟的阿里云GPU云服务器上。云平台弹性扩缩容的优点让UC可以根据业务需求,按需从阿里云上获取GPU云服务器资源。此外,推理用的机型和训练用的机型统一,让生产链路上从算法到优化再到部署的工程师合作更方便,也方便后续在线上实现训练与推理任务的混合部署,最大化GPU资源的利用。

阿里云AIACC针对阿里云GPU云服务器硬件做了深入的优化,达成了在不额外引入新硬件平台的情况下,用阿里云GPU计算实例来满足UC极致性价比需求的目标。此外,用UC真实应用打磨的优化性能工作都沉淀到AIACC中,后续可以规模化服务更多的阿里云GPU云服务器的客户。

点击这里,了解阿里云GPU云服务器。

原文链接:https://click.aliyun.com/m/1000358191/

本文为阿里云原创内容,未经允许不得转载。

基于阿里云GPU云服务器的AIACC助力UC搜索业务性能提效380%,每年节省数千万成本的更多相关文章

  1. 阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效

    今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源.免版权费的视频编码格式,可以解决H.265昂 ...

  2. 从Kubernetes到“云原生全家桶”,网易如何让业务部署提效280%?

    近日,网易云轻舟微服务团队接受了CNCF的采访,分享了网易云在云原生领域尤其是Kubernetes方面的实践经验.以下为案例全文:公司:网易地点:中国杭州行业:互联网技术 挑战它的游戏业务是世界上最大 ...

  3. 阿里云异构计算发布:轻量级GPU云服务器实例VGN5i

    阿里云发布了国内首个公共云上的轻量级GPU异构计算产品——VGN5i实例,该实例打破了传统直通模式的局限,可以提供比单颗物理GPU更细粒度的服务,从而让客户以更低成本.更高弹性开展业务.适用于云游戏. ...

  4. 一·创建Linux服务器(基于阿里云)

    本系统是基于阿里云服务器,购买请前往https://www.aliyun.com/?spm=5176.8142029.388261.1.taXish ,由于经济能力的限制,本人购买的是最低配置如下 其 ...

  5. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  6. 基于阿里云ECS的phpwind网站备案前如何远程访问调试?

    基于阿里云ECS的phpwind网站部署非常方便,但云主机的外网IP绑定域名却比较复杂.先要申请域名,成功后还需要备案.尤其是企业网站备案,需要提交的资料较多,准备资料以及审批的时间较长.这段时间在外 ...

  7. 2017阿里云双11-云服务器ECS优惠活动最强解读和购买指南

    本站之前介绍了<爆款云服务器,限时2折起>,这其实是阿里云双11之前的预热活动:四款低配的机型,二折给用户(每个用户限购一台),非常的实惠,有很多阅读了本站文章的用户都一次性购买了三年的. ...

  8. 云计算之路-阿里云上:服务器CPU 100%问题是memcached的连接数限制引起的

    非常抱歉,昨天的服务器CPU 100%问题是达到 memcached 的连接数限制引起的,不是阿里云服务器的问题. 之前我们用的是阿里云“云数据库 memcached 版”,上个周末我们换成了自己搭建 ...

  9. (二)基于阿里云的MQTT远程控制(购买阿里云,在云端安装MQTT,测试MQTT远程通信)

    QQ名称为Friday~的网友把他自己买MQTT的过程截图发给了我,今天就说一下如何购买阿里云,安装MQTT可以参考 http://www.cnblogs.com/yangfengwu/p/77646 ...

  10. 购买阿里云的云服务器时选择镜像centos时应该选择哪个版本

    购买阿里云的云服务器时选择镜像centos时应该选择哪个版本 方法/步骤首先,我们要清楚的便是每个系统之间的差别,以及在阿里云上的差别:1. Windows1.1) 系统内含正版激活.1.2) 适合于 ...

随机推荐

  1. 生成文件名为系统时间的C源码实例

    一 最近遇到了一个需要根据时间记录文件名的.先写一个实例来实战: #include<stdlib.h> #include<time.h> #include<stdio.h ...

  2. ESP8266 SPI 开发之软硬基础分析

    一 什么是SPI接口? SPI是一种高速.高效率的串行接口技术.通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换.SPI是一个环形结构,通信时需要至少4根线 ...

  3. springMVC+JDBC:分页示例

    文章来源:http://liuzidong.iteye.com/blog/1067492 一 环境:XP3+Oracle10g+MyEclipse6+(Tomcat)+JDK1.5 二 工程相关图片: ...

  4. Ubuntu 的源相关介绍(最近在配gstreamer的时候,紧急补充的知识)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  5. uniapp中引入Leaflet

    1. 引言 uniapp中自带有map组件,并且自带的map组件有常见的显示地图.绘制点线面的功能 但是,它存在以下问题: 收费,自带的map组件使用的是高德.腾讯的地图,无论使用什么样的功能,即使只 ...

  6. spring redis 工具类

    import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; ...

  7. KingbaseES V8R3 运维案例 -- sys_dump备份故障“SYS_MAC_POLICY_ENFORCEMENT”

    ​ 案例说明: 在KingbaseES V8R3执行sys_dump时出现"ERROR: permission denied for relation SYS_MAC_POLICY_ENFO ...

  8. KingbaseES V8R6 集群运维案例 -- 禁止普通用户su到root

    案例说明: 在集群管理中,会使用到root权限(如ip.aring命令等),为安全需要,有的生产环境禁止普通用户su切换到root,本案例测试了禁止普通用户su切换到root对集群管理带来的影响. 集 ...

  9. 花式栈溢出 CTFshowpwn88

    花式栈溢出 在这之前确实对这方面了解很少,一般这种花式栈溢出不仅仅要求你能发现漏洞,最主要的是你要有随机应变的能力 这个题是一个64位的题目看一下保护 canary 和 nx保护都开了,我们用ida打 ...

  10. OpenHarmony 3.2 Beta源码分析之MediaLibrary

    1.MediaLibrary介绍 OpenAtom OpenHarmony(以下简称"OpenHarmony")MediaLibrary媒体库提供了一系列易用的接口用于获取媒体文件 ...