【框架】简化多卡训练——huggingface accelerate使用方法介绍

HuggingFace 的 accelerate 库可以实现只需要修改几行代码就可以实现ddp训练,且支持混合精度训练和TPU训练。(甚至支持deepspeed。)
accelerate支持的训练方式为CPU/单GPU (TPU)/多GPU(TPU) DDP模式/fp32/fp16等。

安装

pip install accelerate

使用

使用accelerate进行单卡或者多卡训练的代码是相同的,不过在单卡训练的时候可以不使用gather_for_metrics()函数聚合信息。这里为了保持代码的不变性,仍然保留gather_for_metrics()。以下为使用accelerate运行在MNIST数据集上面运行手写数字识别的样例代码main.py

import datetime
import os

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms

#======================================================================
# import accelerate
from accelerate import Accelerator
from accelerate.utils import set_seed
#======================================================================


class BasicNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout(0.25)
        self.dropout2 = nn.Dropout(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)
        self.act = F.relu

    def forward(self, x):
        x = self.act(self.conv1(x))
        x = self.act(self.conv2(x))
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
### 使用GPU在单机上进行Hugging Face模型微调 为了实现高效的单机GPU微调训练,可以利用PyTorch的分布式数据并行(Distributed Data Parallel, DDP)功能以及Hugging Face Trainer API的支持。DDP允许跨个GPU分配工作负载,从而加速训练过程。 #### 设置环境变量 首先,在启动脚本或命令前设置必要的环境变量来配置CUDA可见设备数量: ```bash export CUDA_VISIBLE_DEVICES=0,1,2,3 # 假设使用四个GPU ``` #### 修改训练脚本 接着修改训练代码以支持GPU训练。这里展示了一个简单的例子,展示了如何通过`Trainer`类来进行GPU训练[^1]: ```python from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments import torch.distributed as dist model_name = "bert-base-uncased" train_dataset = ... # 加载训练集 eval_dataset = ... # 加载验证集 training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=8, per_device_eval_batch_size=8, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', ) model = AutoModelForSequenceClassification.from_pretrained(model_name) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, ) if not dist.is_initialized(): dist.init_process_group(backend='nccl') # 开始训练 trainer.train() ``` 这段代码自动检测可用的GPU数目,并启用相应的优化选项。对于更大的模型或者更复杂的场景,还可以考虑采用混合精度训练技术如Apex AMP,这将进一步提升效率和降低显存占用。 另外,针对大型模型可能出现内存不足的情况,QLORA提出的分页优化器(Paged Optimizers)能够有效防止梯度检查点期间产生的瞬态高峰导致OOM错误,使得即使是在资源有限的情况下也能顺利完成微调任务[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值