太阳城网址详细解读GPU的起源及发展席卷全球,推理创新的APP、场景落地越来越多。当训练达到一定阶段,推理必然会形成一个爆发。推理的
最近, LiveVideoStack荣幸地邀请到PPIO的王闻宇老师接受采访。本文将从芯片怪兽垄断式增长和美国“卡脖子”2个热点问题出发。围绕过去、现在、未来三个时间线为大家梳理GPU的起源及其软硬件技术的更迭;同时,深度剖析GPU主流产品的参数和技术发展现状,并结合当前GPU的微架构设计,给出算力工程优化的几个思考和有效解决方案。
PPIO派欧云的联合创始人和CTO王闻宇,2004年就开始做音视频,曾是PPTV 的联合创始人并担任首席架构师一职,主导了P2P、直播、点播、编码等一系列产品。PPTV被出售后,转投车联网公司智能支撑领域。2018年重回音视频领域创办PPIO派欧云,目标在于把对技术以及资源的理解打造成服务,并服务于整个音视频行业以及游戏领域与AI领域。
算力,即计算能力(Computing Power)。更具体来说,算力是通过对信息数据进行处理,实现目标结果输出的计算能力。
最早的算力引擎。是人类的大脑,后来演变成草绳、石头、算筹(一种用于计算的小棍子)、算盘。到了20世纪40年代,世界上第一台数字式电子计算机ENIAC诞生,人类算力正式进入了数字电子时代。再后来,随着半导体技术的出现和发展,我们又进入了芯片时代,芯片成为了算力的主要载体。进入21世纪后,算力再次迎来了巨变,云计算技术出现,算力云化之后,数据中心成为了算力的主要载体。人类的算力规模,开始新的飞跃。
我们通常将目前负责输出算力的芯片,分为通用芯片和专用芯片。专用芯片,主要是指FPGA(可)和ASIC(专用集成电路)。像x86这样的芯片,就是通用芯片。它们能完成的算力任务是多样化的,灵活的,但是功耗更高。
游戏、数字货币挖矿、AI、科学计算等各方面都需要GPU,GPU成为了当下的关键问题。下面我就围绕GPU以及对算力整个行业的思考展开分享。
5月30日的时候,发生了一件重大的事情,5月30日美股交易时段,英伟达市值一天内暴涨超2000亿,冲破1万亿美元大关,英伟达的市值远大于IntelAMD高通,MTK的总和,甚至是其他公司的10倍;再看英伟达公司的PS、PE指标,可以看出综合情况是非常优秀的。
上图所示的卡型至少有一款是AI领域必备的卡型,但是令人遗憾的是,由于美国卡脖子问题再次升级,以上卡型全部被纳入禁售名单。
CPU的定位是通用计算芯片,有强大的调度,管理,协调能力,应用范围广,灵活性最高,善于逻辑控制,串行的运算。
GPU的定位是并行计算芯片,主要是将其中非常复杂的数学和几何计算抽出,变成一个超高密度、能够并行计算的方式。最初专用于图形处理,后渐渐用于高密度通用计算,包括AI计算。
GPU 的发展源于80年代,IBM是GPU理念的创始者,但它并未坚持。所以真正意义上的第一款GPU是英伟达在1999年发布的Geforce 256,并正式提出一个响亮的名字“Graphics Processing Unit”,这就是GPU的来源。从此之后,GPU一直高速发展。
大家常说,GPU的世界就是“两位华人之间的战争”。英伟达的创始人黄仁勋是美籍华人,黄仁勋的外甥侄女苏姿丰是AMD的CEO。也就是说,英伟达与AMD两大巨头企业的CEO是亲戚关系,掌握了全世界最强大的两个GPU。如果再加上TSMC(台积电)也是华人,可以说华人主宰了尖端半导体行业的半壁江山。
上图为GPU发展过程图,可以看出3dfx早期发展迅猛,2000年以不到一亿美金的估值被英伟达收购,ATI是AMD显卡的前身,2006年被AMD收购,所以后期基本为英伟达与AMD双雄争霸。
注意,这个图中似乎少了谁,就是著名的Intel。其实Intel在1998年发布了独立显卡i740,在此之后的23年,就没有再发布过独立GPU,聚焦在做集成显卡,退出了GPU市场,现在看来,这不是明智的战略选择。直到2022年,Intel终于看到AI发展的趋势,才发布了新的独立显卡系列,这就是ARC系列。
GPU早期一般为了3D渲染而设计。从计算机图形学的角度,GPU将三维事件的点阵通过矩阵变化投影到二维平面上,这个过程叫做光栅化,最终在显示器上结果。GPU的能力基本上是顶点处理、光栅化、像素处理等,这个过程包含大量的矩阵计算,刚好利用了GPU的并行性。
2003年,GPGPU(General Purpose computing on GPU)的概念被首次提出来。GPU不再以图形的3D加速为唯一目的,而是能够用于任意并行的通用计算,例如科学计算、数据分析、基因、云游戏、AIGC等。
目前国内有许多做GPU的公司,大部分都投入在GPGPU领域,这些公司都放弃了图形渲染,直接以高密度的并行计算作为发展方向。
第一个用于游戏领域,包括GeForce系列、RTX系列,我们常说的4090就是属于游戏领域的系列;常说的x0y0编号就是GeForce系列。
第二个用于数据中心领域,包括Tesla系列,常提到A100、H100就属于这一系列。英伟达有要求,不允许游戏领域中的GeForce系列进入数据中心。因此英伟达游戏系列的产品在同样芯片、同样算力的情况下,GeForce系列的价格要比Tesla系列低3~5倍。正因为价格相差太大,现在国内做大模型推理、StableDiffussion图形生成等都以4090作为首选的原因;
这是是英伟达的硬件架构变迁图。随着2007年英伟达推出 CUDA 1.0版本,使其旗下所有 GPU 芯片都适应 CUDA 架构:
CUDA生态和价格也是英伟达的最核心竞争力,也是英伟达万亿市值的关键因素之一。英伟达投入了一万以上的工程师在发展这个体系,基本上把人工智能里的大部分场景都做了深度优化。英伟达长期投入CUDA生态建设,为开发者服务,建立好了一系列的开源生态。
RT Core(RT核心)非常关键,实现了现代GPU中的光线最终效果。渲染效果中最重要的是光追,看这张光追低级效果和光追高级效果的对比图,差距非常明显,折射、反射、光影都呈现出很大的差距。
其实现在的手机GPU基本上都带有光追的效果和能力,但是手机的光追效果对比英伟达GeForce 40系列GPU的光追效果差距很大。一份最新的评测将英伟达 4070与高通GEN2进行对比,各个指标综合得出差距为25倍,即使用最好的手机也不可能体验到英伟达 4070渲染出来的效果。这也是云游戏成立的根本逻辑,让玩家在手机上也能体验到强大的GPU渲染所带来的的画质效果。
看看最新的Ada架构,也就是4090这一代,这是完整的管线图,密度相较于之前大大提高,仍然是微架构体系。
另外,和Ada架构GeForce系列平行的是Hopper架构的Tesla系列,也就是传说中的H100/H800,这两个架构的管线大致是相同的,特别说明的是Tensor Core中的内容是完全一样的,所以在Ada架构的4090上也可以很好地发挥Hopper架构AI的特性。但Ada架构与Hopper架构最关键的区别,Ada不知道多卡高速互联,也就是NVLink/NVSwitch这套技术。
英伟达能够成为AI领域中的必选项的其中一个原因涉及到浮点数,浮点数在存储的时候由三个部分组成:符号位、指数位和尾数位。
注意:尾数部分在实际存储时是将小数点前的 1 省略的;指数部分需要做一次偏移,-1加上 127 的偏移变成 126 再进行存储;最前面为符号位置,指的是这个数的正负,0 表示正数,1 表示负数。每个浮点数都是由符号位、指数位和尾数位所构成。
按照计算场景所要求数据精度和表示范围,可以选择不同的浮点数类型。常见的浮点数类型有 64 位的双精度 double(FP64)、32 位的单精度 float(FP32)、16 位的半精度 half、以及四分之一精度的 FP8 等。其中,半精度在指数位和尾数位的分配上又可以细分成:bf16 和 FP16。同样 FP8 也可以细分成 E5M2,E4M3。
●一般来说更少位数的浮点数运算所需要的计算成本也更低,因此选用更小位数的浮点数有利于提升性能降低成本。
●但更少的位数也意味着数据的表示范围和精度的能力会降低,同时也要考虑表示范围和精度之间的平衡,否则会导致数据信息的损失,在推理场景下具体表现为推理的效果会变差。
●另外对于 FP8 这样的新类型,也只有最新的 GPU 硬件上才会支持,而新的硬件也往往比较昂贵。
因此,必须结合实际场景的性能要求、数据值分布以及硬件性价比等多个因素综合考虑才可以选择最佳的浮点类型。不同类型的浮点数在做不同硬件上处理时所带来的性能和成本效果是完全不同的。例如,科学计算往往使用 FP64 与 FP32,对应 C 语言中的 double 与 float。但是在 AI 领域中,特别是推理领域,精度不是最敏感的因素,同时数据的分布也表现为集中在 0 值附近,因此在 AI 领域,在不损失较大效果的前提下采用更少位数的浮点数类型是一个非常不错的优化方案。它可以使得计算量大大减少,提升性能,降低硬件成本。
NVIDIA 率先在 GPU 中引入了通用计算能力,使得开发者能利用 CUDA 编程语言来驱动。这时候 GPU 的核都是CUDA Core。由于一个 GPU 里面有大量的 CUDA Core,使得并行度高的程序获得了极大的并行加速。但是,CUDA Core 在一个时钟周期只能完成一个操作,类似上面的矩阵乘法操作依然需要耗费大量的时间。
GPU 最善于的做的“加乘运算”(GPU中有最常用的矩阵计算,就是先乘后加,也就是FMA)FMA:Z=W*X+b
这是 Tensor Core 性能强劲的示意小视频,他将“加乘运算”并行化了。例如 Pascal 这一架构没有 Tensor Core 的能力,所以输出很慢;但在 Volta 架构中,引入了Tensor Core之后,能够以 12 倍的效率完成加乘的计算。
这代架构对比之前的 Turing 架构(2018年),其 Tensor Core 主要支持了三个新的数据类型,FP64,TF32,和BF16。其中 TF32 没有 32 位,只是阉割了精度尾数,只有 18 位,AI 行业中 TF32 用得并不广泛。但 BF16 就非常关键了,BF16 就是将 FP16 的指数位和精度位做了偏移,正是因为这个偏移使得 BF16 在 AI 训练的展示中范围大大扩大,所以 BF16 也是现在很多 AI 模型所训练的主流选择。
除此之外,还支持了结构化稀疏,稀疏矩阵是在矩阵中大量都为 0(或者接近于0),能够通过硬件快速计算出来的矩阵。Nvida 的 GPU 专门为稀疏矩阵做了优化,使得相同规模的稀疏矩阵的计算速度是稠密矩阵的 2 倍。
千万不要小看这两个特性,我认为这两个特性的支持大大提高了 OpenAI 的发展速度,使得 OpenAI 的 GPT3.5 能够提前一年出现。
这代架构,最突破的变化是,Tenser Core 开始支持 FP8,就是将 FP16 又变小为 FP8,这是在AI领域中都要抢购4090 的原因。相较于 int8,FP8 能够相对容易地实现全链路量化,将其性能提高一倍,成本降低一倍,这是最为重要的一点。
Transformer Engine (TE) 是一个用于在 NVIDIA GPU 上加速 Transformer 模型的库,包括在 Hopper GPU 上使用 8 位浮点(FP8)精度,在训练和推断中提供更好的性能和更低的内存利用率。TE 为主流的 Transformer 架构提供了一系列高度优化的构建块,以及一个类似于自动混合精度的 API,可以与特定框架的代码无缝集成使用。TE 还包括一个与框架无关的C++API,可以与其他深度学习库集成,以实现 Transformer 的 FP8 支持。
这样一来,对于大预言模型的开发者就无需手动写底层基于 tensor core 的算子来使用 fp8 这个新特性,而是可以直接调用 TE 的 API 来组合出 LLM 的推理引擎,极大地简化了开发者的工作量。
FP8 是 FP16 的衍生产物,跟 FP16 类似,只是 FP8 总共使用 8 个比特位来表示一个浮点数。它包含两种编码格式E4M3 与 E5M2。
可见,E4M3 与 E5M2 只是在指数位和尾数位上所分配的尾数有所差别而已。很显然 E4M3 的表示范围要比 E5M2 大,但 E4M3 的精度上不如 E5M2。
●FP8 的指数位和尾数位相较于 FP16/BF16 都会少一些,精度和表示范围的能力上相较于 FP16/BF16 会有所降低;
●但 FP8 的总位数只有 FP16/BF16 的一半,因此计算速度会更快,所需要的显存资源也更少。
由此可以得出这样一个结论:在对于数值表示范围不大且精度要求不高的场景下,用 FP8 代替 FP16/BF16 是完全可行的。
下面的图来自于一篇论文,作者将在 AI 训练场景下将 FP8 与 FP16/BF16 进行了对比。其中,
我们可以看到同一规模的模型下,深色虚线与浅色实线的两条曲线几乎完全重合,这意味着用 FP8 量化的效果和用 FP16/BF16 基本相同。
因此,假如把 FP8 来代替 FP16/BF16,训练和推理的性能至少可以提高一倍,而且效果上没有差异。
●FP8 的值分布呈现非均匀分布,它在绝对值较小的区域比较密集,而在绝对值较大的区域表现为稀疏;
●另外,如果用 INT8 来表示 FP8 的话,会在绝对值较小的区域产生较大损失,而在绝对值较大的区域表现良好。
综上所述,对于0 值附近分布比较稠密,距离 0 值较远的数据比较稀疏的这种数据分布来说,FP8 是最好的。而 AI 领域的模型权重恰恰大概率符合这一特性,因此,用 FP8 来进行量化会比 INT8 的损失要更少。
下图是一个 FP8 和 INT8 量化后效果的具体对比,可以看出原数据经过 INT8 量化后许多 -0.1、-0.001 的数据都被量化为 0 了太阳城APP下载,但用 FP8 量化时,无论是 E5M2、E4M3,这些较少数值的数据基本都被很好地保留了。
上面我们只是理论上说明了 FP8 对于 0 值附近的数值具有很好的精度保留能力。但实际推理过程中激活值线 值附近分布得更加稠密吗?
有学者针对这一问题专门做了验证,如下图,他把模型推理过程中的激活值都提取了出来,分别在第2层、第12层、第24层做了采样。我们可以看到无论是在 attention 阶段还是在 FFN 阶段,各个模型层的激活值都有显著的近似正态分布的性质(当然这里面也会有一些极少量的离群值,这些值可以在具体的量化方案中做特殊的处理)。
激活值在 0 分布较为稠密的特性,正符合了 FP8 的表现能力,这就是 FP8 逐渐成为大家做 AI 的主流的原因,也是 Ada/Hoper 架构受欢迎的主要原因之一。
因此,在 Ada/Hopper 架构上应该优先使用 FP8 量化而非 INT8 量化,因为 FP8 具有 INT8 级别的性能的同时,又减少了量化带来的数据精度损失。
再谈谈稀疏化的加速。稀疏化是什么?图上示意的是一个矩阵,矩阵中有很多0,它会通过行和列之间的交换,最终把数据密度高的地方,拉到这条反斜线。后面无论是加还是乘,都能很快计算出来。
要把左侧中的第一个图变为第三个图,首先要变为第二个图,凡是黑框以内的数据保留,剩余的全部归零,也就是把一些比较暗的线都剪掉了。在处理大矩阵时效率很低,在处理第二个图的矩阵时效率则非常高。这就是一种常见的方案,叫剪枝。
图中的forward属于推理,forward+backward属于训练。可以简单理解,随着上下文越长,剪枝效果越好。如果是因果论的模型(例如laMa模型),在很长的参数下会有20倍的差异,但是在非因果论的模型(例如GM模型),优势会少一些。大家可能见到过一个模型能支持很长的上下文,能够把《哈利波特》一本书读下去,其实并不难,只要用剪枝就能做出一定的效果。
投机采样(Speculative Decoding)是 Google 和 DeepMind 在 2022 年同时发现的大模型推理加速方法。它可以在不损失生成效果前提下,获得 3x 以上的加速比。GPT-4 泄密报告也提到 OpenAI 线上模型推理使用了它。虽然OpenAI 的具体方法保持保密,但谷歌团队已经将其研究成果公之于众,并入选ICML 2023 Oral。这项技术很有可能可能成为未来大型模型推理的标配。
其核心是,用一个比原模型小很多的草稿模型(draft model),来加速原模型的推理。草稿模型一般都会比原模型小很多倍,因此推理速度也是比原模型更快,消耗资源更少,但它有一个缺点,就是推理生产的 token 可能是不对的。
那怎么解决这个问题呢?很简单,解决方案是先让小的草稿模型推理若干的 token,然后再将这些 token 让大模型检验其是否合理。如果合理则继续让小模型接着推理,否则就大模型自行推理。
由于大模型检验小模型的推理结果是可以并行地检查多个 token 的,因此这个过程要比大模型自己一个一个的推 token 要快很多。这也就意味着,只要小模型在多数情况下的推理是正确的,那么整个的推理速度就会很快。
用一个比喻来形容的话,有点像一个教授带着研究生做课题,课题中的一些研究任务直接就交给研究生完成了,但教授会对这些任务的完成情况进行检验,如果有错误教授会再做出修正,这样老师和学生相互配合,这个科研的效率就提升了很多。
目前一些推理框架已经开始支持 投机采样了,如 llama.cpp。也有一些开源模型直接同时提供了原模型和草稿模型,如:Chinese-LLaMA-Alpaca-2。
多卡协同也是当今发展的关键。图上列出了NV测试库里的第二代、第三代、的动画协同技术,可以发现,不同的架构一直在升级,从 Volta 到 Ampere 到 Hopper,总带宽数和 GPU 最大链路数都有所增加。
NVLink 主要用于两卡甚至四卡间的交替互联,但是卡多后则无法使用 NVLink,要用 NVSwitch。
第二个图就是 NVSwtich 的数据,因为它在训练时数据非常大,一个卡的数据存不下来,就必须用卡间通信,卡间带宽是多卡互联技术在大模型训练时会遇到的非常大的瓶颈。
H100比A100强不是因为密度提升,其实就密度本省只有1.2倍的提升;更多是因为微架构的设计。新的Tensor Core提升了2倍,新的Transformer引擎提升了2倍,频率提升1.3倍,总计提升了6倍(在大模型下表现)。因此英伟达的性能不是纯靠密度提升的,是通过架构优化进行的提升。
之后英伟达针对2022年的禁令,推出了降低参数配置的阉割卡,也就著名的A800,H800,主要降低了卡间通行速率,和浮点算力 (FP64,FP32)。
也有人说中国没有,没不能想办法从国外“偷”一台EUV的ASML技术不就行了。我看这太天真了,这种关键技术就别想了。
首先从骨干网角度看,图中标记了“算力”的就是PPIO分布式算力的部署位置,PPIO把算力部署在一些骨干网的大型节点、地市级的IDC
PPIO派欧云的产品架构如图,通过自建和招募的方式,把很多资源集成起来,建立好自己的软件服务,在此之上建立IaaS和PaaS的服务。PPIO派欧云主要覆盖的领域是音视频(CDN/泛CDN)、实时云渲染(包括云游戏)、AI推理,AI小模型的训练场景。