微调Qwen2-1.5B-Instruct大模型的入门实战,从零基础到精通的代码详解,覆盖环境准备、数据集下载、模型加载、训练可视化工具配置及完整代码示例。目标是使用复旦新闻分类数据集,实现通义千问Qwen2-1.5B-Instruct模型的微调。通过创建目录结构与训练代码,实现对模型的训练与监控,最后通过SwanLab演示模型在测试数据上的应用,验证模型对文本分类的准确率。整个流程包括了环境配置、数据处理、模型训练与评估,以及最终的模型保存与加载,旨在提供一个全面的微调实践指南。
环境准备安装必备库
确保Python环境版本大于3.8,使用pip安装以下库:
pip install swanlab modelscope transformers datasets peft accelerate pandas
确认以下库的版本与测试环境一致:
- swanlab: 0.3.9
- modelscope: 1.14.0
- transformers: 4.41.2
- datasets: 2.18.0
- peft: 0.11.1
- accelerate: 0.30.1
使用复旦新闻分类数据集
访问魔搭社区下的复旦新闻分类数据集zh_cls_fudan-news,下载train.jsonl
和test.jsonl
文件至本地目录。
数据集结构如下:
text
:文本内容category
:文本可能的分类列表output
:文本的准确分类
使用模型scope下载Qwen2-1.5B-Instruct模型
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)
训练可视化工具配置
使用SwanLab集成监控训练过程
from swanlab.integration.huggingface import SwanLabCallback
swanlab_callback = SwanLabCallback(project="Qwen2-fintune", experiment_name="Qwen2-1.5B-Instruct", description="微调通义千问Qwen2-1.5B-Instruct模型在复旦新闻分类数据集")
trainer = Trainer(model=model, callbacks=[swanlab_callback])
完整代码示例
目录结构与训练代码
创建目录结构:
train.py
train.jsonl
test.jsonl
train.py 文件内容:
import json
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import Dataset
def process_data(jsonl_path):
with open(jsonl_path, "r") as file:
data = file.readlines()
return [json.loads(line) for line in data]
def prepare_data(messages):
input_ids, attention_mask, labels = [], [], []
for message in messages:
instruction = tokenizer(message["instruction"], add_special_tokens=False)["input_ids"]
output = tokenizer(message["output"], add_special_tokens=False)["input_ids"]
input_ids.extend(instruction + output + [tokenizer.pad_token_id])
attention_mask.extend([1] * len(instruction) + [1] * len(output) + [1])
labels.extend([-100] * len(instruction) + output + [tokenizer.pad_token_id])
if len(input_ids) > 384:
input_ids = input_ids[:384]
attention_mask = attention_mask[:384]
labels = labels[:384]
return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}
def main():
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_jsonl_path = "train.jsonl"
messages = process_data(train_jsonl_path)
prepared_data = prepare_data(messages)
train_dataset = Dataset.from_dict(prepared_data)
training_args = TrainingArguments(output_dir="./output", per_device_train_batch_size=4, num_train_epochs=2)
trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
trainer.train()
test_jsonl_path = "test.jsonl"
test_messages = process_data(test_jsonl_path)
predictions = []
for message in test_messages:
input_text = f"你是一个文本分类领域的专家,请根据文本内容和分类选项,输出文本内容的正确类型:文本:{message['text']}, 类型选型:{message['category']}"
input_ids = tokenizer(input_text, return_tensors="pt")["input_ids"]
generated_ids = model.generate(input_ids, max_new_tokens=512)
output = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
predictions.append(output)
return predictions
if __name__ == "__main__":
predictions = main()
print(predictions)
训练细节与结果演示
在SwanLab上监控训练过程,查看loss变化、运行状态等指标,确保模型训练效果满意。
在SwanLab中演示模型在测试数据上的应用,观察模型对文本分类的准确率。
推理与模型保存
模型训练完成后,保存模型权重:
model.save_pretrained("Qwen2-1.5B-Instruct_finetuned")
tokenizer.save_pretrained("Qwen2-1.5B-Instruct_finetuned")
使用时加载模型进行推理:
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("Qwen2-1.5B-Instruct_finetuned", device_map="auto", torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("Qwen2-1.5B-Instruct_finetuned")
通过调用evaluate_model
函数,检验模型在测试集上的效果。
通过此代码示例,实现了从零基础到精通的微调实践指南,覆盖了环境准备、数据集下载、模型加载、训练、评估和模型保存的完整流程,提供了一站式解决方案。