用于训练的定制硬件
用于运行模型训练和推理的硬件对性能有很大影响。要深入了解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针电缆从你的电源供应器连接到卡上,而不是一根末端有2个PCI-E 8针连接器的电缆!否则,你将无法充分发挥卡的性能。
每个PCI-E 8针电源线需要插入电源的12V轨道,并且可以提供高达150W的功率。
其他一些卡可能使用PCI-E 12针连接器,这些连接器可以提供高达500-600W的功率。
低端显卡可能使用6针连接器,可提供高达75W的功率。
此外,您还需要一个具有稳定电压的高端电源。一些质量较低的电源可能无法为显卡提供其达到峰值性能所需的稳定电压。
当然,电源供应器需要有足够的未使用瓦数来为显卡供电。
冷却:
当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开发的一种基于电线的串行多通道近程通信链路。
每一代新技术都提供了更快的带宽,例如,这里引用自Nvidia Ampere GA102 GPU架构:
第三代NVLink® GA102 GPU采用NVIDIA的第三代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 每个 + NVlink 带 2 NVLinks(NV2
在 nvidia-smi topo -m
中)
软件:pytorch-1.8-to-be
+ cuda-11.0
/ transformers==4.3.0.dev0