自定义训练硬件
您用于运行模型训练和推理的硬件会对性能产生重大影响。要深入了解 GPU,请务必查看 Tim Dettmer 撰写的优秀博文。
让我们来看看一些关于 GPU 设置的实用建议。
GPU
当您训练更大的模型时,您基本上有三个选择
- 更大的 GPU
- 更多 GPU
- 更多 CPU 和 NVMe(由DeepSpeed-Infinity卸载)
让我们从您只有一个 GPU 的情况开始。
电源和散热
如果您购买了昂贵的高端 GPU,请确保为其提供正确的电源和足够的散热。
电源:
一些高端消费级 GPU 显卡有 2 个,有时还有 3 个 PCI-E 8 针电源插座。请确保您有尽可能多的独立 12V PCI-E 8 针线缆插入显卡,数量与插座数量相同。请勿使用同一根线缆一端带 2 个分叉的线缆(也称为猪尾巴线缆)。也就是说,如果您的 GPU 上有 2 个插座,您需要 2 根 PCI-E 8 针线缆从您的电源供电单元 (PSU) 连接到显卡,而不是一根线缆一端带 2 个 PCI-E 8 针连接器!否则,您将无法获得显卡的全部性能。
每根 PCI-E 8 针电源线缆都需要插入 PSU 端的 12V 导轨,并且可以提供高达 150W 的功率。
其他一些显卡可能使用 PCI-E 12 针连接器,这些连接器可以提供高达 500-600W 的功率。
低端显卡可能使用 6 针连接器,可以提供高达 75W 的功率。
此外,您需要具有稳定电压的高端 PSU。一些质量较低的 PSU 可能无法为显卡提供其在峰值状态下运行所需的稳定电压。
当然,PSU 需要有足够的未使用的瓦特数来为显卡供电。
散热:
当 GPU 过热时,它会开始降频,无法提供完整的性能,如果温度过高,它甚至可能会关闭。
在 GPU 负载较重时很难确定最佳温度,但可能任何低于 +80C 的温度都很好,但越低越好 - 也许 70-75C 是一个极好的范围。降频可能会在 84-90C 左右开始。但除了降频之外,长时间的高温也可能会缩短 GPU 的使用寿命。
接下来,让我们看看在使用多个 GPU 时最重要的方面之一:连接性。
多 GPU 连接
如果您使用多个 GPU,显卡的互连方式会对总训练时间产生巨大影响。如果 GPU 位于同一物理节点上,您可以运行
nvidia-smi topo -m
它会告诉您 GPU 是如何互连的。在具有双 GPU 且通过 NVLink 连接的机器上,您很可能会看到类似以下内容:
GPU0 GPU1 CPU Affinity NUMA Affinity
GPU0 X NV2 0-23 N/A
GPU1 NV2 X 0-23 N/A
在没有 NVLink 的另一台机器上,我们可能会看到
GPU0 GPU1 CPU Affinity NUMA Affinity
GPU0 X PHB 0-11 N/A
GPU1 PHB X 0-11 N/A
报告包含以下图例:
X = Self
SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
PIX = Connection traversing at most a single PCIe bridge
NV# = Connection traversing a bonded set of # NVLinks
因此,第一个报告 NV2
告诉我们 GPU 通过 2 个 NVLink 相互连接,第二个报告 PHB
我们有一个典型的消费级 PCIe+桥接设置。
检查您的设置上有什么类型的连接。其中一些会使显卡之间的通信更快(例如 NVLink),另一些会更慢(例如 PHB)。
根据所使用的可扩展性解决方案的类型,连接速度可能会产生重大或轻微的影响。如果 GPU 很少需要同步,如在 DDP 中,较慢连接的影响将不太明显。如果 GPU 需要经常相互发送消息,如在 ZeRO-DP 中,那么更快的连接对于实现更快的训练变得非常重要。
NVLink
NVLink 是英伟达开发的一种基于线缆的串行多通道近距离通信链路。
每一代都提供了更快的带宽,例如,以下是来自 Nvidia Ampere GA102 GPU 架构 的引用:
第三代 NVLink® GA102 GPU 利用了英伟达的第三代 NVLink 接口,该接口包括四个 x4 链路,每个链路在两个 GPU 之间每个方向提供 14.0625 GB/秒的带宽。四个链路在每个方向提供 56.25 GB/秒的带宽,并且在两个 GPU 之间总共提供 112.5 GB/秒的带宽。两个 RTX 3090 GPU 可以使用 NVLink 连接在一起以进行 SLI。(请注意,不支持 3 路和 4 路 SLI 配置。)
因此,在 nvidia-smi topo -m
的输出中,您在 NVX
报告中获得的 X
越高越好。该代数将取决于您的 GPU 架构。
让我们比较一下在 wikitext 的一小部分样本上执行 openai-community/gpt2
语言模型训练的情况。
结果如下:
NVLink | 时间 |
---|---|
Y | 101 秒 |
N | 131 秒 |
您可以看到 NVLink 使训练速度提高了约 23%。在第二个基准测试中,我们使用 NCCL_P2P_DISABLE=1
来告诉 GPU 不要使用 NVLink。
以下是完整的基准测试代码和输出:
# DDP w/ NVLink
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 torchrun \
--nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py --model_name_or_path openai-community/gpt2 \
--dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train \
--output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200
{'train_runtime': 101.9003, 'train_samples_per_second': 1.963, 'epoch': 0.69}
# DDP w/o NVLink
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 NCCL_P2P_DISABLE=1 torchrun \
--nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py --model_name_or_path openai-community/gpt2 \
--dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train
--output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200
{'train_runtime': 131.4367, 'train_samples_per_second': 1.522, 'epoch': 0.69}
硬件:2x TITAN RTX 24GB 每块 + 带有 2 个 NVLink 的 NVLink(nvidia-smi topo -m
中的 NV2
)软件:pytorch-1.8-to-be
+ cuda-11.0
/ transformers==4.3.0.dev0