视觉大模型训练和推理加速

导读

本次分享将解说怎么结合 profiling 东西,发现练习与推理的功能瓶颈。介绍结合GPU产品特点,运用算子交融、低精度等技能,以及Faster Transformer最佳实践,提高功能并加快吞吐。

12 月份的「百度百舸 – 云原生 AI」技能公开课的 4 期收拾文字现已全部发布,直播回放视频将在明年 1 月份连续上线,咱们能够经过百度智能云技能站视频号观看。

咱们好,我是来自 NVIDIA GPU 核算专家团队的陶砺,很高兴今日有时机在这儿跟咱们分享一下我和我的搭档陈庾,在 Swin Transformer 这个视觉大模的型练习和推理优化上的一些作业。其间一些的办法与战略,在其他的模型练习、推理的优化上都能够运用,来提高模型的吞吐、提高 GPU 的运用功率、加快模型的迭代。

我会介绍 Swin Transformer 模型的练习部分的优化,在推理优化部分的作业,将由我的搭档来做详细的介绍。

这儿是咱们今日分享的目录,首要分为四个部分,既然是针对特定模型进行的优化,那么咱们首要会简略介绍一下 Swin Transformer 模型。然后,我会结合 profiling 的东西,也便是 nsight system 对练习的流程进行剖析和优化。在推理部分,我的搭档会给出推理优化的战略和办法,包含较为细节的 cuda 层面的优化。终究,是今日优化内容的一个总结。

视觉大模型训练和推理加速

首要是榜首部分,也便是 Swin Transformer 的介绍。

一、Swin Transformer简介

从模型的称号咱们能够看出,这是一个依据 transformer 的模型,咱们先对 transformer 进行一下简略的回忆。

Transformer 模型从 attention is all you need 这篇文章中被提出后,在自然语言处理领域的许多使命上大放异彩。

Transformer 模型的核心便是所谓的注意力机制,也便是 attention mechanism。关于注意力模块,一般的输入是 query,key 和 value 三个张量。经过 query 和 key 的作用,加上 softmax 的核算,能够得到一般被称为 attention map 的注意力成果,依据 attention map 中的数值的高低,模型就能够学习到需求更加注意 value 中的哪些区域,或许说模型能够学习到,value 中的哪些数值对咱们的使命有很大的帮助。这便是最基础的单头注意力模型。

咱们经过增加这样单头注意力的模块的数量,也就能够构成常见的多头注意力模块。常见的 encoder、decoder 都是依据这样的多头注意力模块建立的。

许多模型一般包含了 self-attention,cross-attention 这两种注意力模块,或许是一个或多个模块的堆叠。如闻名的 BERT 便是由多个 encoder 模块组成,现在大热的 diffusion 模型一般一起包含了 self-attention 和 cross-attention。

视觉大模型训练和推理加速

在 Swin Transformer 之前, Vision Transformer (ViT) 首要将 transformer 应用到了核算机视觉领域。ViT 的模型结构,如下图左侧所示,ViT 会将一个图画分割成一系列的 patch,每一个 patch 类比于自然语言处理中的 token,然后经过一个 Transformer-based 的 encoder 对这一系列 patch 进行 encode,终究得到可用于分类等使命的 feature。

而来到 Swin Transformer,它引入了 window attention 的概念,不同于 ViT 对整个图画进行 attention,Swin Transformer 会先将图画区分成若干个 window,然后仅对 window 内部的 patch 进行 attention,然后削减核算量。

为了弥补 window 带来的边界问题,Swin Transformer 进一步引入 window shift 的操作。一起为了使得模型有更丰厚的位置信息,还在 attention 时引入了 relative position bias。其实这儿的 window attention 和 window shift,便是 Swin Transformer 中的 Swin 称号的由来。

视觉大模型训练和推理加速

这儿给出的是 Swin Transformer 的网络结构,大致的一个网络结构和传统的 CNN 如 ResNet 非常附近。

能够看到整个网络结构被区分为多个 stage,在不同 stage 中心,会有对应的降采样的进程。每个 stage 的分辨率是不一样的,然后形成了一个分辨率金字塔,这样也使得每个 stage 的核算杂乱程度也逐渐下降。

