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

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

标签:
杂七杂八
概述

微调Qwen2大模型,实现文本分类任务,是构建语言模型高效应用的关键步骤。本文提供了一套从环境安装、数据集准备、模型加载到微调训练的详细指南和完整代码示例。通过遵循以下步骤,您可以从零基础入门到精通整个微调流程:

  1. 环境安装:确保Python环境支持CUDA,使用pip安装包括swanlab、modelscope、transformers等在内的关键库,以支持Qwen2模型的微调。

  2. 数据集准备:利用魔搭社区下载复旦中文新闻数据集,并通过特定的函数解析和预处理JSONL文件,将数据转换为适合微调的结构。

  3. 模型加载与配置:从ModelScope下载Qwen2-1.5B-Instruct模型,集成SwanLab监控训练过程,为高效训练做好准备。

  4. 完整代码与训练流程:实现数据集的完整代码流程,从数据加载、预处理到模型训练、测试,提供了一个完整的训练脚本示例。

  5. 结果演示与推理:通过SwanLab可视化训练结果,评估模型在测试数据集上的表现。

本教程的代码示例和脚本可在GitHub仓库中找到,包含实验日志和详细的模型与数据集来源链接,帮助您下载和直接使用。此外,还有官方文档和相关参考文章链接,提供深入的技术支持和理论指导。

环境安装

为了开始实践Qwen2大模型微调,您需要安装一系列Python库。确保您的Python环境支持CUDA,以在GPU上运行代码。您可以通过以下命令安装所有所需的库:

pip install swanlab modelscope transformers datasets peft accelerate pandas

这些库包括:

  • swanlab:提供模型训练监控的工具。
  • modelscope:包含Qwen2模型的仓库。
  • transformers:用于处理语言模型的库。
  • datasets:数据集处理库。
  • peft:用于微调模型的库。
  • accelerate:加速训练过程的库。
  • pandas:用于数据处理和分析。

确保您的环境已安装了PyTorch和CUDA支持。

准备数据集

我们将使用复旦中文新闻(zh_cls_fudan-news)数据集。通过魔搭社区(ModelScope)下载数据集文件:

  • 训练集 train.jsonl
  • 测试集 test.jsonl

数据集解析与预处理

数据集包含以下结构:

  • text:文本内容
  • category:分类选项列表
  • output:真实类别

示例代码

首先,创建一个函数来解析原始JSONL文件并格式化为微调所需的结构:

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"]
            categories = data["categories"]
            output = data["output"]
            if output not in categories:
                categories.append(output)
            message = {
                "instruction": "输出这段文本的正确类别",
                "input": f"文本: {context}, 类别: {', '.join(categories)}",
                "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")
加载模型

使用ModelScope下载Qwen2-1.5B-Instruct模型:

from modelscope import snapshot_download

model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct", cache_dir="./")
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")
完整代码与训练流程

以下是一个完整的训练脚本示例:

import json
import pandas as pd
import torch
from datasets import Dataset

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"]
            categories = data["categories"]
            output = data["output"]
            if output not in categories:
                categories.append(output)
            message = {
                "instruction": "输出这段文本的正确类别",
                "input": f"文本: {context}, 类别: {', '.join(categories)}",
                "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):
    # 数据预处理逻辑
    pass

def predict(messages, model, tokenizer):
    # 预测逻辑
    pass

def main():
    model_dir = "path/to/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()

    # 加载、处理数据集
    train_jsonl_new_path = "path/to/train.jsonl"
    test_jsonl_new_path = "path/to/test.jsonl"
    dataset_jsonl_transfer("path/to/raw/train.jsonl", train_jsonl_new_path)
    dataset_jsonl_transfer("path/to/raw/test.jsonl", test_jsonl_new_path)

    # 训练配置
    config = ...
    args = ...
    trainer = Trainer(model=model, args=args, callbacks=[swanlab_callback])
    trainer.train()

    # 测试模型
    test_df = pd.read_json(test_jsonl_new_path, lines=True)[:10]
    # 在此处实现测试逻辑
    # 如:predict_batch(test_df, model, tokenizer)

if __name__ == "__main__":
    main()
训练结果演示与推理

训练完成后,使用SwanLab可视化训练进度,评估模型效果。在训练过程中,SwanLab会提供持续监控。

推理部分用于评估模型在未见过的数据上的表现。这可以通过在测试数据上运行模型并比较预测结果与实际类别来完成。

相关链接

完整的代码示例和脚本可以在我的GitHub仓库找到,以便您直接下载和使用。

Github仓库链接

GitHub存储库

Jupyter Notebook实验日志

实验日志

模型与数据集来源

复旦中文新闻数据集

官方文档与参考文章链接

通过遵循上述步骤和代码示例,您可以从零开始构建Qwen2模型的微调流程,从而实现文本分类任务。实际应用中,您可能需要根据具体需求调整数据处理、模型配置和训练参数。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消