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

Qwen2大模型微调入门实战:零基础到精通的代码详解

标签:
杂七杂八
概述

微调Qwen2-1.5B-Instruct大模型的入门实战,从零基础到精通的代码详解,覆盖环境准备、数据集下载、模型加载、训练可视化工具配置及完整代码示例。目标是使用复旦新闻分类数据集,实现通义千问Qwen2-1.5B-Instruct模型的微调。通过创建目录结构与训练代码,实现对模型的训练与监控,最后通过SwanLab演示模型在测试数据上的应用,验证模型对文本分类的准确率。整个流程包括了环境配置、数据处理、模型训练与评估,以及最终的模型保存与加载,旨在提供一个全面的微调实践指南。

环境准备

安装必备库

确保Python环境版本大于3.8,使用pip安装以下库:

pip install swanlab modelscope transformers datasets peft accelerate pandas

确认以下库的版本与测试环境一致:

  • swanlab: 0.3.9
  • modelscope: 1.14.0
  • transformers: 4.41.2
  • datasets: 2.18.0
  • peft: 0.11.1
  • accelerate: 0.30.1
数据集准备

使用复旦新闻分类数据集

访问魔搭社区下的复旦新闻分类数据集zh_cls_fudan-news,下载train.jsonltest.jsonl文件至本地目录。

数据集结构如下:

  • text:文本内容
  • category:文本可能的分类列表
  • output:文本的准确分类
模型加载

使用模型scope下载Qwen2-1.5B-Instruct模型

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集成监控训练过程

from swanlab.integration.huggingface import SwanLabCallback

swanlab_callback = SwanLabCallback(project="Qwen2-fintune", experiment_name="Qwen2-1.5B-Instruct", description="微调通义千问Qwen2-1.5B-Instruct模型在复旦新闻分类数据集")
trainer = Trainer(model=model, callbacks=[swanlab_callback])
完整代码示例

目录结构与训练代码

创建目录结构:

train.py
train.jsonl
test.jsonl

train.py 文件内容:

import json
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import Dataset

def process_data(jsonl_path):
    with open(jsonl_path, "r") as file:
        data = file.readlines()
    return [json.loads(line) for line in data]

def prepare_data(messages):
    input_ids, attention_mask, labels = [], [], []
    for message in messages:
        instruction = tokenizer(message["instruction"], add_special_tokens=False)["input_ids"]
        output = tokenizer(message["output"], add_special_tokens=False)["input_ids"]
        input_ids.extend(instruction + output + [tokenizer.pad_token_id])
        attention_mask.extend([1] * len(instruction) + [1] * len(output) + [1])
        labels.extend([-100] * len(instruction) + output + [tokenizer.pad_token_id])
        if len(input_ids) > 384:
            input_ids = input_ids[:384]
            attention_mask = attention_mask[:384]
            labels = labels[:384]
    return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}

def main():
    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_jsonl_path = "train.jsonl"
    messages = process_data(train_jsonl_path)
    prepared_data = prepare_data(messages)
    train_dataset = Dataset.from_dict(prepared_data)

    training_args = TrainingArguments(output_dir="./output", per_device_train_batch_size=4, num_train_epochs=2)
    trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
    trainer.train()

    test_jsonl_path = "test.jsonl"
    test_messages = process_data(test_jsonl_path)
    predictions = []
    for message in test_messages:
        input_text = f"你是一个文本分类领域的专家,请根据文本内容和分类选项,输出文本内容的正确类型:文本:{message['text']}, 类型选型:{message['category']}"
        input_ids = tokenizer(input_text, return_tensors="pt")["input_ids"]
        generated_ids = model.generate(input_ids, max_new_tokens=512)
        output = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
        predictions.append(output)
    return predictions

if __name__ == "__main__":
    predictions = main()
    print(predictions)

训练细节与结果演示

在SwanLab上监控训练过程,查看loss变化、运行状态等指标,确保模型训练效果满意。

在SwanLab中演示模型在测试数据上的应用,观察模型对文本分类的准确率。

推理与模型保存

模型训练完成后,保存模型权重:

model.save_pretrained("Qwen2-1.5B-Instruct_finetuned")
tokenizer.save_pretrained("Qwen2-1.5B-Instruct_finetuned")

使用时加载模型进行推理:

from transformers import AutoTokenizer, AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("Qwen2-1.5B-Instruct_finetuned", device_map="auto", torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("Qwen2-1.5B-Instruct_finetuned")

通过调用evaluate_model函数,检验模型在测试集上的效果。

通过此代码示例,实现了从零基础到精通的微调实践指南,覆盖了环境准备、数据集下载、模型加载、训练、评估和模型保存的完整流程,提供了一站式解决方案。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消