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(或其他类似的库)来处理数据加载、模型评估、权重保存和加载等任务。

相关推荐
power-辰南1 小时前
机器学习之数据分析及特征工程详细分析过程
人工智能·python·机器学习·大模型·特征
少说多想勤做1 小时前
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
人工智能·深度学习·神经网络·目标检测·计算机视觉·目标跟踪·aaai
橙子小哥的代码世界3 小时前
【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用
图像处理·人工智能·深度学习·神经网络·计算机视觉·分类·卷积神经网络
leigm1233 小时前
深度学习使用Anaconda打开Jupyter Notebook编码
人工智能·深度学习·jupyter
Aileen_0v05 小时前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
阿正的梦工坊6 小时前
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)
人工智能·pytorch·python
Ainnle6 小时前
GPT-O3:简单介绍
人工智能
OceanBase数据库官方博客7 小时前
向量检索+大语言模型,免费搭建基于专属知识库的 RAG 智能助手
人工智能·oceanbase·分布式数据库·向量数据库·rag
测试者家园7 小时前
ChatGPT助力数据可视化与数据分析效率的提升(一)
软件测试·人工智能·信息可视化·chatgpt·数据挖掘·数据分析·用chatgpt做软件测试