大模型微调学习是当前自然语言处理领域的重要实践,本文以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模型在特定数据集上的指令微调工作流程。
环境准备
在开始之前,请确保你的计算机满足以下要求:
- 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
数据集上的指令微调流程提供了一个具体指引。
共同学习,写下你的评论
评论加载中...
作者其他优质文章