一文探秘LLM应用开发(10)-模型部署与推理(模型适配优化之GPU面面观-2)

技术

动手点关注

picture.image

干货不迷路

picture.image

本文旨在让无大模型开发背景的工程师或者技术爱好者无痛理解大语言模型应用开发的理论和主流工具,因此会先从与LLM应用开发相关的基础概念谈起,并不刻意追求极致的严谨和完备,而是从直觉和本质入手,结合笔者调研整理及消化理解,帮助大家能够更容易的理解LLM技术全貌,大家可以基于本文衍生展开,结合自己感兴趣的领域深入研究。若有不准确或者错误的地方也希望大家能够留言指正。

本文体系完整,内容丰富,由于内容比较多,分多次连载

第一部分 基础概念

1.机器学习场景类别

2.机器学习类型(LLM相关)

3.深度学习的兴起

4.基础模型

第二部分 应用挑战

1.问题定义与基本思路

2.基本流程与相关技术

1)Tokenization与Embbeding

2)向量数据库

3)finetune(微调)

4)模型部署与推理

5)prompt

6)编排与集成

7)预训练

第三部分 场景案例

常用参考

第二部分 应用挑战

2.基本流程与相关技术

4)模型部署与推理

模型适配优化

接上文 一文探秘LLM应用开发(9)-模型部署与推理(模型适配优化之GPU面面观-1)

选择合适的GPU(显卡)

目前市面上的主流GPU厂商有很多家,如英伟达,AMD,Intel,高通Adreno、景嘉微(国产),芯动(国产)等等。不过目前英伟达和AMD在市场上占居领跑者地位。网上提到的N卡和A卡,就指的是英伟达(NVIDIA)的显卡和ATI的显卡(2006年被AMD收购)。显卡和GPU的关系就像是汽车与发动机的关系,一个显存是由GPU,PCB板,显存颗粒等等部件构成。

picture.image

另外,还有公卡和非公卡的概念。这里公卡指的是GPU生产厂家生产的,满足产品兼容性问题的最原始版显卡,而非公卡,GPU也是生产厂家提供的,经过各大授权厂家结合自身需求和工艺水平调整集成做出来的显卡。还是以英伟达为例,它就有八个合作伙伴(华硕、技嘉、微星、七彩虹、影驰、索泰、映众、耕升),它们一样的品质一样是可靠的。

picture.image

一般来讲,同一品牌可以通过显卡命名就能大体判断其性能强弱。以下是NVIDIA和AMD的举例。

picture.image

品牌间的横向比较,网上也有大量的性能对比信息供普通消费者参考。下图便是各大厂商消费级GPU各大型号性能天梯图(可以看出各大厂商,特别是NVIDIA和AMD在全品类都有对标)。

picture.image

那么问题来了,从消费级产品来看,AMD与NVIDIA全系都有对标,那为什么在AI领域英伟达成为了绝对主流选择,那么AMD与之主要差距在什么地方?

Nvidia vs AMD

AMD与Nvidia竞争劣势表现在软件,硬件,生态全方面。

前面提到了英伟达的Cuda在某种意义上屏蔽了并行计算的复杂度,统一了计算,到了2011年,NVIDIA在Cuda4.0当中加入了GPUDirect2.0、Unified Virtual Addressing(Cuda UVA)以及Unified Memory Pool的概念,又统一显存使用。

随着计算性能的提升需要,又引入了Nvlink,突破了PCIe的带宽限制,可以将多个 GPU 直接连接起来,无需通过PCIe总线即可访问远程GPU内存, 实现GPU间高速内部通信,提供高达 300 GB/s 的带宽和 1.5 微秒的延迟。在此之上,为了增加互联GPU的数量,以及克服Nvlink点对点通信,存在通信多跳,拓扑规划复杂等问题,又开发了NVSwitch技术配合,提供了高达18路的nvlink接口,让网络中任何两个GPU高效交换,从而组建更大的计算服务。

picture.image

除能够实现GPU间高速内部通信的NVLink和NvSwitch技术外(nvlink支持网络间连接),还可以用InfiniBand代替Ethernet,为机器之间通信提供更大带宽,减少数据传输延迟造成的瓶颈。而这些特性都使得组建大规模并行计算集群成为了可能。

picture.image

picture.image

picture.image

在支持深度学习层面,Nvidia也具备先发优势,在2017年NVIDIA就在其Volt架构引入了Tensor Core,而AMD到了2020年才有类似的技术Matrix Core。

