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

Qwen2大模型微调入门实战(附完整代码)(非常详细)零基础入门到精通,收藏这一篇就够了

标签:
杂七杂八
概述

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。

数据集格式处理

将原始格式转换为适合微调的格式:

  1. 下载数据集:从魔搭社区下载train.jsonl和test.jsonl。
  2. 转换数据集:编写脚本将数据集从原始格式转换为所需的格式。
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 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消