腾讯李正兴:蒸馏、量化、动态batch——深度模型推理加速实践_李正兴是谁

2023-03-26 22:21:33

 

1.李振合 腾讯副总裁

分享嘉宾:李正兴 腾讯 高级工程师编辑整理:闫玉芳 新浪微博出品平台:DataFunTalk导读:本次分享的主题是深度模型推理加速的实践,主要介绍两个项目案例,针对项目案例介绍每个项目的技术架构、遇到的挑战、优化方案以及最终效果与总结。

2.腾讯副总裁李朝晖

--01项目案例及技术挑战1. 案例一第一个案例是一个文本QA的项目它的产品的形态就如下图左半部分所示,用户在文本框里面输入一个文本,然后我们的问答引擎会根据这个文本,判断出意图,再根据意图返回对应的答案。

3.腾讯张正友

文本QA引擎处理流程:文本输入;预处理:文本纠错,去除标点等;分词+实体识别:提取文本的关键信息;召回服务:取出与这个文本最接近的一个list;精排服务:对 list 进行排序,取出 top one,返回给用户。

4.腾讯总监李笑

整个流程中主要的技术挑战在精排服务环节:模型较大,例如国内的游戏使用的 BERT 模型;海外的游戏使用的 XLMR 模型在业务上,需要支持上百款游戏,并不是每个游戏都对应一个模型,但有十几款用户量比较大的头部游戏,每个游戏都对应一个模型。

5.腾讯副总裁李英斌

因此,精排服务一方面 QPS 比较高;另一方面还需要加载十多个大模型,对内存以及 GPU 的显存都造成了很大的压力2. 案例二第二个案例是语音QA业务场景是和平精英游戏中打开话筒就可以和一个智能 NPC 进行交流,问答引擎针对用户的语音给出结果,这个结果如果是指令控制的话,就会结合游戏内的元素做一些行为。

6.腾讯李朝晖简历

语音QA流程:语音采集预处理向量化:使用facebook开源的wave2vec模型,得到语音的向量表示召回服务拒识服务这一业务的技术挑战在向量化环节:模型大模型需要承受的 QPS 高,其原因在于模型需要接受游戏内所有玩家的一个实时语音的流量

7.腾讯 李朝晖

--02优化方案针对遇到的挑战首先介绍业界使用的方法,然后再介绍下我们所采用的优化方案。1. 业界方法

Tfserving和Libtorch硬件兼容性较好,不仅支持GPU,也支持CPU;支持的模型种类较多;易用度简单;但是并没有做推理性能的优化,推理性能一般TensorRT只能在GPU上使用;大部分支持的模型都是CNN的模型,也支持小部分NLP领域的模型,对于魔改的模型,算子层不支持;对于支持的模型,推理性能较好;对于自定义插件的情况,成本比较高。

业界方法存在的问题:性能问题不支持魔改后的模型,支持的模型种类不丰富单模型占用显存大2. 模型拆解案例1拆解方法如下:

对于案例1中使用的MQA模型,模型的网络结构如上图所示首先经过三个embedding,得到word embedding, segment embedding, position embedding;然后将这三个加起来,经过 layernorm 层,再经过12层的transformer;再经过一个池化层 pooler,池化层由线性层和激活函数构成;再经过分类层classifier;最后通过 softmax 得到最后的分值。

案例1中使用Bert 模型,算子不算特别丰富,拆解起来较为容易。案例2拆解方法如下:

案例2中用到的是 facebook 的wave2vec模型,其复杂程度远超过Bert模型,论文里面只说到了过7层CNN之后,再过 transformer 层实际上,其中间还有一个过渡层,过渡层十分复杂,其展开结构如上图右侧所示。

首先,7层 CNN,每一层并不都是一样的算子,第一层是一维卷积、group norm以及激活函数gelu,另外六层 CNN 一样,由一维卷积和 gelu 激活函数构成过渡层结构如下:首先经过转置,转置之后经过 layernorm,之后会经过 post extract 线性层,线性层的输出过一个转置,转置之后做 post conv 操作,(post conv 展开后是:一维卷积,向量对齐 sampad,维度对齐之后再过一个 gelu),再对输出结果进行转置,转置后的结果和 post extract 的结果进行求和操作。

魔改增加的算子如下:先过一层 mean pool,再过 l2 norm,再从 faiss 检索中召回与这个向量最相似的向量候选集另外,还会经过分类层 classify linear,以及 softmax,来判断这条语音是不是应该要据实。

案例一和案例二都涉及到12层的transformer-encoder,这是性能的瓶颈。3. 优化方案1:模型压缩

性能优化的第一步是做模型压缩,将12层的 transformer-encoder 压缩成3层或者更少的层模型压缩主要采用蒸馏的方法,蒸馏法分为自蒸馏和异构蒸馏自蒸馏是网络层数发生变化,每一层 transformer 的网络结构没有发生变化;异构蒸馏是指 transformer 蒸馏成 fast-text 这种小模型,性能可能要比自蒸馏的模型快,但是预测准确度不及自蒸馏的模型。

这里采用的是自蒸馏的方法,参考 tiny bert 的方式,所用到的 loss function 分为四个部分,第一个是 embedding loss,第二个是 attention loss,第三个是 hidden states 的 loss,第四个是 logic 的 loss。

