在探索大模型微调领域时,Qwen2(通义千问)
作为阿里云通义实验室的开源大语言模型,提供了一个宝贵的起点。本文章将引导你从零开始,通过指令微调的方式,使用Qwen2-1.5B-Instruct
模型在zh_cls_fudan-news
数据集上实现文本分类任务,并集成SwanLab
进行训练过程监控,最终构建一个自定义的文本分类模型。我们概述整个流程,从环境安装、数据集准备、模型加载到优化和训练可视化,确保你能够顺利实现微调并利用SwanLab
进行训练结果的实时监控。
首先,确保你的系统已安装Python环境,特别是对CUDA的支持。接下来,安装一系列关键库,包括swanlab
、modelscope
、transformers
、datasets
、peft
、accelerate
和pandas
,这些库为模型加载、数据处理、训练和可视化提供所需功能。
pip install swanlab modelscope transformers datasets peft accelerate pandas
准备数据集
选择合适的数据集对于微调至关重要。对于此任务,zh_cls_fudan-news
数据集是一个理想选择,它包含用于训练的文本片段、类别标签和实际分类类别,非常适合Qwen2模型的指令微调。确保从魔搭社区下载数据集的文件train.jsonl
和test.jsonl
,并将其存储在项目根目录下。
使用modelscope
加载Qwen2-1.5B-Instruct
模型,并将它配置到Transformers
框架中进行训练。这一步是微调模型的基础,确保模型能够针对特定的分类任务进行适应。
from modelscope import snapshot_download, AutoTokenizer
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
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
不仅能够直观显示模型训练过程中的关键指标,如损失和精度,还能确保训练过程高效且稳定。通过集成SwanLab
与Transformers
,你可以在训练过程中实时监控模型性能,及时调整训练参数以优化结果。
为了实际集成SwanLab,我们假设已经安装了swanlab
库。在训练阶段,我们添加SwanLab回调到训练器中,以实时监控训练进度。
from swanlab.integration.huggingface import SwanLabCallback
swanlab_callback = SwanLabCallback(...)
training_args = TrainingArguments(
output_dir='./results',
per_device_train_batch_size=4,
num_train_epochs=3,
save_steps=100,
logging_steps=10,
evaluation_strategy='steps',
eval_steps=100,
learning_rate=5e-5,
warmup_steps=100,
save_total_limit=2,
)
trainer = Trainer(
model=model,
args=training_args,
callbacks=[swanlab_callback],
# 其他Trainer配置
)
代码实现与完整训练流程
构建一个完整的训练脚本train.py
,结合数据预处理、模型微调、训练可视化以及结果评估的代码框架。以下是一个简化版的脚本示例,展示了如何进行数据预处理、模型初始化、配置训练参数、准备Lora优化器、设置训练和评估策略、训练模型以及展示训练结果。此外,还包括了推理训练后模型的代码示例,验证模型在新数据上的表现。
# train.py
import json
import pandas as pd
from datasets import Dataset
import os
from swanlab.integration.huggingface import SwanLabCallback
from peft import LoraConfig, TaskType
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
def load_data(path):
return pd.read_json(path, lines=True)
def process_data(df):
df['prompt'] = df['text'] + '分类:' + df['category']
df['answer'] = df['output']
return df
def convert_to_hf_format(df, tokenizer):
def format_example(ex):
return {
'prompt': ex['prompt'],
'answer': ex['answer']
}
return df.apply(format_example, axis=1)
def prepare_train_data(path):
df = load_data(path)
df = process_data(df)
df = convert_to_hf_format(df, tokenizer)
return df
def evaluate(model, tokenizer, test_data):
test_df = prepare_train_data('test.jsonl')
test_dataset = Dataset.from_pandas(test_df)
test_dataset = test_dataset.map(lambda ex: {'input_ids': tokenizer(ex['prompt'], padding=True, truncation=True)['input_ids'], 'labels': tokenizer(ex['answer'], padding=True, truncation=True)['input_ids']})
# 评估模型
results = model.evaluate(test_dataset)
return results
model_dir = "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)
model.enable_input_require_grads()
def train_model():
# 数据预处理
train_data = load_data('train.jsonl')
train_df = prepare_train_data('train.jsonl')
# 设置训练参数
training_args = TrainingArguments(
output_dir='./results',
per_device_train_batch_size=4,
num_train_epochs=3,
save_steps=100,
logging_steps=10,
evaluation_strategy='steps',
eval_steps=100,
learning_rate=5e-5,
warmup_steps=100,
save_total_limit=2,
)
# Lora配置
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1,
)
# 初始化模型与Lora配置
model = get_peft_model(model, lora_config)
# 设置训练器和SwanLab回调
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_df,
callbacks=[SwanLabCallback()],
)
# 训练模型
trainer.train()
# 评估模型
evaluate(model, tokenizer, 'test.jsonl')
train_model()
通过上述步骤和提供的代码示例,你可以成功地建立一个基于Qwen2模型的文本分类微调系统,并在SwanLab上实时监控训练过程。这个过程不仅可以帮助你理解大模型微调的基本原理,也为你在实际项目中应用类似技术提供了坚实的基础。
在微调过程中,确保对数据集进行适当的预处理,选择合适的超参数配置,以及主动监控模型性能和训练过程,可以显著提升微调效果和模型泛化能力。
共同学习,写下你的评论
评论加载中...
作者其他优质文章