为什么使用 Huggingface Trainer,单 GPU 训练比 2 个 GPU 更快?

Clo*_*One 5 python gpu pytorch huggingface-transformers

我有一个带有 2 个 V100 的虚拟机,我正在使用 Huggingface 的非常好的 Trainer API 来训练类似 gpt2 的模型(相同的架构,更少的层)。我正在使用 pytorch 后端。

我观察到,当我使用完全相同的数据和 TrainingArguments 训练完全相同的模型(6 层,约 82M 参数)时,在单个 GPU 上的训练速度明显快于 2GPU:约 5 小时 vs 约 6.5 小时。

如何调试此类问题以了解导致速度下降的原因?

额外说明:

  • 2 个 GPU 都在使用(观看 nvidia-smi 输出)
  • 我用的是fp16精度
  • 我的 TrainingArguments 值为:
{
    "optim": "adamw_torch",
    "evaluation_strategy": "epoch",
    "save_strategy": "epoch",
    "fp16": true,
    "gradient_checkpointing": true,
    "per_device_train_batch_size": 16,
    "per_device_eval_batch_size": 16,
    "dataloader_num_workers": 4,
    "dataloader_pin_memory": true,
    "gradient_accumulation_steps": 1,
    "num_train_epochs": 5
}
Run Code Online (Sandbox Code Playgroud)

的输出nvidia-smi topo -m是:

$ nvidia-smi topo -m
        GPU0    GPU1    CPU Affinity    NUMA Affinity
GPU0     X      SYS     0-11            N/A
GPU1    SYS      X      0-11            N/A
Run Code Online (Sandbox Code Playgroud)

我知道,如果没有 NVLink,GPU 间通信的速度就不会那么快,但这是否是导致像我观察到的那样缓慢的唯一原因?如果是这样,我能做些什么吗?或者我在 2GPU 上的训练时间总是会变慢(从而使多 GPU 训练基本上毫无用处)?

Clo*_*One 5

将此保留在这里以供参考。原因是 "gradient_checkpointing": true,。梯度检查点引起的速度下降在 2 个 GPU 上似乎比在单个 GPU 上更大。我真的不知道这个问题的原因,如果有人知道我会非常感激有人告诉我。