在软件兼容及开发者生态上,NVIDIA与Pytorch和Tensorflow等软件集成度高,在易用性上也更有优势。并在其之上,NVIDIA及合作伙伴提供了一系列的软件解决方案,如tensorRT,triton等等,简化开发者进行深度学习应用开发的复杂度,形成了完整的开发者生态。2006年,英伟达就推出了Cuda,并且不遗余力的推广和改进,当前Cuda的使用者已经超过400万,而对标Cuda的AMD的ROCm在2016年推出时,就已经比英伟达晚了十年,直到2023年4月,ROCm都仅支持Linux平台,其社区完善程度与集成性都和Nvidia有较大的差距。

可以看出,对开发者不论在计算还是存储都提供了统一的编程范式,并且这些优化都是软硬一体的,拥有完善的生态支持,特别是大规模的Cuda用户及构建于Cuda之上的大量应用积累,都具有很强的“马太效应”属性,AMD等别的厂商想要兼容复刻谈何容易。

当然,近年来AMD也在加速追赶,有消息称,AMD的MI250显卡在性能上,大语言模型训练速度方面已经达到了NVIDIA的A100显卡的80%性能。在软件层面,在最近的升级中,AMD的MI250加速卡已经更好地支持了PyTorch 框架,使其在AI领域的水平有了明显提升。但,A100显卡已经是上一代产品,最新顶级产品H100在AI性能上还有数倍到数十倍的提升空间。今年6月,AMD 发布Instinct MI300,将CPU、GPU和内存封装在了一起,晶体管数量高达1460亿个,接近英伟达H100的两倍。其搭载的HBM(高带宽内存)密度也达到了H100的2.4倍。也就是说,MI300在理论上可以运行比H100更大的AI模型,但目前用户寥寥。

因此,目前英伟达在GPU领域是绝对的王者,而AMD等也在不断追赶,目前在深度学习领域优先还是以英伟达GPU为首选。

英伟达GPU选择

英伟达GPU型号众多,在实际学习和生产中应该怎么选择具体的型号呢?首先需要依据使用场景选择产品系列,再结合芯片架构,Cuda核/Tensor核数量,显存带宽和位宽,显存类型和大小,计算精度性能(TFLOPS),GPU-GPU 带宽等多个维度选择合适性能要求的GPU型号。

产品系列

英伟达将自己的显卡结合实际使用场景,分了四个大的产品系列:Tegra,Quadro,GeForce,Tesla。

Tegra:基于ARM架构通用处理器,既有CPU也有GPU,英伟达称其为为“Computer on a chip”片上计算,主要用在移动嵌入式设备上。

Quadro: 该系列显卡定位为专业级显卡,一般用于专业绘图设计,比如设计、建筑等,图像处理专业显卡,比如CAD、Maya等软件。

GeForce: 该系列显卡官方定位是消费级显卡,用于家庭娱乐,细分为GeForce RTX 系列和 GeForce GTX系列 ,RTX更高端一些,后面四个数字,前两位代表芯片架构代际,后两位代表同一架构下性能的差异,如RTX 4090就比RTX 3090高一代,性能也更强。显卡的性能跟深度学习专业卡Tesla系列比起来相差不太多(显存较低)且支持CUDA,如RTX 3090,在没有Tesla‍系列时,也可以用它来进行深度学习训练和推理等用途,有一定的性价比,适合学习使用。

picture.image

Tesla: 该系列显卡定位专业级显卡,命名基于芯片架构首字母开始,如 P100,K80,T4 等,其中P,K,T分别代表Pascal,Kepler,Turing,用于大规模并行计算,不提供视频 输出,甚至没有风扇,一般用于数据中心,主要用于科学计算,深度学习等。Tesla系列显卡针对GPU集群做了优化,像那种4卡、8卡、甚至16卡服务器,Tesla多块显卡合起来的性能不会受很大影响,但是Geforce这种游戏卡性能损失严重,这也是Tesla主推并行计算的优势之一。

picture.image

因此,对于深度学习大模型相关GPU选择上,我们会以GeForce系列和Tesla系列为候选。

芯片框架

所谓GPU架构就是指其芯片的设计和实现方式,包括处理器核心的数量、计算单元的组织方式、内存架构、缓存架构、并行处理技术等方面。GPU架构 的设计直接影响着GPU的性能和功能,不同代际的GPU在性能层面都存在比较大阶跃。英伟达GPU芯片的架构从2008到现在架构经历了如下代际,一般采用著名科学家命名其架构,Tesla系列芯片架构一般可以通过型号首字母来判别:

picture.image

1)Tesla(特斯拉),2008年发布的初代架构,第一个实现统一着色器模型的微架构。经典型号T80。目前市面上已无售卖。