然后每个 stage 中会有若干个 transformer block。每一个 transformer block 中,就会用到上面说到的 window attention 模块。

视觉大模型训练和推理加速

接下来,咱们从详细操作的视点来对 Swin Transformer 进行解构。

能够看到,一个 transformer block 中涉及到三大部分,榜首部分是 window shift/partition/reverse 的 window 相关的操作,第二部分是 attention 核算,第三部分是 FFN 核算;而 attention 和 FFN 部分又能够进一步细分为若个 op,终究咱们能够将整个模型细分为几十个 op 的组合。

这样的算子区分关于咱们进行功能剖析,定位功能瓶颈以及展开加快优化而言,都是非常重要的。

视觉大模型训练和推理加速

以上便是榜首部分的介绍。接下来,咱们来介绍一下在练习上咱们进行的一些优化作业,特别的,咱们结合 profiling 东西,也便是 nsight system,对全体的练习流程做一个剖析和优化。

二、Swin Transformer优化练习

关于大模型的练习而言,一般会用到多卡、多节点的核算资源。针对 Swin Transformer,咱们发现卡间通讯的开支占比会相对较少,随着卡数的增长,全体速度的提高简直出现线性的增长,所以在这儿,咱们优先对单 GPU 上的核算瓶颈进行剖析和优化。

nsight system 是一个系统层面的功能剖析东西,经过这个东西,咱们能够很便利的看到模型的各个模块的 GPU 的运用状况,是否存在数据等待等或许存在的功能瓶颈和优化空间,能够便于咱们合理的规划 CPU、GPU 之间的负载。

nsight system 能够捕捉到 CUDA,以及一些 gpu 核算库如 cublas,cudnn,tensorRT 等调用的核(kernel)函数的调用和运转状况,以及能够便运用户添加一些符号,来统计符号范围内对应 gpu 的运转状况。

一个规范的模型优化流程如下图所示,咱们对模型进行 profiling,拿到功能剖析报告,发现功能优化点,然后有针对性的去做功能调优。

视觉大模型训练和推理加速

这儿是一个 nsight system 的界面,咱们能够很明晰地看到核函数的发射,也便是 kernel launch;核函数的运转,也便是这儿的 runtime 部分。关于详细的核函数,咱们能够看到在整个流程里的时刻占比,以及 gpu 是否存在闲暇等信息。在添加完 nvtx 符号之后,咱们能够看到模型前向,反向所需求的时刻。

视觉大模型训练和推理加速

在前向部分,假如扩大,咱们也能够明晰地看到详细每个 SwinTransformer Block 的核算需求的时刻。

视觉大模型训练和推理加速

咱们首要经过 nsight system 功能剖析东西来看一下整个 baseline 的功能表现,下图中展现的便是 FP32 的 baseline,能够看到它的 GPU 运用率是很高的,而其间占比最高的是矩阵乘的 kernel。

那么关于矩阵乘法而言,咱们的一个优化手法,便是充分运用 tensor core 进行加快。

咱们知道 NVIDIA 的 GPU 内有 cuda core 和 tensor core 这样的硬件资源,tensor core 是专门为了矩阵乘法的加快的模块。咱们能够考虑直接选用 tf32 tensor core 或许混合精度下,选用 fp16 tensor core。要知道,运用 fp16 的 tensor core 在矩阵乘法上的吞吐,会比 tf32 要高,比照纯 fp32 的矩阵乘也会有很高的加快作用。

视觉大模型训练和推理加速

在此,咱们选用了混合精度的计划。经过选用 torch.cuda.amp 的混合精度的形式,咱们能够获得了 1. 63 倍的吞吐提高。

视觉大模型训练和推理加速

在 profiling 的成果里也能够很明晰地看到,原本占最高的矩阵乘,经过优化后,在整个 timeline 中的占比降到了 11.9%。至此,占比较高的 kernel 都是 elementwise kernel。

视觉大模型训练和推理加速

