pytorch如何混合进度训练transformer【各种不同方式】

Trainer, no trainer, accelerator

用huggingface 的Trainer

Hugging Face 的 Transformers 库为我们提供了大量预训练的 Transformer 模型,以及一个易于使用的训练和微调工具------Trainer。在 Trainer 中,我们可以很容易地启用混合精度训练,也称为自动混合精度 (AMP) 训练。

要在 Hugging Face 的 Trainer 中启用混合精度训练,只需要在创建 Trainer 时设置 fp16=True。以下是一个例子:

python 复制代码
from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir='./results',          # 输出目录
    num_train_epochs=3,              # 总的训练轮数
    per_device_train_batch_size=16,  # 每个 GPU 的训练批次大小
    per_device_eval_batch_size=64,   # 每个 GPU 的评估批次大小
    fp16=True,                       # 启用混合精度训练
    # ...
)

trainer = Trainer(
    model=model,                     # 要训练的模型
    args=training_args,              # 训练参数
    train_dataset=train_dataset,     # 训练数据集
    eval_dataset=test_dataset,       # 评估数据集
    # ...
)

trainer.train()

请注意,混合精度训练需要 GPU 支持,特别是 NVIDIA 的 Volta 和 Turing 架构以及更高版本的 GPU。如果您在没有这些硬件的环境中启用了混合精度训练,可能会遇到错误。

另外,混合精度训练可以与梯度累积一起使用以进一步提高训练效率。您可以通过设置 gradient_accumulation_steps 参数来实现这一点。

不用Trainer

如果你不想使用 Hugging Face 的 Trainer 类,可以使用 PyTorch 的自动混合精度(AMP)功能来进行混合精度训练。以下是一个如何使用 AMP 进行训练的示例:

python 复制代码
import torch
from torch.cuda.amp import GradScaler, autocast
from transformers import BertForSequenceClassification, BertTokenizer

# 初始化模型和分词器
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 选择设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)

# 初始化优化器和梯度缩放器
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-5)
scaler = GradScaler()

# 假设我们有一个批次的输入数据和标签
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to(device)
labels = torch.tensor([1]).unsqueeze(0).to(device)  # 假设这是一个二分类问题

model.train()  # 设置模型为训练模式
for epoch in range(10):  # 训练 10 个周期
    optimizer.zero_grad()

    with autocast():  # 开启自动混合精度
        outputs = model(**inputs, labels=labels)
        loss = outputs.loss

    scaler.scale(loss).backward()  # 使用梯度缩放进行反向传播
    scaler.step(optimizer)  # 使用梯度缩放更新参数
    scaler.update()  # 更新梯度缩放器

在这个例子中,我们使用 torch.cuda.amp.autocasttorch.cuda.amp.GradScaler 来实现混合精度训练。autocast 上下文管理器将自动为兼容的操作选择合适的数据类型,而 GradScaler 则负责缩放梯度以防止数值下溢。

请注意,这个示例非常基础,真实的训练循环可能会包含更多的逻辑,例如处理多个批次的数据、进行模型评估、保存和加载模型等等。

使用accelerator

Hugging Face 的 Accelerate 库提供了一个简单易用的 API,用于在各种硬件配置(如单个或多个 CPU、GPU,甚至是 TPU)上进行分布式和混合精度训练。下面是一个如何使用 Accelerate 库进行混合精度训练的例子:

python 复制代码
from accelerate import Accelerator
from torch.utils.data import DataLoader
from transformers import AdamW, BertForSequenceClassification, BertTokenizer

accelerator = Accelerator(fp16=True)  # 启用混合精度训练
device = accelerator.device

# 初始化模型和分词器
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

model = model.to(device)

# 设置优化器
optimizer = AdamW(model.parameters(), lr=1e-5)
optimizer, model = accelerator.prepare(optimizer, model)  # 准备优化器和模型

# 假设我们有一个批次的输入数据和标签
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to(device)
labels = torch.tensor([1]).unsqueeze(0).to(device)  # 假设这是一个二分类问题

model.train()  # 设置模型为训练模式
for epoch in range(10):  # 训练 10 个周期
    optimizer.zero_grad()
    outputs = model(**inputs, labels=labels)
    loss = outputs.loss
    accelerator.backward(loss)  # 使用 Accelerate 进行反向传播
    optimizer.step()

在这个例子中,我们首先创建一个 Accelerator 对象,并通过设置 fp16=True 来启用混合精度训练。接着,我们使用 accelerator.prepare 函数来准备优化器和模型。最后,在计算损失后,我们使用 accelerator.backward 而不是常规的 loss.backward 来进行反向传播。这将自动应用混合精度训练,无需我们手动管理 autocast 或 GradScaler。

请注意,Accelerate 库的目标是简化分布式和混合精度训练,而不是提供一个完整的训练框架。因此,您可能需要结合 PyTorch(或其他类似的库)来处理数据加载、模型评估、权重保存和加载等任务。

相关推荐
mortimer20 小时前
从 Python+venv+pip 迁移到 uv 全过程 及 处理 torch + cuda 的跨平台指南
pytorch·python·macos
berryyan20 小时前
Windows WSL 环境下配置 Claude Code 非官方账号2233.ai完整教程
人工智能·python
道传科技上位机20 小时前
机器视觉九点标定(现场实用版)
人工智能·数码相机·计算机视觉
张较瘦_20 小时前
[论文阅读] AI | PynguinML——破解ML库自动化测试难题,覆盖率最高提升63.9%
论文阅读·人工智能
墨利昂20 小时前
神经网络常用激活函数公式
人工智能·深度学习·神经网络
2501_9307992420 小时前
访答知识库,企业知识库,访答浏览器,Al编辑器,RAG,Pdf转word。个人知识库,访答RAG,云知识库,私有知识库……
人工智能
机器之心20 小时前
OpenAI官宣自研造芯,联手博通开发10吉瓦规模的AI加速器
人工智能·openai
机器之心20 小时前
100美元、8000行代码手搓ChatGPT,Karpathy最新开源项目爆火,一夜近5k star
人工智能·openai
RTC老炮20 小时前
webrtc弱网-BitrateEstimator类源码分析与算法原理
网络·人工智能·算法·机器学习·webrtc
星期天要睡觉20 小时前
计算机视觉(opencv)——基于 MediaPipe 的手势识别系统
人工智能·opencv·计算机视觉