针对案例一中的MQA模型,具体蒸馏的流程如上图所示首先拿到通用的预训练的大模型,使用领域数据做二次预训练,可以得到领域内的大的预训练模型,对其进行通用蒸馏,也就是使用 tiny bert 的蒸馏方式,蒸馏成一个小的领域的模型,得到小模型后再使用任务数据进行 fine tune,得到领域的QA模型。

最终的效果如上表所示。最终选取比较折中的蒸馏层数,采用3层的蒸馏层数,平均耗时80ms,准确率78%左右。

针对案例二中的 Speech QA 模型,和 MQA 模型采用的蒸馏方式不同,该模型采用的蒸馏方式最大的不同就是:输入的类型不一样Wav2vec模型是12层的,这里只初始化了3层,其输入是语音数据;另一边使用 bert 预训练模型,其输入是与语音数据相对应的文本数据。

语音数据经过wav2vec预训练模型产生的 wav2vec向量会和文本数据经过bert预训练模型产生的文本向量产生一个 lossWav2vec向量会有一个二分类的标识,来表示这个向量是拒识的还是不拒识的,会过一个拒识的分类层,得到 label 的 loss。

通过这两个 loss 来更新预训练模型的权重4. 优化方案2:多算子融合

蒸馏完之后,三层的transformer 本身并没有做优化,接下来是针对单层的 transformer 以及 transformer 之外通用的算子做性能优化,称为“多算子融合”上图中是矩阵加法运算的示例,编写方法和C语言很相似,__global__ 表示代码不但可以在CPU上运行,还可以在 GPU 上运行的;__device__表示只能在CPU上运行;__host__相当于是在CPU上运行。

Main函数中<<>>表示一个核函数的调用,相当于一个算子

没有经过优化的模型,由很多算子组合而成,从上图中的性能图上可以看出,算子与算子之间有比较大的空隙,空隙就是浪费的资源,相当于每个核函数调用的开销如果算子的力度很小,带来的问题就是调用的开销,就是性能图中的空隙产生的开销;从主机端到 device 会有频繁的拷贝的操作;如果算子的力度太小,会导致 GPU 的利用率很低。

针对上述存在的问题,我们采用多算子融合的方法在 BERT 模型中,有3个embding lookup 算子,将这3个算子合并成一个 kernel;在 Speech QA 模型中,将卷积 conv1d 和激活函数 gelu 的操作合并为一个 kernel;对于 Faster Transformer 的单层优化,这里采用开源的 lib 库进行优化,可以将 60 个 kernel 的计算逻辑合并为 14 个 kernel。

上图是 Faster Transformer 优化后的结构,绿色表示矩阵乘的部分,蓝色属于 kernel 合并后的一个操作。5. 优化方案3:矩阵乘优化

矩阵乘采用 cubelas 的 API 提供的多种算法,具体采用哪种算法,根据GPU的型号来确定,如果不确定的话,可以选址支持自适应选择算法的类型,或者采用 gemm 工具跑出当前环境的最佳矩阵算法

使用 cubelas 来做矩阵乘的优化时,需要注意:c++ 中的矩阵是按照行进行存储的,cubelas 是按列存储的,可参考如上例子,正确的方法如下,通过矩阵转置来实现。

模型量化一般使用FP16或INT8来做量化在我们的场景中,采用FP16量化已经满足了线上的要求量化的本质是:通过采用较少位的数值表示,在处理同样数据时我们需要读写的内容就更短,内存带宽的压力就变的更小,计算时间也会因数据的简化而减少。

采用FP16量化时,当我们使用pytorch训练好模型后,我们在导出参数时将参数进行一个半精度的提取。在GPU中有half2的类型,它可以合并半精度的操作,可以使得性能更高。

算子或者算子的某一部分的运算满足结合律,例如softmax 的底数进行一系列元素的加法,这一系列元素的加法不进行一个串行的相加,cuda 中可以通过多个线程,两两相加,相加完之后再做一个整体的相加6. 优化方案4:服务化-动态batch。

实验1是根据数据的条数来进行实验,实验2是根据数据的长度来进行实验。通过实验得到结论:在允许的时延内,一次性处理多条数据,可以提高计算效率;数据越长,cpu处理的耗时越长。

根据上述实验结论,对架构进行了优化。QA server中分为两大块,首先是对召回的数据进行排序,排序之后进行组装,组装成小task,输入到 work 进程中去预测。7. 效果展示与总结

实验结果如上图所示,实验过程中发现:蒸馏、量化以及动态batch带来的效果是最明显的今天的分享就到这里,谢谢大家阅读更多技术干货文章、下载讲师PPT,请关注微信公众号“DataFunTalk”分享嘉宾:。

活动推荐:

关于我们:DataFun:专注于大数据、人工智能技术应用的分享与交流发起于2017年,在北京、上海、深圳、杭州等城市举办超过100+线下和100+线上沙龙、论坛及峰会,已邀请超过2000位专家和学者参与分享。

其公众号 DataFunTalk 累计生产原创文章700+,百万+阅读,14万+精准粉丝欢迎转载分享评论,转载请私信。


以上就是关于《腾讯李正兴:蒸馏、量化、动态batch——深度模型推理加速实践_李正兴是谁》的全部内容,本文网址:https://www.7ca.cn/baike/8490.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