AMD Instinct GPU 连接性
在多 GPU 设置中,当在使用集体操作的 AMD Instinct MI210 或 MI250 GPU 上使用 Hugging Face 库时,训练和推理性能可能会因节点上一起使用的设备而异。例如,某些用例包括张量并行、流水线并行或数据并行。
双芯片拓扑
在单个节点上使用 torchrun
在 AMD Instinct 机器上使用多个设备?我们建议使用 amdrun --ngpus <num_gpus> <script> <script_args>
来自动分配到最适合的 num_gpus
以获得最佳性能。
以 MI250 机器为例,rocm-smi
显示有 8 个设备可用
========================= ROCm System Management Interface =========================
=================================== Concise Info ===================================
GPU Temp (DieEdge) AvgPwr SCLK MCLK Fan Perf PwrCap VRAM% GPU%
0 35.0c 90.0W 800Mhz 1600Mhz 0% auto 560.0W 0% 0%
1 34.0c N/A 800Mhz 1600Mhz 0% auto 0.0W 0% 0%
2 31.0c 95.0W 800Mhz 1600Mhz 0% auto 560.0W 0% 0%
3 37.0c N/A 800Mhz 1600Mhz 0% auto 0.0W 0% 0%
4 35.0c 99.0W 800Mhz 1600Mhz 0% auto 560.0W 0% 0%
5 31.0c N/A 800Mhz 1600Mhz 0% auto 0.0W 0% 0%
6 38.0c 94.0W 800Mhz 1600Mhz 0% auto 560.0W 0% 0%
7 39.0c N/A 800Mhz 1600Mhz 0% auto 0.0W 0% 0%
====================================================================================
但是,正如 机器架构描述 中所示,某些设备实际上具有优先连接,rocm-smi
中的两个设备(两个 GCD,图形计算芯片)实际上对应于一个 MI250(一个 OAM,OCP 加速器模块)。
可以通过运行 rocm-smi --shownodesbw
来检查这一点:某些设备 <-> 设备链接具有更高的最大带宽。例如,从下表中,我们可以得出结论
- 如果使用两个设备,使用
CUDA_VISIBLE_DEVICES="0,1"
、"2,3"
、"4,5"
或"6,7"
应该具有优先权。 - 如果使用三个设备,
CUDA_VISIBLE_DEVICES="0,1,6"
是一个不错的选择。 - 如果使用四个设备,
CUDA_VISIBLE_DEVICES="0,1,6,7"
或"2,3,4,5"
是一个不错的选择。
========================= ROCm System Management Interface =========================
==================================== Bandwidth =====================================
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 N/A 50000-200000 50000-50000 0-0 0-0 0-0 50000-100000 0-0
GPU1 50000-200000 N/A 0-0 50000-50000 0-0 50000-50000 0-0 0-0
GPU2 50000-50000 0-0 N/A 50000-200000 50000-100000 0-0 0-0 0-0
GPU3 0-0 50000-50000 50000-200000 N/A 0-0 0-0 0-0 50000-50000
GPU4 0-0 0-0 50000-100000 0-0 N/A 50000-200000 50000-50000 0-0
GPU5 0-0 50000-50000 0-0 0-0 50000-200000 N/A 0-0 50000-50000
GPU6 50000-100000 0-0 0-0 0-0 50000-50000 0-0 N/A 50000-200000
GPU7 0-0 0-0 0-0 50000-50000 0-0 50000-50000 50000-200000 N/A
Format: min-max; Units: mps
"0-0" min-max bandwidth indicates devices are not connected directly
此表仅提供理论上的最小/最大带宽。验证要一起使用的设备的最佳方法是在您的设备上运行 rocm_bandwidth_test。
NUMA 节点
在某些 AMD 机器上,如下图所示,某些设备可能与某些 CPU 内核具有优先连接。
可以使用 rocm-smi --showtoponuma
来检查这一点,它提供了 NUMA 拓扑
==================================== Numa Nodes ====================================
GPU[0] : (Topology) Numa Node: 0
GPU[0] : (Topology) Numa Affinity: 0
GPU[1] : (Topology) Numa Node: 0
GPU[1] : (Topology) Numa Affinity: 0
GPU[2] : (Topology) Numa Node: 0
GPU[2] : (Topology) Numa Affinity: 0
GPU[3] : (Topology) Numa Node: 0
GPU[3] : (Topology) Numa Affinity: 0
GPU[4] : (Topology) Numa Node: 1
GPU[4] : (Topology) Numa Affinity: 1
GPU[5] : (Topology) Numa Node: 1
GPU[5] : (Topology) Numa Affinity: 1
GPU[6] : (Topology) Numa Node: 1
GPU[6] : (Topology) Numa Affinity: 1
GPU[7] : (Topology) Numa Node: 1
GPU[7] : (Topology) Numa Affinity: 1
带宽差异可以使用 rocm_bandwidth_test 来检查(已删除)
Bidirectional copy peak bandwidth GB/s
D/D cpu0 cpu1
cpu0 N/A N/A
cpu1 N/A N/A
0 47.763 38.101
1 47.796 38.101
2 47.732 36.429
3 47.709 36.330
4 36.705 47.468
5 36.725 47.396
6 35.605 47.294
7 35.377 47.233
在为获得最佳性能进行基准测试时,我们建议测试在 /proc/sys/kernel/numa_balancing
处禁用/启用 NUMA 平衡,这可能会影响性能。下表显示了特定情况下 文本生成推理 的性能差异,其中禁用 NUMA 平衡极大地提高了性能。
另一种方法是使用 numactl --membind
将使用 GPU 的进程绑定到其相应的 NUMA 节点内核。更多详细信息 在此。
Infinity Fabric
如 MI210 机器架构图所示,某些 GPU 设备可能通过 Infinity Fabric 链接 相连,该链接通常具有比 PCIe 交换机更高的带宽(每个 Infinity Fabric 链接高达 100 GB/s)。
事实上,测量单向复制峰值带宽,我们发现通过 Infinity Fabric 相连的 MI210 GPU 的通信速度比通过 PCIe 交换机快约 1.7 倍。
< > 更新 GitHub 上