概述
大模型微调教程:从入门到实战
在本文中,我们围绕Qwen2大模型进行微调,旨在提供一个全面、直接且实用的入门指南。从环境配置到模型加载,从数据准备到训练过程监控,直至推理结果演示,我们将详细介绍微调过程的关键步骤,并通过完整代码示例辅助理解。
环境安装与数据集准备
确保系统满足如下要求,安装必要的库并从ModelScope下载所需的训练数据集:
pip install swanlab modelscope transformers datasets peft pandas accelerate
数据集准备:
- 数据集来源:复旦中文新闻 (ModelScope)
- 数据集结构:
text
(文本内容)category
(文本类别)output
(分类结果)
从 ModelScope 下载 train.jsonl
和 test.jsonl
文件至本地目录。
加载模型与配置训练可视化工具
使用ModelScope下载 Qwen2-1.5B-Instruct 模型,并通过Transformers加载模型权重,同时集成SwanLab进行训练过程监控与效果评估:
from modelscope import snapshot_download
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained(model_dir, use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", torch_dtype=torch.bfloat16)
swanlab_callback = SwanLabCallback(project="Qwen2-fintune", experiment_name="Qwen2-1.5B-Instruct")
完整代码逻辑与训练流程
构建训练逻辑,包括数据预处理、训练模型以及SwanLab回调集成:
import json
from datasets import Dataset
def dataset_transfer(file_path, new_path):
messages = []
with open(file_path, "r") as file:
for line in file:
data = json.loads(line)
instruction = "你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型"
input_data = f"文本:{data['text]},类型选型:{data['category']}"
label = data['output']
messages.append({"instruction": instruction, "input": input_data, "output": label})
with open(new_path, "w") as file:
for message in messages:
json.dump(message, file)
file.write("\n")
def preprocess_data(file_path):
dataset = Dataset.from_pandas(pd.read_json(file_path, lines=True))
return dataset
# 数据预处理
train_path = "train.jsonl"
test_path = "test.jsonl"
new_train_path = "new_train.jsonl"
new_test_path = "new_test.jsonl"
dataset_transfer(train_path, new_train_path)
dataset_transfer(test_path, new_test_path)
# 数据加载与预处理
train_dataset = preprocess_data(new_train_path)
test_dataset = preprocess_data(new_test_path)
# 训练参数与模型调优
lora_config = LoraConfig(task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
model = get_peft_model(model, lora_config)
training_args = TrainingArguments(
output_dir="./output/Qwen1.5",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
logging_steps=10,
num_train_epochs=2,
save_steps=100,
learning_rate=1e-4,
save_on_each_node=True,
gradient_checkpointing=True,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
callbacks=[swanlab_callback],
)
trainer.train()
推理与结果演示
训练完成后,使用模型进行推理,展示模型在特定任务上的表现,并通过SwanLab项目页面查看训练结果:
def inference(model, tokenizer, data_path):
dataset = Dataset.from_pandas(pd.read_json(data_path, lines=True))
predictions = dataset.map(lambda example: {"input": example["input"]}, batched=True)
model.eval()
with torch.no_grad():
generated_ids = model.generate(
torch.tensor([tokenizer.encode(pred["input"], add_special_tokens=True) for pred in predictions]).to(model.device),
max_length=100,
)
predictions = [{"input": pred["input"], "output": tokenizer.decode(ids)} for pred, ids in zip(predictions, generated_ids)]
return predictions
# 使用训练好的模型进行推理
predictions = inference(model, tokenizer, "new_test_path")
推荐资源与学习路径
- 代码实现代码:已包含在上述训练脚本中。
- 实验日志:通过SwanLab在
Qwen2-fintune
项目页面监控训练过程和效果。 - 获取完整代码:GitHub仓库链接。
- 查看训练结果:在SwanLab项目页面上查看训练结果。
结语
本文提供了一个从零开始了解和实践微调Qwen2大模型的全面指南,从环境准备、模型加载到数据处理、训练设置直至推理结果展示,涵盖关键步骤和代码示例。通过遵循此教程,开发者将能够掌握微调技术的核心技巧,并在实际应用中提升模型性能。建议在实践过程中根据项目需求调整参数与策略,以实现最佳效果。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