微调学习是一种通过调整预训练模型参数以适应特定任务的机器学习技术。本文档将引导您完成使用Qwen2大模型进行微调的实战教程,涵盖环境安装、数据集准备、模型加载与训练等关键步骤。通过操作,您将掌握从零基础入门到精通微调技术的全过程,并学会如何在实际问题中应用微调模型。本文档包括详细代码示例,覆盖所有步骤,并附有相关链接以获取完整代码、实验日志、模型来源、数据集来源以及SwanLab使用文档。在完成训练后,您可以使用训练好的模型进行任务预测,实践微调模型在具体任务中的应用。通过本文档,您将能高效地掌握微调学习的基本方法与应用技巧。
环境安装在您的计算机上安装Python环境,确保版本不低于3.8。对于本案例,您还需要一张英伟达显卡,显存要求大约10GB左右。以下是使用命令行安装所需库的代码:
pip install swanlab modelscope transformers datasets peft accelerate pandas
准备数据集
使用魔搭社区提供的zh_cls_fudan-news
数据集,该数据集主要用于文本分类任务。数据集由数千条记录组成,每条记录包含text
、category
、output
三列:
text
:文本语料内容category
:文本可能的分类选项列表output
:文本的唯一真实类型
以下是数据集的例子:
{
"text": "第四届全国大企业足球赛复赛结束新华社郑州5月3日电(实习生田兆运)上海大隆机器厂队昨天在洛阳进行的第四届牡丹杯全国大企业足球赛复赛中,以5:4力克成都冶金实验厂队,进入前四名。",
"category": ["体育", "政治"],
"output": "体育"
}
数据集可以下载到本地目录,确保它们与你的代码文件位于同一目录下。
加载模型通过modelscope下载Qwen2-1.5B-Instruct
模型,并使用Transformers加载模型进行训练:
from modelscope import snapshot_download
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct", cache_dir="./", revision="master")
tokenizer = AutoTokenizer.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", device_map="auto", torch_dtype=torch.bfloat16)
配置训练可视化工具
使用SwanLab监控训练过程,集成SwanLab与Transformers:
from swanlab.integration.huggingface import SwanLabCallback
swanlab_callback = SwanLabCallback(...)
trainer = Trainer(
model=model,
args=TrainingArguments(...),
callbacks=[swanlab_callback]
)
在开始训练之前,请访问SwanLab网站完成账号注册并获取API Key,以便在训练开始时输入其中。
完整代码(train.py
文件)
数据预处理与加载
import json
import pandas as pd
from datasets import Dataset
def dataset_jsonl_transfer(origin_path, new_path):
"""
将原始数据集转换为大模型微调所需数据格式的新数据集
"""
messages = []
with open(origin_path, "r") as file:
for line in file:
data = json.loads(line)
text = data["text"]
category = data["category"]
output = data["output"]
message = {
"instruction": "你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型",
"input": f"文本:{text},类型选型:{category}",
"output": output,
}
messages.append(message)
with open(new_path, "w", encoding="utf-8") as file:
for message in messages:
file.write(json.dumps(message, ensure_ascii=False) + "\n")
# 加载预处理后的数据集
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_dataset = Dataset.from_pandas(train_df)
模型加载与配置
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
model = AutoModelForCausalLM.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", device_map="auto", torch_dtype=torch.bfloat16)
model.enable_input_require_grads()
# 配置训练参数
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,
report_to="none",
)
# 实例化SwanLab回调
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()
推理训练好的模型
def predict(messages, model, tokenizer):
device = "cuda"
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
return response
# 使用训练好的模型进行预测
predictions = predict(messages, model, tokenizer)
训练结果演示
在SwanLab上查看训练结果,可以看到训练过程和模型效果展示。
推理训练好的模型训好的模型默认保存在./output/Qwen2
文件夹下。使用代码进行推理:
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("./output/Qwen2/checkpointXXX", device_map="auto", torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("./qwen/Qwen2-1___5B-Instruct/")
相关链接
- 代码:完整代码直接在本文第5节查看或通过GitHub链接获取。
- 实验日志:SwanLab监控页面链接。
- 模型来源:Modelscope。
- 数据集来源:魔搭社区。
- SwanLab使用文档:官方指南。
通过上述步骤,你已经完成了Qwen2的指令微调入门实战,并成功训练和使用了模型。本指南提供了从环境搭建、数据处理、模型加载到训练和预测的详细步骤,适合初学者入门学习。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章