关于 elementwise kernel,咱们首要要了解哪里会用到 elementwise 的 kernel。

Elementwise kernel 里,比较常见的 unrolled elementwise kernel 和 vectorized elementwise kernel。其间 unrolled elementwise kernel 广泛存在于一些有偏置的卷积,或许线性层中,以及一些确保数据在内存连续性的 op 中。

vectorized elementwise kernel 则常常出现在一些激活函数,如 ReLU 的核算中。假如想要削减这儿大量的 elementwise kernel,一个常见的做法是做算子交融,比方矩阵乘法中,咱们能够经过将 elementwise的操作与矩阵乘法的算子交融在一起,来下降这部分的时刻开支。

视觉大模型训练和推理加速

关于算子交融,一般来说能够为咱们带来两个优点:

一个是削减 kernel launch 的开支,如下图所示,两个 cuda kernel 的执行需求两次 launch,那样或许会导致 kernel 之间存在 gap,使得 GPU 闲暇,那么假如咱们将两个 cuda kernel 交融成一个 cuda kernel,一方面节省了一次 launch,一起也能够防止 gap 的发生。‍

别的一个优点是削减了 global memory 的拜访,由于 global memory 的拜访是非常耗时的,而两个独立的 cuda kernel 之间要进行成果传递,都需求经过 global memory,将两个 cuda kernel 交融成一个 kernel,咱们能够在寄存器或许 share memory 上进行成果传递,然后防止了一次 global memory 写和读,提高功能。

视觉大模型训练和推理加速

关于算子交融,咱们榜首步是选用现成的 apex 库来进行 Layernorm 和 Adam 中操作的交融,能够看经过简略的指令替换,咱们能够使能 apex 的 fused layernorm 和 fused Adam,然后使得加快从 1.63 倍提高至 2.11 倍。

视觉大模型训练和推理加速

从 profling 的日志咱们也能够看到,经过算子交融之后,elementwise kernel 在这个 timeline 的占比大幅下降,矩阵乘法重新成为时刻占比最大的 kernel。

视觉大模型训练和推理加速

除了运用现有的 apex 库,咱们也进行了手工的交融算子开发。

经过观察 timeline,以及对模型的了解,咱们发现 Swin Transformer 中有特有的 window 相关操作,如 window partition/shift/merge 等,这儿的一次 window shift,需求调用两个 kernel,并在 shift 完成之后调用 elementwise 的 kernel。而且,attention 模块前假如需求做一次这样的操作,那么之后会有对应的 reverse 操作。这儿单单 window shift 调用的 roll_cuda_kernel 就在整个 timeline 中占比 4.6%。

视觉大模型训练和推理加速

方才说到的这些操作,其实仅仅对数据进行了区分,即对应的数据会被区分到一个 window 中去,对应的原始代码如下图所示。

视觉大模型训练和推理加速

咱们发现,这部分的操作其实本质上仅仅 index mapping,因此,咱们对这一部分进行的交融算子开发。开发的进程,咱们需求掌握 CUDA 编程的相关知识,而且编写算子的前向核算和反向核算的相关代码。

怎么向 pytorch 中引入自定义算子,官方给出了教程,咱们能够按照教程编写 CUDA 代码,编译好后就能够作为一个模块引入原始的模型。能够看到,经过引入咱们的定制化交融算子,咱们能够将加快比进一步提高至 2.19 倍。

视觉大模型训练和推理加速

接下来展现的是,咱们对 mha 部分的交融作业。

Mha 部分是 transformer 模型中一个占比很大的模块,因此对它的优化往往能够带来较大的加快作用。从图中能够看到,在没有进行算子交融之前,mha 部分的操作占比为 37.69%,其间包含了不少 elementwise 的 kernel。假如咱们能够将相关操作交融成一个独立的 kernel,并具有更快的速度,加快比能够得到进一步提高。

视觉大模型训练和推理加速

关于 Swin Transformer,这部分的模块除了 query,key 和 value 外,mask 和 bias 都是以 tensor 的形式传入的,咱们开发了 fMHA 这样的一个模块,能够将原本的若干 kernel 交融起来。从 fMHA 这个模块涉及到的核算来看,针对 Swin Transformer 中遇到的一些 shape,该模块都有比较明显的提高。

