使用MosaicML Composer微调Hugging Face模型实战指南
前言
在自然语言处理(NLP)领域,Hugging Face的transformers库已成为使用预训练模型的事实标准。而MosaicML Composer则是一个专注于高效训练深度学习模型的库。本文将介绍如何结合两者的优势,使用Composer来微调Hugging Face的预训练模型。
准备工作
环境安装
首先需要安装Composer及其NLP相关依赖:
pip install 'mosaicml[nlp, tensorboard]'
知识准备
本教程假设读者已经具备:
- Transformer模型的基础知识
- Hugging Face库的基本使用经验
- Composer库的入门知识
模型与数据准备
加载预训练模型
我们从Hugging Face加载BERT-base-uncased模型和对应的分词器:
import transformers
model = transformers.AutoModelForSequenceClassification.from_pretrained(
'google-bert/bert-base-uncased',
num_labels=2 # 情感分类任务有两个标签
)
tokenizer = transformers.AutoTokenizer.from_pretrained('google-bert/bert-base-uncased')
数据加载与处理
我们使用斯坦福情感树库(SST-2)数据集,这是一个经典的二分类情感分析数据集。
import datasets
import os
from multiprocessing import cpu_count
def tokenize_function(sample):
return tokenizer(
text=sample['sentence'],
padding="max_length",
max_length=256,
truncation=True
)
sst2_dataset = datasets.load_dataset("glue", "sst2", num_proc=os.cpu_count() - 1)
tokenized_sst2_dataset = sst2_dataset.map(
tokenize_function,
batched=True,
num_proc=cpu_count(),
batch_size=100,
remove_columns=['idx', 'sentence']
)
train_dataset = tokenized_sst2_dataset["train"]
eval_dataset = tokenized_sst2_dataset["validation"]
创建数据加载器
from torch.utils.data import DataLoader
data_collator = transformers.data.data_collator.default_data_collator
train_dataloader = DataLoader(
train_dataset,
batch_size=16,
shuffle=False,
drop_last=False,
collate_fn=data_collator
)
eval_dataloader = DataLoader(
eval_dataset,
batch_size=16,
shuffle=False,
drop_last=False,
collate_fn=data_collator
)
模型包装与训练配置
将Hugging Face模型转换为Composer模型
Composer提供了HuggingFaceModel
包装器,方便将Hugging Face模型转换为Composer可用的格式。
from torchmetrics.classification import MulticlassAccuracy
from composer.models.huggingface import HuggingFaceModel
from composer.metrics import CrossEntropy
metrics = [CrossEntropy(), MulticlassAccuracy(num_classes=2, average='micro')]
composer_model = HuggingFaceModel(
model,
tokenizer=tokenizer,
metrics=metrics,
use_logits=True
)
优化器与学习率调度器
我们使用AdamW优化器和线性学习率衰减策略:
from torch.optim import AdamW
from torch.optim.lr_scheduler import LinearLR
optimizer = AdamW(
params=composer_model.parameters(),
lr=3e-5,
betas=(0.9, 0.98),
eps=1e-6,
weight_decay=3e-6
)
linear_lr_decay = LinearLR(
optimizer,
start_factor=1.0,
end_factor=0,
total_iters=150
)
模型训练
配置Composer Trainer
import torch
from composer import Trainer
trainer = Trainer(
model=composer_model,
train_dataloader=train_dataloader,
eval_dataloader=eval_dataloader,
max_duration="1ep", # 训练1个epoch
optimizers=optimizer,
schedulers=[linear_lr_decay],
device='gpu' if torch.cuda.is_available() else 'cpu',
train_subset_num_batches=150, # 限制训练batch数量
precision='fp32',
seed=17 # 固定随机种子保证可复现性
)
开始训练
trainer.fit()
结果分析与模型保存
评估模型性能
trainer.state.eval_metrics
仅用150次迭代训练,模型就能达到约86%的准确率。
可视化预测结果
eval_batch = next(iter(eval_dataloader))
eval_batch = {k: v.cuda() if torch.cuda.is_available() else v for k, v in eval_batch.items()}
with torch.no_grad():
predictions = composer_model(eval_batch)["logits"].argmax(dim=1)
predictions = predictions[:5] # 只看前5个样本
label = ['negative', 'positive']
for i, prediction in enumerate(predictions):
sentence = sst2_dataset["validation"][i]["sentence"]
correct_label = label[sst2_dataset["validation"][i]["label"]]
prediction_label = label[prediction]
print(f"样本: {sentence}")
print(f"真实标签: {correct_label}")
print(f"预测结果: {prediction_label}")
print()
保存模型
torch.save(trainer.state.model.state_dict(), 'model.pt')
进阶学习建议
- 尝试在更大规模的数据集上进行预训练和微调
- 探索Composer的其他功能,如模型分割、早期停止等
- 实验不同的优化策略和学习率调度器
- 尝试将模型部署到生产环境
通过本教程,您已经掌握了使用MosaicML Composer微调Hugging Face模型的核心流程。这种组合既能利用Hugging Face丰富的预训练模型资源,又能发挥Composer在训练效率上的优势,是NLP任务开发的强大工具组合。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考