Transformers 文档

训练专用硬件

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

自定义训练硬件

您用于运行模型训练和推理的硬件会对性能产生重大影响。要深入了解 GPU,请务必查看 Tim Dettmer 撰写的优秀博文

让我们来看看一些关于 GPU 设置的实用建议。

GPU

当您训练更大的模型时,您基本上有三个选择

让我们从您只有一个 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

< > GitHub 更新