视觉大模型训练和推理加速

模型用上 fMHA 模块后,咱们能够将加快比进一步提高 2. 85 倍。上述是咱们在单卡上获得的练习加快作用,那么咱们来看一下单机 8 卡的练习状况,能够看到,经过上述优化,咱们能够将练习吞吐从 1612 提高至 3733,获得 2.32 倍的加快。

视觉大模型训练和推理加速

关于练习优化而言,加快比咱们期望越高越好,对应的,咱们也期望加快后的功能能够与加快前保持一致。

叠加上上述若干加快计划后,能够看到,模型的收敛性与原始的 baseline 保持一致,优化前后的模型的收敛、精度的一致性,在 Swin-Tiny,Swin-Base 以及 Swin-Large 上都得到了验证。

视觉大模型训练和推理加速

关于练习部分,一些其他的加快战略包含 CUDA graph、multi-stream 等,都能对 Swin Transformer 的功能有进一步提高;其他方面,现在咱们介绍的是运用混合精度的计划,也便是 Swin Transformer 官方 repo 选用的战略;运用纯 fp16 的计划(即 apex O2 形式)能够到达更快的加快作用。

尽管 Swin 对通讯的要求不高,可是关于多节点大模型的练习,相比于原始的分布式练习,运用合理的战省略躲藏通讯的开支,能够在多卡练习上获得进一步的收益。

视觉大模型训练和推理加速

接下来,有请我的搭档来介绍一下咱们在推理上的加快计划和作用。

三、Swin Transformer推理优化

咱们好,我是来自英伟达 GPU 核算专家团队的陈庾,非常感谢陶砺在练习加快上的介绍,接下来由我来介绍一下推理上的加快。

跟练习一样,推理的加快离不开算子交融这一计划。不过相关于练习而言,在推理上进行算子交融有更好的灵活性,首要表现有两点:

  • 推理上的算子交融不需求考虑反向,所以 kernel 开发进程中不需求考虑保存核算梯度所需求的中心成果;

  • 推理进程答应预处理,咱们能够对一些只需求一次核算便可重复运用的操作,提早算好,保存成果,每次推理时直接调用然后防止重复核算。

在推理侧,咱们能够进行不少的算子交融,这儿给出的是咱们在 Transformer 模型中常见的一些算子交融的 pattern 以及完成相关 pattern 所需求用到的东西。

首要,咱们单独列出矩阵乘法和卷积,是由于有一大类算子交融是围绕他们进行的,关于矩阵乘法相关的交融,咱们能够考虑选用 cublas,cutlass,cudnn 这三个库;关于卷积,咱们能够选用 cudnn 或许 cutlass。那么关于矩阵乘法的算子交融而言,在 Transformer 模型中,咱们概括为 gemm + elementwise 的操作,比方 gemm + bias, gemm + bias + 激活函数等,这一类的算子交融,咱们能够考虑直接调用 cublas 或 cutlass 来完成。

此外,假如咱们 gemm 之后的 op 操作比较杂乱,比方 layernorm,transpose 等,咱们能够考虑将 gemm 和 bias 分隔,然后把 bias 交融到下一个 op 中,这样能够更为容易地调用 cublas 来完成简略的矩阵乘法,当然这种 bias 和下一个 op 进行交融的 pattern 一般是需求咱们手写 cuda kernel 来完成。

终究,有一些特定 op,相同需求咱们以手写 cuda kernel 的办法进行交融,比方 layernorm + shift + window partition。

由于算子交融需求咱们比较巧妙地规划 cuda kernel,所以咱们一般主张先经过 nsight system 功能剖析东西对全体 pipeline 进行剖析,优先针对热点模块进行算子交融优化,以到达功能和作业量的平衡。

视觉大模型训练和推理加速

那么在很多的算子交融优化中,咱们选择了两个加快作用比较显着的算子进行介绍。

