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


200 cycle(全局内存)+ 20 cycle(共享内存)+ 1 cycle(Tensor Core)= 221 cycle
因此,我们通过张量核将矩阵乘法的开销从 392 个 cycle 大幅降低到 221 个 cycle 。在这种情况下,张量核降低了共享内存访问和 FFMA 操作的成本 。
在这个例子中,有和没有张量核都大致遵循相同的计算步骤,请注意,这是一个非常简化的例子 。在实际情况下,矩阵乘法涉及到更大的共享内存块,计算模式也稍微不同 。
不过我相信,通过这个例子,我就很清楚为什么内存带宽对于配备张量核的 GPU 来说如此重要 。在使用张量核进行矩阵乘法时,全局内存是 cycle 开销中最重要的部分,如果可以降低全局内存延迟,我们甚至可以拥有速度更快的 GPU 。要做到这一点,我们可以通过增加内存的时钟频率(增加每秒 cycle 数,但也会增加发热和电量消耗)或增加每次可以转移的元素数量(总线宽度) 。
内存带宽从上一节我们已经看到,张量核非常快 。事实上,它们大部分时间都是空闲的,因为需要等待数据从全局内存读到共享内存 。例如,在 BERT 大型训练中,它使用非常大的矩阵——对于张量核来说,越大越好——我们的 Tensor Core TFLOPS 利用率大约为 30%,也就是说,70% 的时间张量核都是空闲的 。
这意味着,当比较两个具有张量核的 GPU 时,GPU 性能的最佳指标之一就是它们的内存带宽 。例如,A100 GPU 的内存带宽为 1555 GB/s,而 V100 的是 900 GB/s 。因此,基本可以估计 A100 的速度是 V100 的 1555/900 = 1.73 倍 。
共享内存 / L1 缓存大小 / 寄存器由于内存传输到张量核是性能的限制因素,所以我们正在寻找其他可以提升内存到张量核传输速度的 GPU 属性 。这和共享内存、L1 缓存以及使用的寄存器数量有关 。理解存储层次结构如何带来更快的内存传输,有助于理解矩阵乘法在 GPU 上如何执行 。
为了执行矩阵乘法,我们利用了 GPU 的存储层次结构,从慢的全局内存到快的本地共享内存,再到快如闪电的寄存器 。然而,越快的存储越小 。因此,我们需要将矩阵分割成更小的矩阵,并在本地共享内存中通过这些更小的块执行矩阵乘法,它们速度快,并且接近于串流多处理器(SM)——相当于 CPU 内核 。对于张量核,我们更进一步:我们取每个块并将其中的一部分装入张量核中 。共享内存中的矩阵 memory tile 比 GPU 全局内存快大约 10-50 倍,而张量核的寄存器比 GPU 全局内存快 200 倍 。
拥有更大的 tile 意味着我们可以重用更多的内存 。我在博文 TPU vs GPU 中详细探讨了这个问题 。实际上,你可以将 TPU 看作是每个张量核都有非常非常大的 tile 。因此,TPU 在每次从全局内存传输数据时都可以重用更多的内存,这使得它们在矩阵乘法计算方面比 GPU 更有效率 。
每个块的大小是由每个串流多处理器(SM,相当于 GPU 上的一个“CPU 内核”)的内存大小决定的 。在以下架构中,我们有以下共享内存大小:
  • Volta:96kb 共享内存 / 32 kb L1
  • Turing:64kb 共享内存 / 32 kb L1
  • Ampere:164kb 共享内存 / 32 kb L1
我们看到,Ampere 的共享内存更大,块大小就更大,这减少了全局内存访问延迟 。因此,Ampere 可以更好地利用 GPU 存储的总体内存带宽 。这将提高大约 2-5% 的性能 。对于大型矩阵,性能的提升尤其明显 。
Ampere 张量核的另一个优点是它们在线程之间共享更多的数据 。这减少了寄存器的使用 。寄存器被限制为每个串流多处理器(SM)64k 或每个线程 255 。比较 Volta 和 Ampere 张量核,Ampere 张量核使用 1/3 的寄存器,允许更多张量核在共享内存的每个块上活动 。换句话说,我们可以用相同数量的寄存器支撑 3 倍的张量核 。然而,由于带宽仍然是瓶颈,所以实际的 TFLOPS 与理论的 TFLOPS 相比,只会有微小的提高 。新的张量核提高了大约 1-3% 的性能 。
总的来说,我们可以看到,Ampere 的架构经过优化,它使用改进后的存储层次结构(从全局内存到共享内存块,再到张量核寄存器),使可用内存带宽更加有效 。
评估 Ampere 的深度学习性能要点: