微调Qwen2大模型,实现文本分类任务,是构建语言模型高效应用的关键步骤。本文提供了一套从环境安装、数据集准备、模型加载到微调训练的详细指南和完整代码示例。通过遵循以下步骤,您可以从零基础入门到精通整个微调流程:
-
环境安装:确保Python环境支持CUDA,使用
pip
安装包括swanlab、modelscope、transformers等在内的关键库,以支持Qwen2模型的微调。 -
数据集准备:利用魔搭社区下载复旦中文新闻数据集,并通过特定的函数解析和预处理JSONL文件,将数据转换为适合微调的结构。
-
模型加载与配置:从ModelScope下载Qwen2-1.5B-Instruct模型,集成SwanLab监控训练过程,为高效训练做好准备。
-
完整代码与训练流程:实现数据集的完整代码流程,从数据加载、预处理到模型训练、测试,提供了一个完整的训练脚本示例。
- 结果演示与推理:通过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仓库链接
Jupyter Notebook实验日志
模型与数据集来源
官方文档与参考文章链接
通过遵循上述步骤和代码示例,您可以从零开始构建Qwen2模型的微调流程,从而实现文本分类任务。实际应用中,您可能需要根据具体需求调整数据处理、模型配置和训练参数。
共同学习,写下你的评论
评论加载中...
作者其他优质文章