首要是 mha 部分的算子交融,咱们将 position bias lookup 这一操作提早到预处理部分,然后防止每次推理时都进行 lookup。

然后将 batch gemm,softmax,batch gemm 交融成一个独立的 fMHA kernel,一起咱们把 transpose 相关的操作交融到了 fMHA kernel I/O 操作中,经过一定的数据读写的 pattern 来防止显式的 transpose 操作。

能够看到,交融后该部分获得了 10 倍的加快,而端到端也获得了 1.58 倍的加快。

视觉大模型训练和推理加速

另一个我想介绍一下的算子交融是 QKV gemm + bias 的交融。

gemm 和 bias 的交融是一个非常常见的交融手法,在这儿为了合作咱们前面说到的 fMHA kernel,咱们需求对 weight 和 bias 提早进行格局上的改换。

我之所以在这儿选择介绍这个算子交融,也正是由于这种提早改换表现了咱们前面说到的,推理上进行算子交融的灵活性,咱们能够对模型的推理流程做一些不影响其精度的改变,然后完成更好算子交融 pattern,获得更好的加快作用。

终究,经过 QKV gemm+bias 的交融,咱们能够进一步获得 1.1 倍的端到端加快。

视觉大模型训练和推理加速

下一个优化手法是矩阵乘法 padding。

在 Swin Transformer 的核算中,有时候咱们会遇到主维为奇数的矩阵乘法,这时候并不利于咱们的矩阵乘法 kernel 进行向量化读写,然后使得 kernel 的运转功率变低,此刻咱们能够考虑对参与运算的矩阵主维进行 padding 操作,使其变为 8 的倍数,这样一来,矩阵乘 kernel 就能够以 alignment=8,一次读写 8 个元素的办法来进行向量化读写,提高功能。

如下表所示,咱们将 n 从 49 padding 到 56 后,矩阵乘法的 latency 从 60.54us 下降为 40.38us,获得了 1.5 倍的加快比。

视觉大模型训练和推理加速

下一个优化手法是巧用 half2 或许 char4 这样的数据类型。

以下的代码是一个 half2 优化的示例,它完成的是一个简略的加 bias 再加残差这样的算子交融操作,能够看到经过运用 half2 数据类型,相关于 half 数据类,咱们能够将 latency 从 20.96us 下降到 10.78us,加快 1.94 倍。

那么选用 half2 数据类型一般有什么优点呢?首要有三点:

榜首个优点是向量化读写能够提高 memory 的带宽运用功率并下降访存指令数;如下图右侧所示,经过 half2 的运用,访存指令削减了一半,一起 memory 的 SOL 也有明显提高;

第二个优点是结合 half2 专有的高吞吐的数学指令,能够减低 kernel 的 latency。这两点都现已表现在了这个示例程序中;

第三个优点是在进行 reduction 相关 kernel 开发时,选用 half2 数据类型意味着一个 cuda 线程一起处理两个元素,能够有用削减闲暇的线程数,也能够削减线程同步的 latency。

视觉大模型训练和推理加速

下一个优化手法是巧用寄存器数组

在咱们进行 layernorm 或许 softmax 等 Transformer 模型常见的算子优化时,咱们常常需求在一个 kernel 中多次运用同一个输入数据,那么相关于每次都从 global memory 读取,咱们能够选用寄存器数组来缓存数据,然后防止重复读取 global memory。

由于寄存器是每个 cuda 线程独占的,所以在进行 kernel 规划时,咱们需求提早设定好每个 cuda 线程所需求缓存的元素个数,然后开辟对应巨细的寄存器数组,而且在分配每个 cuda 线程所担任元素时,需求确保咱们能够做到兼并拜访,如下图右上侧所示,当咱们有 8 个线程时,0 号线程能够处理 0 号元素,当咱们有 4 个线程是,0 号线程则处理 0 号和 4 号元素,如此类推。

咱们一般主张能够选用模板函数的办法,经过模板参数来控制每 个cuda 线程的寄存器数组巨细。

视觉大模型训练和推理加速

