概述
Qwen2大模型微调入门实战(非常详细)
微调教程概述
在本文中,我们深入探讨了利用Qwen2大模型进行微调的整个过程,从环境安装到数据集准备,再到模型加载与训练。通过逐步指导,零基础读者亦能轻松上手,从入门到精通微调技术。本文不仅提供了Python环境的配置方法、数据集的转换策略,还详细说明了模型的加载、训练参数的设定,以及SwanLab工具的集成,从而实现可视化训练过程。通过遵循本文的指导,读者将收获一套完整的微调实践方案,包括代码示例和实验链接,帮助您有效提升模型性能并解决特定任务。
环境安装Python环境要求
确保您的Python环境版本>=3.8,并且安装了CUDA驱动。以下是安装所需的几个Python库的命令:
pip install swanlab modelscope transformers datasets peft accelerate pandas
注意:本示例在以下版本中测试过:modelscope1.14.0、transformers4.41.2、datasets2.18.0、peft0.11.1、accelerate0.30.1、swanlab0.3.9,请确保安装的是兼容版本的库。
准备数据集数据集来源与格式处理
数据集来源
- 使用
zh_cls_fudan-news
数据集,您可以在魔搭社区下载train.jsonl和test.jsonl。
数据集格式处理
将原始格式转换为适合微调的格式:
- 下载数据集:从魔搭社区下载train.jsonl和test.jsonl。
- 转换数据集:编写脚本将数据集从原始格式转换为所需的格式。
def dataset_jsonl_transfer(origin_path, new_path):
messages = []
with open(origin_path, "r", encoding="utf-8") as file:
for line in file:
data = json.loads(line)
text = data["text"]
category = data["category"]
output = data["output"]
messages.append({
"instruction": "你是一个文本分类领域的专家,你需要根据输入的文本和几个潜在的分类选项,输出文本内容的正确类型。",
"input": f"文本:{text}, 类型选项:{category}",
"output": output
})
with open(new_path, "w", encoding="utf-8") as file:
for message in messages:
file.write(json.dumps(message, ensure_ascii=False) + "\n")
加载模型
使用modelscope下载模型
在完成环境安装后,使用modelscope下载Qwen2-1.5B-Instruct
模型:
from modelscope import snapshot_download
model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct", cache_dir="./", revision="master")
加载模型到transformers
库中:
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq
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)
model.enable_input_require_grads()
配置训练可视化工具
使用SwanLab进行监控和可视化:
from swanlab.integration.huggingface import SwanLabCallback
swanlab_callback = SwanLabCallback(...)
训练过程可以通过SwanLab进行监控。
完整代码代码结构
在训练之前,先确保数据集已准备并转换为正确的格式。
import json
import pandas as pd
from modelscope import snapshot_download
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
数据集预处理函数
def dataset_jsonl_transfer(origin_path, new_path):
messages = []
with open(origin_path, "r", encoding="utf-8") as file:
for line in file:
data = json.loads(line)
text = data["text"]
category = data["category"]
output = data["output"]
messages.append({
"instruction": "你是一个文本分类领域的专家,你需要根据输入的文本和几个潜在的分类选项,输出文本内容的正确类型。",
"input": f"文本:{text}, 类型选项:{category}",
"output": output
})
with open(new_path, "w", encoding="utf-8") as file:
for message in messages:
file.write(json.dumps(message, ensure_ascii=False) + "\n")
训练函数
def process_func(example):
MAX_LENGTH = 384
input_ids, attention_mask, labels = [], [],
# 处理指令、输入和输出数据
instruction = example["instruction"]
input_text = example["input"]
output_text = example["output"]
# 使用tokenizer进行编码
input_ids = tokenizer.encode(input_text, truncation=True, max_length=MAX_LENGTH, padding="max_length", return_tensors="pt")
attention_mask = torch.ones_like(input_ids)
labels = tokenizer.encode(output_text, truncation=True, max_length=MAX_LENGTH, padding="max_length", return_tensors="pt")
return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}
def predict(messages, model, tokenizer):
# 预测函数
# ...
训练代码
model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct", cache_dir="./", revision="master")
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)
model.enable_input_require_grads()
# 数据集路径
train_dataset_path = "train.jsonl"
test_dataset_path = "test.jsonl"
# 数据集转换
train_jsonl_new_path = "new_train.jsonl"
test_jsonl_new_path = "new_test.jsonl"
if not os.path.exists(train_jsonl_new_path):
dataset_jsonl_transfer(train_dataset_path, train_jsonl_new_path)
if not os.path.exists(test_jsonl_new_path):
dataset_jsonl_transfer(test_dataset_path, test_jsonl_new_path)
# 加载数据集
train_df = pd.read_json(train_jsonl_new_path, lines=True)
train_ds = Dataset.from_pandas(train_df)
train_dataset = train_ds.map(process_func, remove_columns=train_ds.column_names)
# 设置训练参数
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1,
)
model = get_peft_model(model, config)
# 训练参数
args = TrainingArguments(
output_dir="./output/Qwen2",
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,
report_to="none",
)
swanlab_callback = SwanLabCallback(
project="Qwen2-fintune",
experiment_name="Qwen2-1.5B-Instruct",
description="使用通义千问Qwen2-1.5B-Instruct模型在zh_cls_fudan-news数据集上微调。",
config={
"model": "qwen/Qwen2-1.5B-Instruct",
"dataset": "huangjintao/zh_cls_fudan-news",
},
)
trainer = Trainer(
model=model,
args=args,
train_dataset=train_dataset,
data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
callbacks=[swanlab_callback],
)
trainer.train()
训练结果演示
使用SwanLab查看训练过程和结果,通常包括训练损失的下降、epoch的迭代情况等。
推理训练好的模型训练结束后,模型会被保存,可以用于推理:
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)
# 模型推理代码
相关链接
- 完整代码: Github仓库包含完整的代码示例。
- 实验日志: SwanLab提供了详细的训练过程和结果。
- 数据集: 直接从魔搭社区下载
zh_cls_fudan-news
数据集。 - SwanLab: 监控和可视化训练过程的工具。
在进行微调过程中,请确保遵循所有开源许可协议,尊重知识产权。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