如何在多个 GPU 上使用 Huggingface Trainer?

Pen*_*uin 6 machine-learning pytorch huggingface-transformers huggingface

假设我有以下模型(来自脚本):

\n
from transformers import AutoTokenizer, GPT2LMHeadModel, AutoConfig\n\nconfig = AutoConfig.from_pretrained(\n    "gpt2",\n    vocab_size=len(tokenizer),\n    n_ctx=context_length,\n    bos_token_id=tokenizer.bos_token_id,\n    eos_token_id=tokenizer.eos_token_id,\n)\nmodel = GPT2LMHeadModel(config)\n
Run Code Online (Sandbox Code Playgroud)\n

我目前正在为 Trainer 使用以下训练参数:

\n
from transformers import Trainer, TrainingArguments\n\nargs = TrainingArguments(\n    output_dir="codeparrot-ds",\n    per_device_train_batch_size=32,\n    per_device_eval_batch_size=32,\n    evaluation_strategy="steps",\n    eval_steps=5_000,\n    logging_steps=5_000,\n    gradient_accumulation_steps=8,\n    num_train_epochs=1,\n    weight_decay=0.1,\n    warmup_steps=1_000,\n    lr_scheduler_type="cosine",\n    learning_rate=5e-4,\n    save_steps=5_000,\n    fp16=True,\n    push_to_hub=True,\n)\n\ntrainer = Trainer(\n    model=model,\n    tokenizer=tokenizer,\n    args=args,\n    data_collator=data_collator,\n    train_dataset=tokenized_datasets["train"],\n    eval_dataset=tokenized_datasets["valid"],\n)\ntrainer.train()\n
Run Code Online (Sandbox Code Playgroud)\n

我如何对此进行调整,以便训练器将使用多个 GPU(例如 8 个)?

\n

我发现了这个问题,但他们没有使用 Trainer,只是使用 PyTorchDataParallel

\n
model = torch.nn.DataParallel(model, device_ids=[0,1])\n
Run Code Online (Sandbox Code Playgroud)\n

关于使用多个 GPU 进行训练的Huggingface文档对我来说并不是很清楚,并且没有使用 Trainer 的示例。相反,我在这里发现他们使用 向 python 文件添加参数nproc_per_node,但这对于他们的脚本来说似乎过于具体,并且不清楚一般如何使用。与他们论坛上的讨论相反"The Trainer class automatically handles multi-GPU training, you don\xe2\x80\x99t have to do anything special."。所以这很令人困惑,因为一方面他们提到在多个 GPU 上进行训练需要做一些事情,并且还说训练器会自动处理它。所以我不知道该怎么办。

\n

小智 3

我使用了以下 python 脚本之一(例如 run_clm.py),其中 trainer.train() 位于其中: https: //github.com/huggingface/transformers/tree/main/examples/pytorch/language-modeling

制作一个finetune.sh bash文件,在里面执行一个python脚本

#!/bin/bash
export LD_LIBRARY_PATH=/home/miniconda3/envs/HF/lib/python3.7/.../nvidia/cublas/lib/:$LD_LIB
export CUDA_VISIBLE_DEVICES=0,1  # will use two GPUs
###############################
python run_clm.py --options...
Run Code Online (Sandbox Code Playgroud)

然后通过 bash 运行它,它将按照定义在两个 GPU 上运行。

$ nohup ./finetune.sh & 
Run Code Online (Sandbox Code Playgroud)

如果您想运行所有可用的 8 个 GPU,
只需注释以下行

#export CUDA_VISIBLE_DEVICES=0,1 # will use all GPUs
Run Code Online (Sandbox Code Playgroud)