此外,在运用寄存器数组时,需求确保咱们的下标是常量,假如是循环变量作为下标,咱们应该尽量确保能够进行循环展开,这样能够防止编译器将数据放到了 latency 很高的 local memory 中,如下图所示,咱们在循环条件中添加约束,经过 ncu report 能够看到,防止了 local memory 的运用。

视觉大模型训练和推理加速

终究一个我想介绍优化手法是 INT8 量化。

INT8 量化是推理加快非常重要的加快手法,关于 Transformer based 的模型而言,INT8 量化能够在削减显存耗费的一起带来更好的功能。

而关于 Swin 来说,经过结合合适的 PTQ 或 QAT 量化计划,能够在获得杰出加快的一起,确保量化精度。一般咱们进行 int8 量化,首要是对矩阵乘法或许卷积进行量化,比方 int8 矩阵乘法中,咱们会先将原始的 FP32 或 FP16 的 input 和 weight 量化为 INT8 然后再进行 INT8 矩阵乘法,累加到 INT32 数据类型上,这是咱们会进行反量化操作,得到 FP32 或 FP16 的成果。‍‍

视觉大模型训练和推理加速

比较常见调用 INT8 矩阵乘法的东西是 cublasLt,为了能够获得更好的功能,咱们有必要深化地了解一下 cublasLt api 的一些特性。

cublasLt 关于 int8 矩阵乘法,提供了两种输出类型,分别是下图左侧所示,以 INT32 输出,或许下图右侧所示,以 INT8 输出,图中蓝框所示的 cublasLt 的核算操作。

能够看到相关于 INT32 输出而言, INT8 输出会多了一对反量化和量化操作,这样一来一般会带来更多的精度损失,可是由于 INT8 输出,在写出到 global memory 时相对 INT32 输出少了 3/4 的数据量,功能会更好,所以这儿面存在着精度和功能 tradeoff。

那么关于 Swin Transformer 而言,咱们发现合作 QAT,以 INT8 输出会在取好的加快比的前提下,确保精度,由于咱们选用了 INT8 输出的计划。

视觉大模型训练和推理加速
别的,关于 cublasLt 中 INT8 矩阵乘法,还需求考虑数据的布局问题,cublasLt 支撑两种布局,一种 IMMA-specific 的布局,其间涉及到一些比较杂乱的格局,而且在这种布局只支撑 NT-gemm,别的一种是惯例的列优先的布局,在此布局下支撑 TN-gemm。

一般来说,选用列优先的布局,会更有利于整个 pipeline 代码的开发,由于假如咱们用 IMMA-specific 布局的话,咱们为了兼容这种布局或许需求许多额外的操作,以及上下流 kernel 也需求为这种特别布局做兼容。可是在一些尺度的矩阵乘法上,IMMA-specific 布局或许会有更好的功能,所以假如咱们要测验建立 int8 推理的话,主张咱们能够先做一些 benchmark,以便更好地从功能和开发难易程度做取舍。

在 FasterTransformer 中咱们选用了 IMMA-specific 布局。所以接下来,咱们以 IMMA-specific 布局为例,简略介绍了一下 cublasLt int8 矩阵乘法的根本建立流程,以及一些开发技巧。

视觉大模型训练和推理加速

cublasLt int8 矩阵乘法的根本建立流程,总共能够分为 5 步:

  • 首要咱们需求创立句柄和乘法描述符;‍

  • 接下来咱们为每个矩阵创立一个矩阵描述符;

  • 由于一般咱们的输入都是惯例 layout 的,所以咱们需求对惯例布局的矩阵进行布局转化,使其变为 IMMA-specific 的布局;‍

  • 然后再进行 int8 矩阵乘法,得到成果之后,咱们能够考虑继续用这个成果进行下流的乘法核算,这样能够防止改变会惯例布局的开支;‍

  • 只有终究一个矩阵乘法的成果,咱们需求转化惯例布局以便输出。

