LLM代码实现-Qwen(模型微调)

简介

LLM 通用模型在各种任务上表现良好,我们可以将它们用作对目标任务进行微调的基础。 微调允许我们使模型适应目标域和目标任务,使其可以更好地完成我们所需要的特定的任务。

目前模型微调方法主要有 Full(全参微调)、Freeze、P-tuning、LoRA、QLora,这些这些方法都各有优势,关于它们的介绍也有很多,本篇主要讲解代码实现,原理方面就不赘述了,同样考虑到不是所有读者都有足够的算力,因此使用占用资源最少的 QLora 对模型进行微调,各个微调方式占用资源如下图所示(batch_size 设置为 1)。

这里推荐使用 firefly(流萤)项目来实现模型微调,这个项目主要是为了微调多轮对话数据集,不过单轮对话也同样适用。

Firefly 项目训练多轮对话模型时,采取了一种更加充分高效的方法。如下图所示,将一条多轮对话数据拼接之后,输入模型,并行计算每个位置的 loss,只有 Assistant 部分的 loss 参与权重更新。 为什么这种做法是可行的?答案在于因果语言模型的 attention mask。以 GPT 为代表的 Causal Language Model(因果语言模型),这种模型的 attention mask 是一个对角掩码矩阵,每个 token 在编码的时候,只能看到它之前的 token,看不到它之后的 token。 所以 User1 部分的编码输出,只能感知到 User1 的内容,无法感知到它之后的文本,可以用来预测 Assistant1 的内容。而 User2 部分的编码输出,只能看到 User1、Assistant1、User2 的内容,可以用来预测 Assistant2 的内容,依此类推。对于整个序列,只需要输入模型一次,便可并行获得每个位置的 logits,从而用来计算 loss。

训练环境配置

首先 pull 项目并配置环境:

python 复制代码
git clone https://github.com/yangjianxin1/Firefly.git

cd Firefly
pip install -r requirements.txt

然后找到 1. Firefly/train_args/sft/qlora 路径下的 qwen-7b-sft-qlora.json(虽然文件名是 7b 但是 qwen 都可以通用),对里面的内容进行修改,主要修改模型路径和训练文件,其余参数可以看着修改。

json 复制代码
{
    "output_dir": "output/firefly-qwen-1_8b-sft-qlora",
    "model_name_or_path": "Qwen/Qwen-1_8B-Chat",
    "train_file": "./data/dummy_data.jsonl",
    "template_name": "qwen",
    "num_train_epochs": 1,
    "per_device_train_batch_size": 1,
    "gradient_accumulation_steps": 16,
    "learning_rate": 2e-4,
    "max_seq_length": 1024,
    "logging_steps": 100,
    "save_steps": 100,
    "save_total_limit": 1,
    "lr_scheduler_type": "constant_with_warmup",
    "warmup_steps": 100,
    "lora_rank": 64,
    "lora_alpha": 128,
    "lora_dropout": 0.05,

    "gradient_checkpointing": true,
    "disable_tqdm": false,
    "optim": "paged_adamw_32bit",
    "seed": 42,
    "fp16": true,
    "report_to": "tensorboard",
    "dataloader_num_workers": 0,
    "save_strategy": "steps",
    "weight_decay": 0,
    "max_grad_norm": 0.3,
    "remove_unused_columns": false
}

数据准备

这里的数据集是官方提供的一个测试数据集,用于跑通流程,以下是其中一条数据: 这个 json 中只用 "conversation_id" 和 "conversation" 两个是训练需要的,其他的不必在意。"conversation_id" 表示对话的序号,"conversation" 对应的是一个列表,元素是字典,每个字典中有 "human" 和 "assistant" 两个键,分别表示用户和模型的说话内容。如果要用自己的数据集也要按照这种格式进行修改。

开始训练

利用以下代码开始训练:

python 复制代码
python train.py --train_args_file train_args/sft/qlora/qwen-7b-sft-qlora.json

训练完成后会在配置文件中设置的 output_dir 生成对应的 QLora 文件,可利用 Firefly/script/chat 路径下的两个脚本进行调用来测试模型微调的效果。

相关推荐
阿里云云原生31 分钟前
如何快速看懂「祖传项目」?Qoder 强势推出新利器
人工智能
美团技术团队40 分钟前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
程序员小袁2 小时前
基于C-MTEB/CMedQAv2-rerankingv的Qwen3-1.7b模型微调-demo
人工智能
飞哥数智坊3 小时前
AI 编程一年多,我终于明白:比技巧更重要的,是熟练度
人工智能·ai编程
新智元4 小时前
收手吧 GPT-5-Codex,外面全是 AI 编程智能体!
人工智能·openai
IT_陈寒4 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
阿里云云原生4 小时前
阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场
人工智能
Memene摸鱼日报5 小时前
「Memene 摸鱼日报 2025.9.16」OpenAI 推出 GPT-5-Codex 编程模型,xAI 发布 Grok 4 Fast
人工智能·aigc
xiaohouzi1122335 小时前
OpenCV的cv2.VideoCapture如何加GStreamer后端
人工智能·opencv·计算机视觉
用户125205597085 小时前
解决Stable Diffusion WebUI训练嵌入式模型报错问题
人工智能