GPU学习(一)- 基础知识
GPU学习(一)- 基础知识
随着人工智能和高性能计算的快速发展,GPU(图形处理器)已成为现代计算的重要组成部分。本文将从基础知识到高级应用,全面介绍GPU的核心概念、技术细节和应用场景,帮助读者深入了解这一关键技术。
CPU和GPU区别
CPU 和 GPU 设计目标不同,因此架构上有很大的差异。
- GPU作为中央处理器,有逻辑单元来进行逻辑判断和多分支跳转,有总线接口来对接多种硬件设备、有寄存器来保存临时指令和数据。这些都使得CPU有大部分体积被占用,留给CPU计算核心的空间很小。并且CPU的计算核心需要的是通用性(处理各种不同的数据类型),从设计上没有对特定类型计算进行优化。
- GPU计算时不会被中断打断。GPU只有很简单的控制单元,其内部的缓存内存结构也较CPU简单,大部分空间都被计算单元占用,可以有上万个计算核心。
GPU可以加速AI模型训练的原因有以下几点:
- GPU拥有大量的计算处理核心。AI模型训练可以被分解为大量的小型计算任务,这些计算任务可以被GPU的大量核心并行执行,可以大大加速深度学习模型的训练和推理。
- GPU面对的是类型高度统一的数据,GPU的核心从设计上更擅长于浮点运算和矩阵计算,因此GPU比CPU更适合处理深度学习模型中的计算任务。
- GPU拥有较多的高带宽内存,可以高效地读取和写入大量的数据,加速大模型的训练速度。
NVIDIA的产品系列和架构发展
产品系列
目前按照应用领域分为三个系列:
- GeForce消费级卡:面向游戏领域。 如 GeForce 4060
- Quadro专业级卡:面向专业艺术设计和VR AR视频渲染。 如 Nvidia A6000
- Tesla数据中心级卡:面向深度学习人工智能领域 和 高性能计算领域。 如 Nvidia A100
架构发展
NVIDIA GPU 架构都是以物理学家命名,近期架构变迁和主力产品如下:
GPU架构变迁和主流产品
英伟达官网只能找到较新的GPU卡数据,无法查看较早型号卡的性能指标。www.techpowerup.com/gpu-specs 网站提供各型GPU卡的信息,可以查到旧卡的数据。
从单卡角度了解GPU
核心
GPU中的核心(Core)根据用途可以分为三类:
- CUDA Core 通用计算核心:NVIDIA GPU架构中是最常见的计算单元,专门用于处理通用计算任务。CUDA是NVIDIA的并行计算平台和编程模型的名称,允许开发人员利用GPU的并行处理能力来加速计算密集型应用。
- Tensor Core 张量运算核心:出现在Volta架构之后NVIDIA GPU中。Tensor Core 非常适合进行大规模的矩阵乘法和累加操作,这种计算是深度学习算法中常用的。Tensor Core奠定了英伟达在AI训练的领军地位。
- RT Core 光线跟踪核心:能够高效处理与光线跟踪相关的任务,模拟真实场景中的光影效果,在游戏和电影画面渲染中广泛使用。RT Core 占用体积较大,在H100 A100 等数据中心系列的卡中是没有RT Core的。
算力
算力即计算能力。不同类型的核心有各自擅长计算的数据类型。
常见的算力指标如下:
- 双精度浮点算力(FP64):衡量GPU每秒执行64位浮点运算的能力,双精度算力对于科学计算和工程仿真等需要高度数值精度的任务非常重要。
- 单精度浮点算力(FP32):这是评估GPU性能时最常见的指标之一,它衡量的是GPU每秒可以执行的32位浮点运算次数,通常以TFLOPS(万亿次每秒)表示。在深度学习和大多数AI应用中,单精度浮点计算通常足够。
- 混合精度算力(TF32):是 Nvidia 在 Ampere 架构的 GPU 上推出的用于 TensorCore 的数据格式。TF32 具有与 FP32 相同的数值范围 和 与 FP16 相同的数值精度。能极大提升AI和机器学习工作负载的性能。
- 整数算力(INT8 和 INT4 ):这对于某些AI推理任务来说非常重要,因为在这些任务中,模型可以通过量化到更低位宽来降低计算耗时,实现快速响应。
上述算力指标中的FP是(Floating-point operations per second)每秒浮点运算次数,简写为FP,是算力的基础单位。
需要注意的是,不同的神经网络架构和学习任务对上述指标的需求各不相同,因此,必须根据特定的用例要求来选择合适的GPU型号。
显存
显存规格
显存规格有两种:HBM(High Bandwidth Memory)和 GDDR(Graphics Double Data Rate Memory)。 GDDR 长期以来一直是 GPU 显存的标准选择,当前一般为GDDR5。 HBM 配置在一些专业和高端显卡上来实现更高的带宽和更低的功耗。现在 NVIDIA 的 企业级GPU都使用了HBM2。
显存大小
显存的大小直接决定了可以在GPU上加载的模型的大小。更大的模型(有更多的参数和层)需要更多的显存来存储权重,激活值和梯度。如果显存不足,就无法训练大型模型。
除了模型大小,批处理(Batch Size)大小也是GPU训练时非常重要的因素。较大的批处理可以提高模型训练的并行度和稳定性,通常还能加快收敛速度。更大的显存容量可以支持更大的Batch Size,从而加快训练过程。
拓展互联能力
AI大模型训练需要多张GPU卡协作完成分布式计算,影响GPU卡间传输效率的不仅是GPU的通信带宽上限,还和卡之间连接方式有关系,当前GPU间的连接方式有PCIE和NVLink两种。
标准的GPU服务器GPU之间通过PCIE链路互联,受限于PCIE的协议速率,以PCIE 5.0为例,一张GPU为PCIE x 16,双向互联带宽仅为128GB/s,远低于NVLink的900GB/s。
PCIE 和 NVLink 性能对比
NVIDIA的NVLink技术是一种高速互连协议,用于在多GPU间提升数据传输效率。
NVLink官网说明
随着技术的进化,NVLink每个版本都提升了带宽能力和链路数。
NVLink 的版本变迁
体积
通常用 长 宽 高 形容GPU卡的尺寸,以下是具体数据:
- 双宽全长全高GPU卡:280×125×40mm(长x高x宽)
- 单宽半长半高GPU卡:169×68.9×20mm(长x高x宽)
在组装GPU服务器时需特别注意卡的宽度和服务器机箱空间。
主流显卡型号和适用场景
目前Hopper架构卡较难购买,下面列举Ampere架构GPU的型号和用途。
Ampere架构的主流卡和适用场景
此外,A800是出售大陆市场的一款阉割型号,其实用性还是挺好的。A800只阉割了多卡带宽,在单卡使用时几乎无性能阉割。目前A800已经停产。
从GPU服务器整机角度
GPU服务器类型
左图GPU通过PCIE互联 右图GPU间通过NVLink互联
若购买PCIE型GPU服务器,需要检查服务器主板上是否有足够的x16的PCIE接口。尽量不要让GPU接入8通道的PCIE。8通道相比16通道减少了很多传输性能。
我们已经知道了NVLink技术能加速GPU间的通信速度。但英伟达没有开源NVLink技术,所以NVLink互联的多GPU硬件模组就只能是英伟达自己来生产了,这个模组就叫HGX。
图中灰色部分8个GPU卡 和 4个NVLink Switch芯片 即为HGX模组
HGX模组实物
HGX对外暴露的接口叫SXM接口,所以使用NVLink进行8卡互联的服务器,即被叫做NVLink服务器,也被叫做HGX服务器,还被叫做SXM服务器。
SXM型服务器都是基于NVIDIA 的 HGX 来做的,服务器厂商只需兼容HGX就可以生产SXM型GPU服务器了。
既然英伟达已经把难度最大的HGX模组生产了,英伟达为何不直接生产GPU服务器呢?于是NVIDIA给HGX模组搭配了高端CPU、高端电源、高端散热、还预装了转为AI训练的优化过的操作系统。英伟达的这个GPU服务器主机叫DGX。DGX是目前性能最好的GPU服务器,是成熟的企业端到企业端的集成解决方案。(唯一缺点价格贼贵)
这里的概念有点多,我再总结一下:DGX是英伟达生产的实体GPU服务器主机名,DGX中使用了HGX模组,HGX模组中包含8个GPU卡,NVSiwtch芯片是辅助实现8张卡nvlink全互联的芯片。
双路CPU服务器
在GPU服务器做AI模型训练时,CPU仍然可能影响到整体性能,目前市场上出售的GPU服务器都是双路服务器。
- 数据预处理:在训练开始前,需要对数据进行预处理,这部分工作一般由CPU完成。CPU的处理能力会影响到数据预处理的速度,如果CPU处理速度不够快,可能会使得GPU在等待新的数据输入时处于闲置状态。
- 输入/输出(I/O)限制:AI模型训练中涉及大量的数据读写,如果CPU无法高效地处理这些I/O任务,可能会导致GPU等待数据而闲置。
除了训练之外,一些额外的任务,比如模型的保存、日志记录等,也需要CPU资源,尽管这部分工作相对不是很计算密集。
GPU虚拟化
非虚拟化的GPU架构
在没有使用虚拟化技术时,使用GPU的整体架构如下图:
典型GPU使用架构
GPU虚拟化的实现方式
GPU虚拟化是指:把1个实体GPU卡虚拟成多个卡,在使用者视角是多个卡。
GPU透传没有把1卡变成多卡,不属于虚拟化技术。
GPU虚拟化有如下3种实现方式:
5.2.1 用户层劫持
在APP与Cuda库中加入拦截层,拦截APP对Cuda库的API调用。对APP的调用函数和参数做解析,进行相应的修改,最后使用修改后的内容请求真实Cuda库。这种方式要修改运行环境,做代码重新编译。
用户层劫持
5.2.2 内核层劫持(通常是在容器场景中使用)
Cuda库是通过设备文件访问底层设备驱动的。在没有拦截驱动(虚拟化)的时候,底层库通过访问驱动生成的正常设备文件,来访问驱动。 为了拦截(虚拟化),使用一套假的设备文件用于拦截,这些设备文件挂载到容器中。即容器中看到的不是真的设备文件。同时在内核中添加拦截模块,用于处理修改假系统调用。这样APP -> Cuda库 -> 假设备文件 -> 内核拦截模块做算力显存的限制。
内核层劫持
5.2.3 硬件层分割
因为是硬件的方案,所以只有 NVIDIA 公司能做了。
Nvidia MIG 方案:因为GPU有很大的显存,上万个Cuda Core,他就在物理层面把这个资源做分割了。显存 + Core = Instance。于是上1个GPU变成了N个实例,每个实例都有自己独立的资源和错误隔离机制,可以看作为1个单独的小型GPU。而且这种方式的并发是空分复用,利用率更好。
NVIDIA MIG 技术
注意!当前并不是所有的虚拟化技术都同时满足 显存分隔、算力分隔、故障域分隔。
其中最优的是MIG方案。
Kubernetes中的GPU虚拟化
目前各大主流云厂商的托管Kubernetes都提供了GPU虚拟化能力,各大云厂商的虚拟化方案均为内核层劫持。
内核层劫持的特点是使用假的GPU设备文件,可以通过 state /dev/nvidia0 命令,命令返回的 Inode 是文件系统中用于代表该文件或设备的唯一编号,可用此判断Pod中的GPU设备与宿主机上的GPU设备是否相同。
进行验证:
在华为云CCE中创建GPU主机,在节点上查看GPU信息
在华为云CCE中创建Pod,使用整张GPU卡,在Pod内查看GPU信息
在华为云CCE中创建Pod,使用0.5张GPU卡,在Pod内查看GPU信息
GPU虚拟化的性能损耗 和 笔者看法
GPU虚拟化技术本质是共享同一物理GPU卡的计算资源。在GPU虚拟化中,“空分”和“时分”是两种不同的资源共享方法:
- 空分: 空间分割,意味着物理GPU的资源(如核心,内存等)被划分为几部分,每一部分可以被一个虚拟机(容器)专用。每个虚拟机负责自己那一部分的资源,并与其他虚拟机隔离。这种方法的好处是可以为每个虚拟机提供较为确定的性能和隔离性。
- 时分:时间分割,是指所有虚拟机交替使用整个GPU的全部资源。物理GPU的控制权(使用权)会周期性地在虚拟机(容器)之间切换。时分的优点是资源利用率高,缺点是可能会有更高的上下文切换开销,较难实现不同虚拟机(容器)间的故障隔离。
时分 VS 空分
如今实现空分的只有英伟达的MIG方案。MIG同时适合虚拟机和容器环境,所以说MIG是最强的虚拟化方案。
笔者认为时分的虚拟化技术很鸡肋,它不但引入额外的复杂性和性能损耗,还会引入故障安全隔离隐患。在大模型训练时几乎不会这么用。