为了账号安全,请及时绑定邮箱和手机立即绑定

Qwen2大模型微调入门实战(完整代码)

标签:
杂七杂八

在探索大模型微调领域时,Qwen2(通义千问)作为阿里云通义实验室的开源大语言模型,提供了一个宝贵的起点。本文章将引导你从零开始,通过指令微调的方式,使用Qwen2-1.5B-Instruct模型在zh_cls_fudan-news数据集上实现文本分类任务,并集成SwanLab进行训练过程监控,最终构建一个自定义的文本分类模型。我们概述整个流程,从环境安装、数据集准备、模型加载到优化和训练可视化,确保你能够顺利实现微调并利用SwanLab进行训练结果的实时监控。

环境安装

首先,确保你的系统已安装Python环境,特别是对CUDA的支持。接下来,安装一系列关键库,包括swanlabmodelscopetransformersdatasetspeftacceleratepandas,这些库为模型加载、数据处理、训练和可视化提供所需功能。

pip install swanlab modelscope transformers datasets peft accelerate pandas
准备数据集

选择合适的数据集对于微调至关重要。对于此任务,zh_cls_fudan-news数据集是一个理想选择,它包含用于训练的文本片段、类别标签和实际分类类别,非常适合Qwen2模型的指令微调。确保从魔搭社区下载数据集的文件train.jsonltest.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不仅能够直观显示模型训练过程中的关键指标,如损失和精度,还能确保训练过程高效且稳定。通过集成SwanLabTransformers,你可以在训练过程中实时监控模型性能,及时调整训练参数以优化结果。

为了实际集成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上实时监控训练过程。这个过程不仅可以帮助你理解大模型微调的基本原理,也为你在实际项目中应用类似技术提供了坚实的基础。

在微调过程中,确保对数据集进行适当的预处理,选择合适的超参数配置,以及主动监控模型性能和训练过程,可以显著提升微调效果和模型泛化能力。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消