2)Fermi(费米),2010年发布,全新的设计方法设计的第一个GPU架构,奠定了英伟达GPU整体的发展方向,2012年的Kepler架构和2014年的Maxwell架构,都在这个基础上增加Cuda Core。代表型号为GeForce 400、500、600、GT-630。

3)Kepler(开普勒),2012年发布,这一代 SM 整体结构上跟之前是一致的,只不过升级完了以后又往里面塞进去了更多的运算单元(包含双精度计算单元),其他部分也没有做太大的改动。代表型号为Tesla K40/K80, GeForce 700, GT-730。

4)Maxwell(麦克斯韦),2014年发布,工艺和频率的提升,Maxwell 每个 CUDA Core 的性能相比 Kepler 提升了 1.4 倍,每瓦性能提升了 2 倍,简化了SM的结构,移除了增加的双精度单元。代表型号为Tesla/Quadro M系列 GeForce 900、GTX-970。

5)Pascal(帕斯卡),2016年发布,进军深度学习方向,在SM内部,除了以往支持单精度的FP32 Cuda Core,双精度的DP Unit(FP64的Cuda Core)。一个SM由64个FP32 Cuda Cores和32个 FP64 Cuda Cores(DP Unit)组成,此外,FP32 Cuda Core也具备处理半精度FP16的能力,以满足当时行业开始对低精度计算的需求。NVLink 1.0问世。代表型号为Tesla P100,GTX 1080, GTX 1070, GTX 1060

6)Volta(伏特),2017年发布,全面转向深度学习,并专门增加了张量核Tensor Core模块。SM在FP64 Cuda Cores和FP32 Cuda Core基础上增加了INT32 Cuda Core。算力相比于Pascal架构快了5倍。Nvlink 2.0发布。代表型号为Tesla V100, GTX 1180。

7)Turing(图灵),2018年发布,对Tensor Core进行了升级,增加了对INT8、INT4、Binary(INT1)的计算能力,性能翻倍。代表型号为T4,GTX 1660 Ti,RTX 2060。

8)Ampere(安培),2020年发布,Tensor Core再升级,nvlink升级到3.0.“超级核弹”A100,就是采用该架构,拥有6912个CUDA核心和432个张量核心。除此之外,消费显卡王者RTX 3090也是其代表显卡。

9)Hopper(赫柏),2022年3月发布,引入了transformer引擎,Tensor Core 能够应用混合的 FP8 和 FP16 精度,以大幅加速 Transformer 模型的 AI 计算。与上一代相比,Hopper 还将 TF32、FP64、FP16 和 INT8 精度的每秒浮点运算 (FLOPS) 提高了 3 倍。nvlink升级到4.0。代表显卡H100。

10)Ada Lovelace(阿达·洛夫莱斯),2022年10月发布,第三代RT core,tensor core再升级,专为深度学习矩阵乘法和累加数学运算而设计,可加速更多数据类型,并支持细粒度结构化稀疏,可将张量矩阵运算的吞吐量提升至前一代产品的 2 倍以上。基于 该架构 的 CUDA 核心能够以两倍的速度处理单精度浮点 (FP32) 运算。代表显卡RTX 4090。

picture.image

Cuda核/Tensor核

Cuda核心和Tensor核心都是GPU内部的计算单元,即流处理器(SP),它们的多少代表了gpu并行计算的能力。Cuda这个名字在英伟达涉及到多个概念,其中Cuda核心是其物理的流处理器器,它和Cuda软件的版本有一定的匹配,因此,需要基于芯片架构匹配相应的Cuda软件版本。Cuda算力代号描述显卡在不同架构下gpu的计算能力。由架构代号+小型号增量能力构成,比如7.x代表图灵架构,下面是对照表。

picture.image

这个算力代号与Cuda版本有一定对应关系,支持的Cuda算力是与安装的Cuda的版本有关的,Cuda 10.2 仅仅支持 3.7,5.0,6.0,7.0算力,不支持8.0算力。而Cuda 11是支持8.0算力的。因此在安装Pytorch时需要注意cuda版本及对应的gpu算力版本。

picture.image

Tensor核心是专门为深度学习等大规模并行计算设计的,在2017年Volta(伏特)架构引入,可实现混合精度计算,并能根据精度的降低动态调整算力,在保持准确性的同时提高吞吐量,它能够高效的进行矩阵乘法。

在CUDA内核,在每一个GPU时钟只能执行一次单值乘法:


        
            

          1 x 1 per GPU clock
        
      

