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

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

标签:
杂七杂八
概述

大模型微调学习是当前自然语言处理领域的重要实践,本文以Qwen2-1.5B-Instruct模型为例,深入介绍了从环境准备、数据集准备到模型加载的关键步骤。首先,确保您的计算机配置满足Python 3.8及以上、至少10GB GPU显存等条件,并安装必要的库。接着,从魔搭社区下载zh_cls_fudan_news数据集,并进行格式化处理。在模型方面,使用modelscope下载并加载Qwen2-1.5B-Instruct模型至Transformers中。之后,整合SwanLab作为训练可视化工具,设置训练参数,并集成SwanLab回调功能监控训练过程。最后,本文提供了一个完整的代码示例,包括数据集转换、预处理、模型加载、微调参数设置、以及训练回调函数的集成,详细指导了基于Qwen2-1.5B-Instruct模型在特定数据集上的指令微调工作流程。

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

环境准备

在开始之前,请确保你的计算机满足以下要求:

  • Python版本:3.8或更高
  • GPU显存:至少10GB(推荐使用NVIDIA显卡)
  • 安装库swanlab, modelscope, transformers, datasets, peft, accelerate, pandas

可以使用以下命令进行安装:

pip install swanlab modelscope transformers datasets peft pandas accelerate

数据集准备

你需要从魔搭社区下载数据集zh_cls_fudan_news。数据集包含以下内容:

  • train.jsonl
  • test.jsonl

在下载后,请确保数据集位于你的本地目录。

加载模型

使用modelscope下载Qwen2-1.5B-Instruct模型,并加载到Transformers中:

from modelscope import snapshot_download
from transformers import AutoTokenizer

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)

准备训练可视化工具

使用SwanLab来监控训练过程和评估模型表现:

from swanlab.integration.huggingface import SwanLabCallback

swanlab_callback = SwanLabCallback(...)

trainer_args = TrainingArguments(
    output_dir="./output",
    per_device_train_batch_size=4, 
    num_train_epochs=2,
    logging_steps=10,
    gradient_accumulation_steps=4,
)

trainer = Trainer(
    model=model,
    args=trainer_args,
    train_dataset=train_dataset,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
    callbacks=[swanlab_callback],
)

完整代码

以下是一个完整的代码示例,包括数据集转换、预处理、模型加载、微调参数设置、训练回调函数集成SwanLab:

数据集转换和预处理:

import json
import pandas as pd

def dataset_jsonl_transfer(origin_path, new_path):
    messages = []
    with open(origin_path, "r") as file:
        for line in file:
            data = json.loads(line)
            context = data["text"]
            category = data["category"]
            output = data["output"]
            message = {
                "instruction": "你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型",
                "input": f"文本:{context},类型选型:{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")

数据集读取与处理:

def process_func(example):
    MAX_LENGTH = 384
    input_ids = tokenizer(f"系统\n你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型\n用户\n{example['input']}\n助手\n", add_special_tokens=False).input_ids + tokenizer(f"{example['output']}", add_special_tokens=False).input_ids + [tokenizer.pad_token_id]
    attention_mask = (tokenizer(f"系统\n你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型\n用户\n{example['input']}\n助手\n", add_special_tokens=False).attention_mask + tokenizer(f"{example['output']}", add_special_tokens=False).attention_mask + [1])
    labels = [-100] * len(tokenizer(f"系统\n你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型\n用户\n{example['input']}\n助手\n", add_special_tokens=False).input_ids) + tokenizer(f"{example['output']}", add_special_tokens=False).input_ids + [tokenizer.pad_token_id]
    if len(input_ids) > MAX_LENGTH:
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}

推理模型

训练完成后,模型保存在指定的输出目录。以下为推理模型加载代码示例:

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 = PeftModel.from_pretrained(model, model_id="./output/Qwen2/checkpointXXX")

# 键入测试文本并推理
test_text = "文本:航空动力学报JOURNAL OF AEROSPACE POWER1998年 第4期 No.4 1998科技期刊管路系统敷设的并行工程模型研究*陈志英* * 马 枚北京航空航天大学【摘要】 提出了一种应用于并行工程模型转换研究的标号法,该法是将现行串行设计过程(As-is)转换为并行设计过程(To-be)。"
input_tokens = tokenizer(test_text).input_ids

完成所有步骤后,你的大模型微调工作将顺利完成。此代码示例为基于Qwen2-1.5B-Instruct模型在zh_cls_fudan_news数据集上的指令微调流程提供了一个具体指引。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消