上述介绍了 IMMA-specific 布局下的建立流程,能够看到里边会有不少约束。为了防止这些约束对功能的影响,咱们在 Faster Transformer 中选用了以下技巧:

  • 首要 IMMA-specific 布局对矩阵是有特定的尺度要求,为了防止推理进程中需求额外分配空间的操作,咱们会提早分配好契合 IMMA-specific 布局尺度的 buffer;

  • 然后,由于 weight 能够一次处理重复运用,所以咱们会提早对 weight(相当于乘法中的 B 矩阵)进行布局改换,防止在推理进程中重复改换 weight;

  • 第三个技巧是,关于不得不进行特别布局改换的 A 和 C,咱们会把改换和上游或下流 op 进行算子交融,以便躲藏这部分的开支;

  • 终究一点,是与布局无关,而是 int8 矩阵乘法必有的量化和反量化的操作,咱们相同会选用算子交融的办法,把它的 latency 躲藏起来。

视觉大模型训练和推理加速

以下是咱们在 Faster Transformer 中选用的的 INT8 流程的示意图,能够看到,一切矩阵乘都变为了 int8 数据类型,每个 int8 矩阵乘法前后都会刺进对应的量化和反量化节点,然后关于加 bias,加残差或 layernorm 等操作,咱们还是保存原始的 FP32 或 FP16 数据类型,当然它的 I/O 或许是 int8 的,然后会比 FP16 或 FP32 I/O 功能要好。

视觉大模型训练和推理加速

这儿展现的是 Swin Transformer int8 量化的精度状况,经过 QAT 咱们能够确保精度损失在千分之 5 以内。

而在 PTQ 那一列,咱们能够看到 Swin-Large 的掉点比较严重,一般对应掉点严重的问题,咱们都能够考虑选用削减一些量化节点的办法来提高量化精度,当然这样或许会带来加快作用的削弱。

视觉大模型训练和推理加速

在 FT 中,咱们能够经过禁用 FC2 和 PatchMerge 中 int 8 矩阵乘法的 int8 输出前的反量化和量化结点(即选用 int32 输出),来进一步提高量化精度,能够看到在此优化操作下,swin-large 的 PTQ 精度也显着提高了。

视觉大模型训练和推理加速

接下来是咱们推理侧获得的加快作用,咱们分别在不同型号的 GPU T4、A10、A100 上进行了跟 pytorch FP16 完成的功能比照。

其间下图左侧是优化后跟 pytorch 的 latency 比照,右图为优化后 FP16 下跟 pytorch 以及 INT8 优化跟 FP16 优化的加快比。能够看到,经过优化,在 FP16 精度上,咱们能够获得,相关于 pytorch 2.82x ~ 7.34x 的加快,结合 INT8 量化,咱们能够在此基础上进一步获得 1.2x ~ 1.5x 的加快。

视觉大模型训练和推理加速

四、Swin Transformer优化总结

终究,咱们总结一下,本次分享中咱们介绍了怎么经过 nsight system 功能剖析东西发现功能瓶颈,然后针对功能瓶颈,介绍了一系列练习推理加快技巧,其间包含 1. 混合精度练习 / 低精度推理,2. 算子交融,3. cuda kernel 优化技巧 :如矩阵补零,向量化读写,巧用寄存器数组等,4. 推理优化上选用一些预处理,来完善咱们的核算流程;咱们也介绍了 multi-stream,cuda graph 的一些应用 。

结合上述优化,咱们在练习上,以 Swin-Large 模型为例获得了单卡 2.85x 的加快比,8 卡 2.32x 的加快比;在推理上,以 Swin-tiny 模型为例,在 FP16 精度下获得了 2.82x ~ 7.34x 的加快比,结合 INT8 量化,进一步获得 1.2x ~ 1.5x 的加快比。

视觉大模型训练和推理加速

上述视觉大模型练习与推理的加快办法都现已在百度百舸 AI 异构核算渠道的 AIAK 加快功能中完成,欢迎咱们运用。

视觉大模型训练和推理加速

—— END——

引荐阅读:

百度工程师带你玩转正则

Diffie-Hellman密钥洽谈算法探究

贴吧低代码高功能规矩引擎规划

浅谈权限系统在多利熊事务应用

分布式系统关键路径延迟剖析实践

百度工程师教你玩转规划形式(装修器形式)