首页 / 资讯中心 / 文章详情

精度提升 GPU 速度: 用精度换取更快的计算和“省得多”的带宽

精度提升 GPU 速度: 用精度换取更快的计算和“省得多”的带宽 ★ FEATURED ARTICLE
概述用精度换取更快的计算和‘省得多’的带宽可以拆成两半用精度换计算把 32 位浮点换成 16 位、8 位甚至 4 位硬件电路更简单同样芯片面积能塞下更多计算单元矩阵乘法吞吐成倍提升。用精度换带宽每个数占的比特数少了搬运同样多的参数需要传输的数据量减半甚至更少内存带宽压力大幅下降加载权重的时间成倍缩短。背后是三重优化叠加硬件电路简化低精度乘法器晶体管更少同样面积放更多运算器存储数据量减少数据位宽减半带宽需求减半缓存能装更多专用加速单元Tensor Core 为低精度矩阵乘重构吞吐远超通用 CUDA Core。机制一硬件因素——位宽越小电路越简单概述浮点运算器的复杂度大致与位宽的平方成正比。FP16 乘法器的晶体管数量约为 FP32 的 1/4。这意味着同样芯片面积FP16 能放4 倍的乘法器FP16 数据只占 FP32 一半的寄存器空间同样 256KB 寄存器文件能存2 倍数据16 位数据总线带宽需求减半同样带宽传2 倍数据FP16 乘法器延迟更低频率可以更高。例子芯片面积与计算单元数量设一块芯片可用于计算单元的面积是 100 mm²。精度单个核心面积可放核心数相对吞吐FP320.1 mm²100/0.1 1000 个1×FP160.05 mm²100/0.05 2000 个2×INT80.025 mm²100/0.025 4000 个4×结论同样面积FP16 能放 2 倍核心INT8 能放 4 倍核心理论吞吐相应翻倍。机制二内存带宽节省——数据量减少 50%概述低精度下同样参数量的模型占用内存更少。以 GPT-3 175B 参数为例精度模型大小每层激活缓存反向梯度FP32700 GB16 GB16 GBBF16/FP16350 GB8 GB8 GB数据量减半带宽需求减半。例子加载权重的带宽时间设 HBM2e 带宽为 2 TB/s。FP32 下每秒传输参数数2×1012 字节/s÷4 字节/参数5×1011 参数/s5000 亿参数/s 2 \times 10^{12} \text{ 字节/s} \div 4 \text{ 字节/参数} 5 \times 10^{11} \text{ 参数/s} 5000 \text{ 亿参数/s}2×1012字节/s÷4字节/参数5×1011参数/s5000亿参数/sBF16 下每秒传输参数数2×1012÷21012 参数/s10000 亿参数/s 2 \times 10^{12} \div 2 10^{12} \text{ 参数/s} 10000 \text{ 亿参数/s}2×1012÷21012参数/s10000亿参数/s传输 175B 参数的时间FP32:700×1092×10120.35 秒 \text{FP32}: \frac{700 \times 10^9}{2 \times 10^{12}} 0.35 \text{ 秒}FP32:2×1012700×109​0.35秒BF16:350×1092×10120.175 秒 \text{BF16}: \frac{350 \times 10^9}{2 \times 10^{12}} 0.175 \text{ 秒}BF16:2×1012350×109​0.175秒时间减半。如果带宽是瓶颈低精度直接把传输时间砍一半。缓存命中率提升同样 40MB 的 L2 缓存FP32 能存 40MB/4B 1000 万个参数BF16 能存 40MB/2B 2000 万个参数缓存能覆盖更多热点数据命中率更高。显存容纳更大模型80GB 显存FP32 最多放约 200 亿参数BF16 最多放约 400 亿参数。350GB 的 LLaMA-65B 在 80GB 显存上用 BF16 可以跑FP32 放不下。机制三Tensor Core 专用加速——不是缩小版 FP32而是重构版矩阵引擎概述Tensor Core 是 NVIDIA 为低精度矩阵乘设计的专用电路。Ampere 架构的峰值算力精度峰值算力相对 FP32 CUDA CoreFP3219.5 TFLOPS1×TF32156 TFLOPS8×FP16312 TFLOPS16×BF16312 TFLOPS16×INT8624 TOPS32×加速原理脉动阵列Systolic Array数据在阵列中流动每个周期每个单元完成 1 次乘加。32×32 阵列每周期完成 1024 次运算。权重静止矩阵权重预加载到阵列寄存器减少数据搬运。累加器优化输入输出用低精度但累加用 FP32保证精度。例子 矩阵乘法的计算时间设计算CA×BC A \times BCA×BAAA、BBB都是4096×40964096 \times 40964096×4096的矩阵。总 FLOPs2×409632×6.87×10101.374×1011 FLOPs 2 \times 4096^3 2 \times 6.87 \times 10^{10} 1.374 \times 10^{11} \text{ FLOPs}2×409632×6.87×10101.374×1011FLOPsFP32 CUDA Core (19.5 TFLOPS)时间1.374×101119.5×10127.05×10−3 秒7.05 ms \text{时间} \frac{1.374 \times 10^{11}}{19.5 \times 10^{12}} 7.05 \times 10^{-3} \text{ 秒} 7.05 \text{ ms}时间19.5×10121.374×1011​7.05×10−3秒7.05msFP16 Tensor Core (312 TFLOPS)时间1.374×1011312×10124.40×10−4 秒0.44 ms \text{时间} \frac{1.374 \times 10^{11}}{312 \times 10^{12}} 4.40 \times 10^{-4} \text{ 秒} 0.44 \text{ ms}时间312×10121.374×1011​4.40×10−4秒0.44ms加速比7.050.4416.0 \frac{7.05}{0.44} 16.00.447.05​16.0正好是 16 倍与峰值算力比一致。如果算上数据加载FP32 下 A、B 各占 4096² × 4 64 MB共 128 MBFP16 下 A、B 各占 4096² × 2 32 MB共 64 MB2 TB/s 带宽下FP32 加载需 128MB/2TB/s 64 μsFP16 需 32 μs。计算时间远大于加载时间所以这个例子中计算是瓶颈但如果矩阵较小或带宽受限低精度的带宽优势会更明显。机制四并行度提升——同样芯片面积计算单元翻倍概述A100 的 SM 中Tensor Core 复用寄存器文件FP32 模式64 个 CUDA Core 活跃每周期 64 次 FMAFP16 模式64 个 CUDA Core 4 个 Tensor Core 活跃每周期 64 次 FMA 1024 次矩阵运算。同样芯片面积低精度可集成 4 倍计算单元实现 4 倍吞吐量。SM 内每周期运算量设一个 SMFP32 模式64 个 CUDA Core每周期 64 次 FMAFP16 模式64 个 CUDA Core 4 个 Tensor Core每周期 64 4 × 256 1088 次 FMA假设每个 Tensor Core 每周期 256 次。相对吞吐10886417\frac{1088}{64} 17641088​17约 17 倍与 Ampere 上 FP16 相对 FP32 的 16 倍峰值算力一致。芯片面积角度FP32 核心 0.1 mm²FP16 核心 0.05 mm²同样 100 mm²FP32 放 1000 个FP16 放 2000 个如果每个核心每周期 1 次 FMAFP32 每周期 1000 次FP16 每周期 2000 次吞吐翻倍。综合数值例子一个训练步骤的完整对比设模型 175B 参数训练一个 batch需要加载权重175B 参数前向矩阵乘法约 2 × 175B × token 数 FLOPs反向传播约 2 倍前向 FLOPs。取 token 数 10⁶。计算量前向2×175×109×1063.5×1017 FLOPs 2 \times 175 \times 10^9 \times 10^6 3.5 \times 10^{17} \text{ FLOPs}2×175×109×1063.5×1017FLOPs训练总前向 反向3×3.5×10171.05×1018 FLOPs 3 \times 3.5 \times 10^{17} 1.05 \times 10^{18} \text{ FLOPs}3×3.5×10171.05×1018FLOPsFP32 训练算力19.5 TFLOPS计算时间1.05×101819.5×10125.38×104 秒≈14.9 小时 \frac{1.05 \times 10^{18}}{19.5 \times 10^{12}} 5.38 \times 10^4 \text{ 秒} \approx 14.9 \text{ 小时}19.5×10121.05×1018​5.38×104秒≈14.9小时权重加载700 GB / 2 TB/s 0.35 秒相对计算可忽略。FP16/BF16 训练算力312 TFLOPS计算时间1.05×1018312×10123.37×103 秒≈0.94 小时 \frac{1.05 \times 10^{18}}{312 \times 10^{12}} 3.37 \times 10^3 \text{ 秒} \approx 0.94 \text{ 小时}312×10121.05×1018​3.37×103秒≈0.94小时权重加载350 GB / 2 TB/s 0.175 秒。加速比14.90.94≈15.9 \frac{14.9}{0.94} \approx 15.90.9414.9​≈15.9约 16 倍与 Tensor Core 峰值算力比一致。如果带宽是瓶颈假设模型更大权重加载成为主要开销。设权重 10 TBFP3210TB/2TB/s 5 秒BF165TB/2TB/s 2.5 秒。带宽时间减半这就是“省得多的带宽”的直接体现。混合精度输入低精度累加高精度低精度不是所有计算都用 16 位。关键设计为输入FP16/BF16 存储和传输省带宽乘法低精度输入相乘累加FP32 累加器保证中间结果精度输出FP32 结果按需降回 FP16。数值例子计算 1.234 × 5.678 9.012 × 3.456。全 FP161.234 × 5.678 ≈ 7.006 9.012 × 3.456 ≈ 31.145 和 ≈ 38.151FP16 只有约 3 位十进制有效数字中间结果可能舍入。混合精度输入 1.234、5.678 用 FP16 存乘法用 FP16累加用 FP327.006 31.145 38.151FP32 累加保留更多有效位这样既省了输入带宽又保证了累加精度训练稳定性更好。总结机制原理数值例子硬件因素位宽越小乘法器晶体管越少同样面积放更多运算器FP16 乘法器晶体管约为 FP32 的 1/4100mm² 面积 FP32 放 1000 核FP16 放 2000 核内存带宽节省数据位宽减半带宽需求减半缓存装更多175B 参数 FP32 700GB → BF16 350GB2TB/s 下加载时间 0.35s → 0.175sTensor Core 专用加速脉动阵列 权重静止 FP32 累加器4096³ 矩阵乘FP32 7.05ms → FP16 0.44ms快 16 倍并行度提升同样面积集成更多低精度核心SM 内 FP32 每周期 64 FMA → FP16 每周期 1088 FMA约 17 倍一句话“用精度换取更快的计算和‘省得多’的带宽”意思是降低数据位宽一方面让硬件电路更简单、同样面积塞下更多计算单元另一方面让数据量减半、带宽压力减半。再叠加 Tensor Core 专用矩阵引擎最终在可接受的精度损失下换来 16 倍甚至更高的吞吐提升。混合精度输入 16 位、累加 32 位则在提速的同时保住了训练稳定性。
阅读完成 · 觉得有帮助?
咨询建站