导言
在大模型的时代,微调技术已成为提升模型性能的关键手段。本文通过阿里云通义千问团队研发的开源大语言模型Qwen2,以指令微调方法进行文本分类任务,为文本分类任务的入门者提供了一条高效路径。我们将详细介绍如何在复旦中文新闻(zh_cls_fudan-news)数据集上进行Qwen2大模型微调,并利用SwanLab进行训练过程可视化和效果评估。通过全面的系统要求、环境配置、数据集准备、模型加载与微调,以及代码实现的详细步骤,本文旨在为读者提供一次完整的微调体验,从数据集转换到数据预处理、预测函数构建,直至实验训练与评估的实践指南。
系统要求与环境配置系统与硬件需求
- 操作系统:确保Python 3.8或更高版本运行在您的系统上。
- 显卡与显存:推荐使用英伟达显卡,至少配备10GB显存。
- 必需安装的库:swanlab、modelscope、transformers、datasets、peft、accelerate和pandas。
一键安装命令
pip install swanlab modelscope transformers datasets peft pandas accelerate
选择modelscope的最新版本(modelscope1.14.0)、transformers库(4.41.2版本)、datasets(2.18.0版本)、peft(0.11.1版本)和accelerate(0.30.1版本)以确保最佳兼容性和性能。
数据集准备数据集选择与下载
- 数据集:复旦中文新闻(zh_cls_fudan-news)
- 下载方式:通过魔搭社区下载
train.jsonl
和test.jsonl
文件。
数据集包含:
text
:文本内容category
:文本的多个可能类别output
:文本的唯一真实类别
数据集示例
{
"text": "第四届全国大企业足球赛复赛结束新华社郑州5月3日电(实习生田兆运)上海大隆机器厂队昨天在洛阳进行的第四届牡丹杯全国大企业足球赛复赛中,以5:4力克成都冶金实验厂队,进入前四名。",
"category": ["Sports", "Politics"],
"output": "Sports"
}
模型加载与微调
模型选择与加载
- 模型:Qwen2-1.5B-Instruct
- 加载方式:通过modelscope下载,加载到Transformers中进行训练。
集成SwanLab与Transformers
使用SwanLab来监控训练过程和效果评估,提升训练可视化能力。
完整代码示例与实验日志train.py
文件结构
- 数据集转换函数:
dataset_jsonl_transfer
- 数据预处理函数:
process_func
- 预测函数:
predict
- 实验训练代码整合与目录结构说明
dataset_jsonl_transfer
示例代码
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, category, output = data["text"], data["category"], data["output"]
prompt = "你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型\n文本:{}\n类别选项:{}\n输出:".format(text, category)
messages.append({"instruction": prompt, "input": text, "output": output})
with open(new_path, "w") as file:
for message in messages:
file.write(json.dumps(message, ensure_ascii=False) + "\n")
process_func
示例代码
def process_func(examples):
input_ids, attention_mask, labels = [], [], []
for example in examples:
text = example["text"]
instruction, input_text, output_text = example["instruction"], example["input"], example["output"]
input_ids.append(tokenizer.encode(instruction, text, add_special_tokens=True))
attention_mask.append([1] * len(input_ids[-1]))
labels.append(tokenizer.encode(output_text, add_special_tokens=True))
return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}
predict
示例代码
def predict(model, tokenizer, text):
inputs = tokenizer([text], return_tensors="pt")
outputs = model.generate(inputs["input_ids"], max_length=100)
return tokenizer.decode(outputs[0])
训练与评估整合代码
model = Qwen2ForCausalLM.from_pretrained("qwen/Qwen2-1.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen2-1.5B-Instruct")
train_dataset = dataset_jsonl_transfer("train.jsonl", "new_train.jsonl")
eval_dataset = dataset_jsonl_transfer("test.jsonl", "new_test.jsonl")
data_collator = DataCollatorForSeq2Seq(tokenizer)
training_args = TrainingArguments(output_dir="./results/qwen2-finetune", evaluation_strategy="epoch")
trainer = Trainer(
model=model,
tokenizer=tokenizer,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
data_collator=data_collator,
callbacks=[SwanLabCallback()],
)
trainer.train()
trainer.evaluate()
实验日志与可视化
- 训练可视化:通过SwanLab查看训练过程中的loss与accuracy指标。
- 效果评估:基于
test.jsonl
测试模型性能,计算准确率、F1分数等。
- 微调结果:利用模型预测
test.jsonl
中的文本分类结果,对比原始标签与预测标签,评估微调效果。 - 推理代码:
def inference(model, tokenizer, text):
input_ids = tokenizer.encode("你是一个文本分类领域的专家,你会接收到一段文本和几个潜在的分类选项,请输出文本内容的正确类型\n文本:{}\n输出:".format(text), return_tensors="pt")
outputs = model.generate(input_ids)
return tokenizer.decode(outputs[0])
总结与展望
通过指令微调Qwen2模型并在复旦中文新闻数据集上进行训练,我们展示了微调在文本分类任务中的高效性与实用性。SwanLab的集成应用不仅增强了训练过程的可视化,还帮助我们深入理解模型的学习过程与性能表现。未来,随着大模型技术的不断发展,微调将成为构建个性化、高效率语言模型的核心手段之一,为自然语言处理领域带来更大的创新与突破。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