而Tensor核心,在每一个GPU时钟可以执行一次矩阵乘法,也就是说在一个tensor核可以同时执行多次cuda核等价的计算。


          
[1 1 1       [1 1 1
          
 1 1 1   x    1 1 1    per GPU clock
          
 1 1 1]       1 1 1]
      

picture.image

而矩阵乘法在深度学习中大量存在,也是最耗时的部分,因此tensor核非常重要,如果一个GPU不支持tensor核那基本上就不适合应用于深度学习。

picture.image

另一方面,结合深度学习场景,在计算精度上,大多数情况下我们并不需要 FP32,FP16 便可以很好地表示大多数权重和梯度,因此动态采用混合精度计算是计算准确性和吞吐量的一个平衡,低精度显然可以让数学计算变的更快快,在tensor核上会加速更明显,可以减少显存使用,从而能够训练部署更大的 神经网络。减少内存带宽占用,从而加快数据传输速度转移操作。在后面的Turing架构下,第二代TensorCore,可以进行多精度的计算(从 FP32 到 FP16 再到 INT8 和 INT4),进一步提高了训练和推理的性能。

picture.image

更多参考:https://www.nvidia.cn/data-center/tensor-cores/

显存带宽与位宽

显存带宽(Memory Bandwidth),是指计算单元cuda核心或者tensor核构成的流多处理器器(SM)与显存之间的数据传输速率。有如下计算公式:

显存带宽= 显存数据频率 * 显存位宽(显卡瞬间处理数据的吞吐量) / 8

显存位宽 ,是指一个时钟周期内所能传送数据的位数,位数越大则瞬间所 能传输的数据量越大,可以类比于公路的车道宽度,双向四车道、双向六车道,当然车道越多一次能通过的汽车就越大。根据公式可知,在显存频率相当的情况下,显存位宽将决定显存带宽的大小 ,常见显存位宽有128位、192位、256位、384位、512位和1024位六种。而显存位宽大小受显存规格的约束。

显存规格 ,是指生产显存的材料规格,有DDR、GDDR、HBM等,其中HBM(High Bandwidth Memory),即高带宽存储器,是一种面向需要极高吞吐量的数据密集型应用程序的DRAM,可以用于生产高位宽显存,性能更佳,但也更贵。最新的HBM3的带宽最高可以达到819 GB/s,而最新的GDDR6的带宽最高只有96GB/s,CPU和硬件处理单元的常用外挂存储设备DDR4的带宽更是只有HBM的1/10。

GPU的计算单元(流处理器)计算速度非常快,这个和CPU和内存关系一样,大多数时候计算单元都在等数据到达。前面可以知道GPU中包含大量的并行计算核心,在某种意义上,显存带宽是计算快慢的关键。这一点又和CPU存在一定差异,CPU的缓存一般都比较小,而较大显存带宽的 GPU 允许你在设置较大的 batch_size,也就是你可以同时拿出来较多的数据来一起训练。

有人拿法拉利和卡车车队运送货物来对比CPU和GPU解释为什么GPU在矩阵乘法和卷积计算过程中效率更高,虽然法拉利速度很快,但容量有限,只能频繁多次,而大卡车一次性可以载货很多,尽管频率比较低,单次法拉利很快,但总的搬运效率却更高。再加上他能组成一个车队,这样就能充分的利用并行性,避免中间的等待。

因此,性能的关键在于带宽的大小,GPU寄存器的总大小是CPU的 30多倍,而速度是CPU的两倍,这意味着高达14MB的寄存器内存可以以高达80TB/s的速度运行。相比之下,CPU L1缓存的运行速度仅为5TB/s,相当缓慢,其大小约为1MB;CPU寄存器的大小通常约为64-128KB,运行速度为10-20TB/s。另一方面,也说明显存带宽是计算效率的关键瓶颈。例如,在GPT-3大小的训练中,使用超大的矩阵(对Cuda核心来说越大越好),张量核心TFLOPS利用率也仅约为45-65%,这意味着即使是大型神经网络,也有50%的时间张量核心是空闲的。 这意味着,当比较两个带有Tensor Cores的GPU时,每个GPU性能的最佳指标之一是其内存带宽。例如,A100 GPU的内存带宽为1,555 GB/s,而V100为900 GB/s。因此,A100对V100的基本估计速度是1555/900=1.73倍。

显存容量

显存容量即显示卡上显示内存的容量,显存容量决定着显存临时存储数据的多少。比较好理解,模型越来越大,他的大小决定了一个大模型是否能够在一张卡中加载,以及批次训练的大小,进而影响处理数据及训练的效率。因此,显存容量越大自然越好,比如A100就达到了80GB,对于深度学习来讲:

