亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

`Qwen2大模型微調入門實戰(附完整代碼)(非常詳細)零基礎入門到精通,收藏這一篇就夠了`

標簽:
雜七雜八
概述

微调学习是一种通过调整预训练模型参数以适应特定任务的机器学习技术。本文档将引导您完成使用Qwen2大模型进行微调的实战教程,涵盖环境安装、数据集准备、模型加载与训练等关键步骤。通过操作,您将掌握从零基础入门到精通微调技术的全过程,并学会如何在实际问题中应用微调模型。本文档包括详细代码示例,覆盖所有步骤,并附有相关链接以获取完整代码、实验日志、模型来源、数据集来源以及SwanLab使用文档。在完成训练后,您可以使用训练好的模型进行任务预测,实践微调模型在具体任务中的应用。通过本文档,您将能高效地掌握微调学习的基本方法与应用技巧。

环境安装

在您的计算机上安装Python环境,确保版本不低于3.8。对于本案例,您还需要一张英伟达显卡,显存要求大约10GB左右。以下是使用命令行安装所需库的代码:

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

使用魔搭社区提供的zh_cls_fudan-news数据集,该数据集主要用于文本分类任务。数据集由数千条记录组成,每条记录包含textcategoryoutput三列:

  • text:文本语料内容
  • category:文本可能的分类选项列表
  • output:文本的唯一真实类型

以下是数据集的例子:

{
  "text": "第四届全国大企业足球赛复赛结束新华社郑州5月3日电(实习生田兆运)上海大隆机器厂队昨天在洛阳进行的第四届牡丹杯全国大企业足球赛复赛中,以5:4力克成都冶金实验厂队,进入前四名。",
  "category": ["体育", "政治"],
  "output": "体育"
}

数据集可以下载到本地目录,确保它们与你的代码文件位于同一目录下。

加载模型

通过modelscope下载Qwen2-1.5B-Instruct模型,并使用Transformers加载模型进行训练:

from modelscope import snapshot_download
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq

model_dir = snapshot_download("qwen/Qwen2-1.5B-Instruct", cache_dir="./", revision="master")
tokenizer = AutoTokenizer.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", device_map="auto", torch_dtype=torch.bfloat16)
配置训练可视化工具

使用SwanLab监控训练过程,集成SwanLab与Transformers:

from swanlab.integration.huggingface import SwanLabCallback

swanlab_callback = SwanLabCallback(...)
trainer = Trainer(
    model=model,
    args=TrainingArguments(...),
    callbacks=[swanlab_callback]
)

在开始训练之前,请访问SwanLab网站完成账号注册并获取API Key,以便在训练开始时输入其中。

完整代码(train.py文件)

数据预处理与加载

import json
import pandas as pd
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)
            text = data["text"]
            category = data["category"]
            output = data["output"]
            message = {
                "instruction": "你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型",
                "input": f"文本:{text},类型选型:{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")

# 加载预处理后的数据集
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_dataset = Dataset.from_pandas(train_df)

模型加载与配置

from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq

model = AutoModelForCausalLM.from_pretrained("./qwen/Qwen2-1___5B-Instruct/", device_map="auto", torch_dtype=torch.bfloat16)
model.enable_input_require_grads()

# 配置训练参数
args = TrainingArguments(
    output_dir="./output/Qwen1.5",
    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回调
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()

推理训练好的模型

def predict(messages, model, tokenizer):
    device = "cuda"
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)
    generated_ids = model.generate(
        model_inputs.input_ids,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]
    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)
    return response

# 使用训练好的模型进行预测
predictions = predict(messages, model, tokenizer)
训练结果演示

在SwanLab上查看训练结果,可以看到训练过程和模型效果展示。

推理训练好的模型

训好的模型默认保存在./output/Qwen2文件夹下。使用代码进行推理:

from transformers import AutoTokenizer, AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("./output/Qwen2/checkpointXXX", device_map="auto", torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("./qwen/Qwen2-1___5B-Instruct/")
相关链接

通过上述步骤,你已经完成了Qwen2的指令微调入门实战,并成功训练和使用了模型。本指南提供了从环境搭建、数据处理、模型加载到训练和预测的详细步骤,适合初学者入门学习。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消