最近,曾拿到斯坦福、UCL、CMU、NYU 博士 offer、目前在华盛顿大学读博的知名测评博主 Tim Dettmers 在自己的网站又上线了深度学习领域的 GPU 深度测评,到底谁才是性能和性价比之王?
众所周知,在处理深度学习和神经网络任务时,最好使用 GPU 而不是 CPU 来处理,因为在神经网络方面,即使是一个比较低端的 GPU,性能也会胜过 CPU。
深度学习是一个对计算有着大量需求的领域,从一定程度上来说,GPU 的选择将从根本上决定深度学习的体验。
但问题来了,如何选购合适的 GPU 也是件头疼烧脑的事。
怎么避免踩雷,如何做出性价比高的选择?
曾经拿到过斯坦福、UCL、CMU、NYU、UW 博士 offer、目前在华盛顿大学读博的知名评测博主 Tim Dettmers 就针对深度学习领域需要怎样的 GPU,结合自身经验撰写了万字长文,最后给出了 DL 领域的推荐 GPU。
Tim Dettmers 此人的研究方向是表征学习、硬件优化的深度学习,他自己创建的网站在深度学习和计算机硬件领域也是小有名气。
Tim Dettmers 此文推荐的 GPU 全部来自 N 厂,他显然也认为,搞机器学习,AMD 目前还不配拥有姓名。
原文链接小编也贴在下面啦。
https://timdettmers.com/2023/01/16/which-gpu-for-deep-learning/#GPU_Deep_Learning_Performance_per_Dollar
RTX40 和 30 系的优缺点
与英伟达图灵架构 RTX 20 系列相比,新的英伟达安培架构 RTX 30 系列具有更多优势,如稀疏网络训练和推理。其他功能,如新的数据类型,应更多地被看作是一种易用化功能,因为它们提供了与图灵架构相同的性能提升,但不需要任何额外的编程要求。
Ada RTX 40 系列甚至有更多的进步,比如上面介绍的张量内存加速器(TMA)和 8 位浮点运算(FP8)。与 RTX 30 相比,RTX 40 系列也有类似的电源和温度问题。RTX 40 的电源连接器电缆融化的问题可以通过正确连接电源电缆而轻松避免。
稀疏的网络训练
安培允许在密集的速度下进行细粒度结构的自动稀疏矩阵乘法。这是如何做到的?以一个权重矩阵为例,把它切成 4 个元素的碎片。现在想象这 4 个元素中的 2 个元素为零。图 1 显示了这种情况的样子。
当你将这个稀疏权重矩阵与一些密集输入相乘时,安培的稀疏矩阵张量核心功能会自动将稀疏矩阵压缩为密集表示,其大小为图 2 所示的一半。
在压缩之后,密集压缩的矩阵瓦片被送入张量核心,张量核心计算的矩阵乘法是通常大小的两倍。这有效地产生了 2 倍的速度,因为在共享内存的矩阵乘法过程中,带宽要求减半。
我在研究中致力于稀疏网络训练,我还写了一篇关于稀疏训练的博文。对我的工作的一个批评是:”你减少了网络所需的 FLOPS,但并没有产生速度的提升,因为 GPU 不能进行快速的稀疏矩阵乘法”。
随着 Tensor Cores 的稀疏矩阵乘法功能的增加,我的算法或其他稀疏训练算法,现在实际上在训练期间提供了高达 2 倍的速度。
开发的稀疏训练算法有三个阶段:(1)确定每层的重要性。2) 删除最不重要的权重。3) 提升与每层的重要性成比例的新权重。
虽然这一功能仍处于实验阶段,而且训练稀疏网络还不普遍,但在你的 GPU 上拥有这一功能意味着你已经为稀疏训练的未来做好了准备。
低精度计算
在我的工作中,我之前已经表明,新的数据类型可以提高低精度反向传播期间的稳定性。
目前,如果你想用 16 位浮点数(FP16)进行稳定的反向传播,最大的问题是普通 FP16 数据类型只支持 [-65,504, 65,504] 范围内的数字。如果你的梯度滑过这个范围,你的梯度就会爆炸成 NaN 值。
为了防止在 FP16 训练中出现这种情况,我们通常会进行损失缩放,即在反向传播之前将损失乘以一个小数字,以防止这种梯度爆炸。
Brain Float 16 格式(BF16)对指数使用了更多的比特,这样可能的数字范围与 FP32 相同,BF16 的精度较低,也就是有效数字,但梯度精度对学习来说并不那么重要。
所以 BF16 所做的是,你不再需要做任何损失缩放,也不需要担心梯度会迅速爆炸。因此,我们应该看到,通过使用 BF16 格式,训练的稳定性有所提高,因为精度略有损失。
这对你意味着什么。使用 BF16 精度,训练可能比使用 FP16 精度更稳定,同时提供相同的速度提升。使用 TF32 精度,你可以得到接近 FP32 的稳定性,同时提供接近 FP16 的速度提升。
好的是,要使用这些数据类型,你只需用 TF32 取代 FP32,用 BF16 取代 FP16–不需要修改代码。
不过总的来说,这些新的数据类型可以被看作是懒惰的数据类型,因为你可以通过一些额外的编程努力(适当的损失缩放、初始化、规范化、使用 Apex)来获得旧数据类型的所有好处。
因此,这些数据类型并没有提供速度,而是改善了训练中低精度的使用便利性。
风扇设计和 GPU 温度
虽然 RTX 30 系列的新风扇设计在冷却 GPU 方面表现非常好,但非创始版 GPU 的不同风扇设计可能会出现更多问题。
如果你的 GPU 发热超过 80C,它就会自我节流,减慢其计算速度 / 功率。解决这个问题的办法是使用 PCIe 扩展器,在 GPU 之间创造空间。
用 PCIe 扩展器分散 GPU 对散热非常有效,华盛顿大学的其他博士生和我都使用这种设置,并取得了巨大的成功。它看起来并不漂亮,但它能使你的 GPU 保持凉爽!
下面这套系统已经运行了 4 年,完全没有问题。如果你没有足够的空间在 PCIe 插槽中安装所有的 GPU,也可以这么用。
优雅地解决功耗限制问题
在你的 GPU 上设置一个功率限制是可能的。因此,你将能够以编程方式将 RTX 3090 的功率限制设置为 300W,而不是其标准的 350W。在 4 个 GPU 系统中,这相当于节省了 200W,这可能刚好足够用 1600W PSU 建立一个 4x RTX 3090 系统的可行性。
这还有助于保持 GPU 的冷却。因此,设置功率限制可以同时解决 4x RTX 3080 或 4x RTX 3090 设置的两个主要问题,冷却和电源。对于 4 倍的设置,你仍然需要高效散热风扇的 GPU,但这解决了电源的问题。
你可能会问,「这不会降低 GPU 的速度吗?」 是的,确实会降,但问题是降了多少。
我对图 5 所示的 4x RTX 2080 Ti 系统在不同功率限制下进行了基准测试。我对推理过程中 BERT Large 的 500 个小批次的时间进行了基准测试(不包括 softmax 层)。选择 BERT Large 推理,对 GPU 的压力最大。
我们可以看到,设置功率限制并不严重影响性能。将功率限制在 50W,性能仅下降 7%。
RTX 4090 接头起火问题
有一种误解,认为 RTX 4090 电源线起火是因为被弯折过度了。实际上只有 0.1% 的用户是这个原因,主要问题是电缆没有正确插入。
因此,如果你遵循以下安装说明,使用 RTX 4090 是完全安全的。
1. 如果你使用旧的电缆或旧的 GPU,确保触点没有碎片 / 灰尘。
2.使用电源连接器,并将其插入插座,直到你听到咔嚓一声–这是最重要的部分。
3. 通过从左到右扭动电源线来测试是否合适。电缆不应该移动。
4.目视检查与插座的接触情况,电缆和插座之间无间隙。
H100 和 RTX40 中的 8 位浮点支持
对 8 位浮点(FP8)的支持是 RTX 40 系列和 H100 GPU 的一个巨大优势。
有了 8 位输入,它允许你以两倍的速度加载矩阵乘法的数据,你可以在缓存中存储两倍的矩阵元素,而在 Ada 和 Hopper 架构中,缓存是非常大的,现在有了 FP8 张量核心,你可以为 RTX 4090 获得 0.66 PFLOPS 的计算量。
这比 2007 年世界上最快的超级计算机的全部算力还要高。4 倍于 FP8 计算的 RTX 4090,可与 2010 年世界上最快的超级计算机相媲美。
可以看到,最好的 8 位基线未能提供良好的零点性能。我开发的方法 LLM.int8 ) 可以进行 Int8 矩阵乘法,结果与 16 位基线相同。
但是 Int8 已经被 RTX 30 / A100 / Ampere 这一代 GPU 所支持,为什么 FP8 在 RTX 40 中又是一个大升级呢?FP8 数据类型比 Int8 数据类型要稳定得多,而且很容易在层规范或非线性函数中使用,这在整型数据类型中是很难做到的。
这将使它在训练和推理中的使用变得非常简单明了。我认为这将使 FP8 的训练和推理在几个月后变得相对普遍。
下面你可以看到这篇论文中关于 Float vs Integer 数据类型的一个相关主要结果。我们可以看到,逐个比特,FP4 数据类型比 Int4 数据类型保留了更多的信息,从而提高了 4 个任务的平均 LLM 零点准确性。
GPU 深度学习性能排行
先上一张图来看 GPU 的原始性能排行,看看谁最能打。
我们可以看到 H100 GPU 的 8 位性能与针对 16 位性能优化的旧卡存在巨大差距。
上图显示的是 GPU 的原始相对性能,比如对于 8 位推理,RTX 4090 的性能大约是 H100 SMX 的 0.33 倍。
换句话说,与 RTX 4090 相比,H100 SMX 的 8 位推理速度快三倍。
对于此数据,他没有为旧 GPU 建模 8 位计算。
因为 8 位推理和训练在 Ada / Hopper GPU 上更有效,而张量内存加速器 TMA) 节省了大量寄存器,这些寄存器在 8 位矩阵乘法中非常精确。
Ada / Hopper 也有 FP8 支持,这使得特别是 8 位训练更加有效,在 Hopper / Ada 上,8 位训练性能很可能是 16 位训练性能的 3-4 倍。
对于旧 GPU,旧 GPU 的 Int8 推理性能则接近 16 位推理性能。
每一美元能买到多少算力
那么问题来了,GPU 性能强可是我买不起啊……
针对预算不充足的小伙伴,接下来的图表是他根据各个 GPU 的价格和性能统计的每美元性能排名(Performance per Dollar),侧面反映了 GPU 性价比。
选择一个完成深度学习任务并且符合预算的 GPU,可分为以下几个步骤:
-
首先确定你需要多大的 GPU 内存(至少 12GB 用于图像生成,至少 24GB 用于处理变压器);
-
针对选 8 位还是 16 位(8-bit or 16-bit),建议是能上 16 位就上,8 位在处理复杂编码任务时还是会有困难;
-
根据上图中的指标,找到具有最高相对性能 / 成本的 GPU。
我们可以看到,RTX4070Ti 对于 8 位和 16 位推理的成本效益最高,而 RTX3080 对于 16 位训练的成本效益最高。
虽然这些 GPU 最具成本效益,但他们的内存也是个短板,10GB 和 12GB 的内存可能无法满足所有需求。
但对于刚入坑深度学习的新手来说可能是理想 GPU。
其中一些 GPU 非常适合 Kaggle 竞赛,在 Kaggle 比赛中取得好成绩,工作方法比模型大小更重要,因此许多较小的 GPU 非常适合。
Kaggle 号称是全球最大的数据科学家汇聚的平台,高手云集,同时对萌新也很友好。
如果用作学术研究和服务器运营的最佳 GPU 似乎是 A6000 Ada GPU。
同时 H100 SXM 的性价比也很高,内存大性能强。
个人经验来说,如果我要为公司 / 学术实验室构建一个小型集群,我推荐 66-80% 的 A6000 GPU 和 20-33% 的 H100 SXM GPU。
综合推荐
说了这么多,终于到了 GPU 安利环节。
Tim Dettmers 专门制作了一个「GPU 选购流程图」,预算充足就可以上更高配置,预算不足请参考性价比之选。
这里首先强调一点:无论你选哪款 GPU,首先要确保它的内存能满足你的需求。为此,你要问自己几个问题:
我要拿 GPU 做什么?是拿来参加 Kaggle 比赛、学深度学习、做 CV / NLP 研究还是玩小项目?
预算充足的情况下,可以查看上面的基准测试并选择适合自己的最佳 GPU。
还可以通过在 vast.ai 或 Lambda Cloud 中运行您的问题一段时间来估算所需的 GPU 内存,以便了解它是否能满足你的需求。
如果只是偶尔需要一个 GPU(每隔几天持续几个小时)并且不需要下载和处理大型数据集,那么 vast.ai 或 Lambda Cloud 也能很好地工作。
但是,如果一个月每天都使用 GPU 且使用频率很高(每天 12 小时),云 GPU 通常不是一个好的选择。
参考资料:
-
https://timdettmers.com/2023/01/16/which-gpu-for-deep-learning/#more-6
-
https://timdettmers.com/
本文来自微信公众号:新智元 (ID:AI_era),编辑:Joey David