GPU选购指南:训练ML模型,我必须买RTX3080吗?(14)


当我们将网络在更多的 GPU 上并行化时,由于一些网络开销,我们会损失性能 。与 V100 8x GPU 系统(NVLink 2.0)相比,A100 8x GPU 系统有更好的网络(NVLink 3.0)——这是另一个令人困惑的因素 。直接查看 NVIDIA 的数据,我们可以发现,对于 CNN 来说,8x A100 系统比 8x V100 系统开销低 5% 。这意味着,从 1x A100 到 8xA100 可以获得 7 倍的速度提升,而从 1x V100 到 8xA100 可以获得 6.67 倍 。对于 Transformer 来说,这个数值是 7% 。
使用这些数据,我们可以从 NVIDIA 提供的直接数据中估算其对于一些特定深度学习架构的速度提升 。与 Tesla V100 相比,Tesla A100 可以提供以下速度提升:

  • SE-ResNeXt101:1.43 倍
  • Masked-R-CNN:1.47 倍
  • Transformer(12 层, 机器翻译, WMT14 en-de):1.70 倍
因此,对于计算机视觉来说,这些数值比理论估计要低一些 。这可能是由于张量维数较小,准备矩阵乘法(如 img2col 或快速傅里叶变换(FFT))所需的操作开销,或者操作无法充分利用 GPU(最后的层通常相对较小) 。它也可以是特定架构的工件(分组卷积) 。
Transformer 实际估计值与理论估计值非常接近 。这可能是因为大型矩阵的算法非常简单 。我将使用这些实际的估计来计算 GPU 的成本效率 。
估计中可能存在的偏差上面是对 A100 和 V100 的对比估计 。过去,NVIDIA“游戏”GPU RTX 出现了性能偷偷下降的问题:(1)降低张量核利用率,(2)风扇散热,(3)禁用对等 GPU 传输 。与 Ampere A100 相比,RT 30 系列可能有未公布的性能下降 。有了消息,我会更新这篇博文 。
Ampere / RTX 30 系列的其他考虑因素要点:
  • Ampere 可以用于稀疏网络训练,它最高可以将训练速度提高 2 倍 。
  • 稀疏网络训练仍然很少使用,但将使 Ampere 可以经受住未来的考验 。
  • Ampere 有新的低精度数据类型,这使得使用低精度数值更容易,但不一定比以前的 GPU 更快 。
  • 新的风扇设计非常棒,如果你的 GPU 之间有间隙的话,但不清楚如果多个 GPU 之间没有间隙,它们是否能有效冷却 。
  • RTX3090 的 3 插槽设计使得 4x GPU 构建成为问题 。可能的解决方案是 2 插槽转换或使用 PCIe 扩展器 。
  • 4x RTX 3090 需要的电量比目前市场上任何标准电源单元所能提供的电量都多 。
与 NVIDIA Turing RTX 20 系列相比,新的 NVIDIA Ampere RTX30 系列具有额外的优点,如稀疏网络训练和推理 。其他特性,比如新的数据类型,更多的是易用性特性,因为它们提供了和 Turing 一样的性能提升,但是不需要任何额外的编程 。
稀疏网络训练Ampere 可以以稠密矩阵的速度进行细粒度结构自动稀疏矩阵乘法 。它的工作原理是,如果有一个矩阵,你把它分割成 4 个元素,现在,稀疏矩阵张量核特性允许这 4 个元素中的 2 个为零 。这就带来了 2 倍的速度提升,因为矩阵乘法的带宽需求减半了 。
我以前研究过稀疏网络训练 。对于我的工作,有一种批评是“你减少了网络所需的FLOPS,但却没能带来速度的提升,因为GPU 不能做快速稀疏矩阵乘法 。”那好吧,加上张量核的稀疏矩阵乘法特性,我的算法,或者其他的稀疏训练算法,现在在实际的训练中提供了2 倍的速度提升 。
虽然这个特性还在实验阶段,训练稀疏网络还不是很普遍,但GPU 拥有这个特性意味着你已经为未来的稀疏训练做好了准备 。
低精度计算在我之前的工作中,我已经展示过,新数据类型可以提高低精度反向传播的稳定性 。目前,如果你想要实现16 位浮点数(FP16)的稳定反向传播,主要问题是普通FP16 数据类型只支持[-65504,65504] 区间内的数值 。如果梯度超出这个范围,就会变成NaN 值 。为了防止在FP16 训练期间发生这种情况,我们通常会进行损失缩放,即在反向传播之前将损失乘以一个小数值,以防止这种梯度爆炸 。
Brain Float 16 格式(BF16)使用更多的位作为指数,这样,其可能的数值范围与 FP32 相同:[-3*10^38,3*10^38] 。BF16 的精度较低,但梯度精度对学习来说并不是那么重要 。所以 BF16 所做的就是你不再需要做任何损失缩放或者担心梯度迅速膨胀 。因此,我们可以看到使用 BF16 格式时训练稳定性的提高,只是精度稍有降低 。
这意味着:使用 BF16 精度,训练可能比 FP16 精度更稳定,而提供了同等的速度提升 。使用 TF32 精度,可以得到接近 FP32 的稳定性,接近 FP16 的速度提升 。好的方面是,要使用这些数据类型,只需将 FP32 替换为 TF32,将 FP16 替换为 BF16——不需要修改代码!


推荐阅读