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

青葱年少 pytorch 411

原文标题Why, using Huggingface Trainer, single GPU training is faster than 2 GPUs?

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

我观察到,当我使用完全相同的数据和 TrainingArguments 训练完全相同的模型(6 层,~82M 参数)时,在单个 GPU 上的训练比在 2 个 GPU 上的训练要快得多:~5hrs vs ~6.5hrs。

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

额外说明:

  • 2 gpus 都在使用(观看 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
}

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

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

原文链接:https://stackoverflow.com//questions/71500386/why-using-huggingface-trainer-single-gpu-training-is-faster-than-2-gpus

回复

我来回复
  • ClonedOne的头像
    ClonedOne 评论

    留在这里以供参考。原因是 "gradient_checkpointing": true,。梯度检查点导致的减速在 2 个 GPU 上似乎比在单个 GPU 上更大。我真的不知道这个问题的原因,如果有人知道我真的很感激有人告诉我。

    2年前 0条评论