4GB:我认为这是绝对的最小值,只要你不是在处理过于复杂的模型,或者大的图像、视频或音频,这个在大多数情况下能工作,但是达不到日常使用的需要。如果你刚刚起步,想尝试一下又不想全力投入,那么可以从它开始

8GB:这是一个日 常学习很好的开始,可以在不超过RAM限制的情况下完成大多数任务,但在使用更复杂的图像、视频或音频模型时会遇到问题。

12GB:我认为这是科研最基本的的要求。可以处理大多数较大的模型,甚至是那些处理图像、视频或音频的模型。

12GB+ :越多越好,你将能够处理更大的数据集和更大的批处理大小。超过12GB才是价格真正开始上涨的开始。

结合刚才计算单元的特性来考虑,如果成本相同的话,选择“速度较慢”但内存较大的卡会更好。GPU的优势是高吞吐量,这在很大程度上依赖于可用的RAM来通过GPU传输数据。

计算精度性能

GPU一般在不同精度计算上有不同的指标。如图:

picture.image

以TFLOPS为单位,越大越好,对于深度学习来说,单精度,半精度即混合精度计算为主,而双精度一般在 HPC 应用中常见,基本上可以忽略。由于计算精度性能通常不是计算瓶颈下来,所以优先级较低。

GPU-GPU 带宽

即GPU与GPU之间数据传输的速率,这个是计算在多卡情况下需要关注,前面提到的Nvlink技术就是为了突破PCI-e 的带宽限制而产生的。但通常来讲,gpu不多(>128)的情况下,这种限制基本可以忽略,但对于用于训练大模型的超大计算集群,这一因素就需要考虑。

挑选结论

前面介绍了GPU的方方面面,最后到了实际选择的时候。我们对英伟达相关主流产品做一个汇总,可以直观的看到刚才提到的相关参数,结合参数解析,能够大体识别其性能情况,可以看到尽管Geforce产品计算核心虽多,但是位宽和显存较小,最后表现在深度学习层面与Tesla系列存在一定的差距。

picture.image

picture.image

国外有人做过一些实际评测,下面是所有GPU的原始相关性能图表。我们可以看到,H100 GPU的8位性能与针对16位性能进行优化的旧显卡存在巨大优势。

picture.image

再结合售价来看,RTX系列产品性价比更高。下图是所有GPU的每美元性能图表,按照8位推理性能排序。

picture.image

下图是一个结合场景,选择GPU的指引图。基本逻辑为,如果是数据中心为了训练大模型,不差钱就应该选择Telsa系列的标杆A100或者H100,而预算不足的话,模型规模不大,学习使用,可以采购Geforce系列代替。

picture.image

最后,我们可以看看实际报价。京东A100价格达到了11万(无货),其替代品A800达到了12万一张,最新架构的Geforce RTX 4090报价1万4。

picture.image

picture.image

picture.image

结语

买到合适的GPU是我们进行大模型学习或者投产的第一步,了解GPU的原理及特性,也是为我们后续软件推理优化打基础。这也是我们花大篇幅介绍GPU的原因。

但由于其不便宜的价格和机器原因(比如Mac)在深度学习场景,不一定拥有英伟达显卡。那应该怎么办呢?两种方式可选择:1)采用云厂商资源,比如google colab就提供GPU资源可以使用,按量付费,2)后面内容将会介绍,基于一些模型推理优化技术,也能让CPU或者其他GPU也能跑大模型。

最后,总结GPU有两个最大特点,就是它非常适合深度学习,特别是在训练大模型的场景。另一个特点就是非常的昂贵。因此,如何有效的利用好它,发挥它的最大效用,是大模型工程化的一个重要命题。

未完待续,一般来讲,硬件设备是固定的,那么,如何在软件层面优化推理性能,就是一个开发者需要重点关注的。下一节将探讨模型推理速度和资源占用与模型参数大小和运算量的关系。

阅读至此了,分享、点赞、在看三选一吧🙏

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 GPU Scale-up 互联技术白皮书
近日,字节跳动正式发布基于以太网极致优化的 GPU Scale-up 互联技术白皮书,推出 EthLink 的创新网络方案,旨在为 AI 集群提供低延迟、高带宽的高速互联传输,满足 AI 应用对 GPU 之间高效通信的需求。这一举措标志着字节跳动在 AI 基础设施领域的突破,有望推动通用人工智能(AGI)和大语言模型(LLM)的进一步发展。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论