模型微调

  |   0 评论   |   0 浏览

模型微调

0.准备一台服务器

平时学习或者个人功能测试推荐使用优云智算的服务器,毕竟咋也没多余的这么好配置的电脑对吧

https://console.compshare.cn/light-gpu/resources/create

1.准备数据集

Easy Dataset 是一个专为创建大型语言模型(LLM)微调数据集而设计的应用程序。它提供了直观的界面,用于上传特定领域的文件,智能分割内容,生成问题,并为模型微调生成高质量的训练数据。支持使用 OpenAI、DeepSeek、火山引擎等大模型 API 和 Ollama 本地模型调用。

1.安装DataSet

# 安装git
apt update && apt install -y git
​
# 拉取easy-dataset项目
git clone https://github.com/ConardLi/easy-dataset.git
​
cd easy-dataset
​
npm install
​
npm run build
​
npm run dev

访问:http://服务器ip:1717/

2.配置DataSet

1.创建项目

image-20260525212827897

2.配置模型

项目创建后会跳转到****项目设置页面,打开模型配置,选择数据生成时需要调用的大模型 API 接口

image-20260523161857718

这里以 DeepSeek 模型为例,修改模型****提供商模型名称,填写 API 密钥,点击保存后将数据保存到本地,在右上角选择配置好的模型

image-20260523161943878

打开****任务配置页面,设置文本分割长度为最小 500 字符,最大 1000 字符。在问题生成设置中,修改为每 10 个字符生成一个问题,修改后在页面最下方保存任务配置 (根据实际情况修改即可)

image-20260523162039688

2.处理数据文件

打开****文献处理页面,选择并上传示例数据文件,选择文件后点击上传并处理文件

image-20260523162118363

上传后会调用大模型解析文件内容并分块,耐心等待文件处理完成,示例数据通常需要 2 分钟左右

image-20260523162144118

3.生成微调数据

image-20260523162202066

点击后会调用大模型根据文本块来构建问题,耐心等待处理完成。处理时间视 API 速度和文本块的多少

image-20260523162233947

处理完成后,打开****问题管理页面,选择全部问题,点击批量构造数据集,耐心等待数据生成。视 API 速度

image-20260523162253696

image-20260523162306351

如果部分问题的答案生成失败,可以重复以上操作再次生成。

4.导出数据集到 LLaMA Factory

答案全部生成结束后,打开****数据集管理页面,点击导出数据集

image-20260523162335282

在导出配置中选择****在 LLaMA Factory 中使用,点击更新 LLaMA Factory 配置,即可在对应文件夹下生成配置文件,点击复制按钮可以将配置路径复制到粘贴板。

image-20260523162354004

在配置文件路径对应的文件夹中可以看到生成的数据文件,其中主要关注以下三个文件

  1. dataset_info.json:LLaMA Factory 所需的数据集配置文件
  2. alpaca.json:以 Alpaca 格式组织的数据集文件
  3. sharegpt.json:以 Sharegpt 格式组织的数据集文件

其中 alpaca 和 sharegpt 格式均可以用来微调,两个文件内容相同。

image-20260523162433902

2.LlaMA-Factory

image-20260525204004168

LLaMA Factory 是一个用于微调大语言模型 (LLM) 的开源工具包,它提供了一个统一且高效的框架,支持 100 多个 LLM (包括Qwen、LLaMA、ChatGLM、Mistral等)的微调,涵盖了各种训练方法、数据集和先进算法。

1.安装

## 在服务器,你想要安装的目录中,执行如下指令拉取项目
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
​
## 安装相关环境:
cd LLaMA-Factory
​
## 安装依赖
pip install -e ".[torch,metrics,swanlab]"

LLaMA Factory默认的模型/数据集下载源是****HuggingFace(需要科学上网),如果你所在的网络环境对与HuggingFace下载并不友好,可以在启动LLaMA Board之前,将下载源设置为魔搭社区:https://www.modelscope.cn/

#linux 将下载源改为魔搭社区
export USE_MODELSCOPE_HUB=1 
​
# 如果是Windows 使用 `set USE_MODELSCOPE_HUB=1`

2.启动

LLaMA Board是基于Gradio的可视化微调界面,你可以通过下面的代码启动LLaMA Board:

llamafactory-cli webui

http://服务器ip:7860/

3.配置

  1. 进入 Web UI 界面后,选择模型为 Qwen2.5-3B-Instruct,模型路径可填写本地绝对路径,不填则从会从互联网下载

image-20260523162806602

将****数据路径改为使用 Easy Dataset 导出的配置路径,选择 Alpaca 格式数据集,也可以选择其他格式,在easy-dataset导出时也有选择

image-20260523162825101

注意这里得数据路径是前面EasyDataset导出配置路径,才能加载出数据集,当然你也可以移动目录,执照能够找到对应的数据集就可以

为了让模型更好地学习数据知识,将****学习率改为 1e-4,训练轮数提高到 8 轮。批处理大小和梯度累计则根据设备显存大小调整,在显存允许的情况下提高批处理大小有助于加速训练,一般保持批处理大小×梯度累积×显卡数量等于 32 即可

image-20260523162841959

学习率和训练轮数不知道怎么调? 可以直接ai问一下结合实际业务情况调整

微调方式推荐学习率范围为什么?
LoRA / QLoRA1e-4 ~ 5e-4只微调少量参数,步子可以大一点,1e-4是通用安全值
全参数微调1e-5 ~ 5e-5动了所有参数,步子必须很小,不然直接训崩

点击其他参数设置,将****保存间隔设置为 50,保存更多的检查点,有助于观察模型效果随训练轮数的变化

image-20260523162901876

点击 LoRA 参数设置,将 ****LoRA 秩设置为 16,并把 LoRA 缩放系数设置为 32

image-20260523162916422

点击****开始按钮,等待模型下载,一段时间后应能观察到训练过程的损失曲线

image-20260523162942848

等待模型训练完毕,训练时间:视显卡性能和参数量

image-20260523162959579

3.验证微调效果

  1. 选择****检查点路径为刚才的输出目录,打开 Chat 页面,点击加载模型

image-20260523163022746

  1. 在下方的对话框中输入问题后,点击提交与模型进行对话,经与原始数据比对发现微调后的模型回答正确
    image-20260523163118854

点击****卸载模型将微调后的模型卸载,清空检查点路径,点击加载模型加载微调前的原始模型

image-20260523163238746

输入相同的问题与模型进行对话,发现原始模型回答错误,证明微调有效

3B 模型的微调效果相对有限,此处仅用作教程演示。如果希望得到更好的结果,建议在资源充足的条件下尝试 7B/14B 模型。

欢迎大家关注 GitHub 仓库:

4.微调参数

1.操作界面

image-20260523162550256

2.参数

  1. 微调方法

image-20260523162607020

3.量化等级

image-20260523162617143

有 24G 以上显存,追求极致效果 → 选 none

有 10~16G 显存,想省显存又不想丢精度 → 选 8

8G 及以下显存,想让模型能跑起来 → 闭眼选 4

4.量化方法

image-20260525205753335

**新手 / 个人用户 / 求稳 / 常规微调 → **闭眼选 bnb,是最稳妥、最不容易踩坑的选择

显存紧张 / 进阶用户 / 想进一步压榨显存 → 选 hqq

仅推理部署 / 做实验 → 再考虑 eetq

5. 对话模板

**本质是给模型的「固定话术格式」,**模型训练时就是按这个格式学习,推理时也必须用完全一致的格式,否则模型会直接变 “智障”。

训练和推理必须用同一个模板:微调时用什么模板,后续推理、部署时就必须用同一个,哪怕差一个特殊标记,效果都会大打折扣。


指令模型才需要对话模板:纯续写的非指令模型,用default通用模板即可;

只有带对话 / 问答能力的指令模型,才需要选专属模板。

6. RoPE(旋转位置编码)

RoPE(旋转位置编码)是大模型用来感知文本顺序、位置信息的核心机制。核心作用是****突破模型原生的上下文长度限制,实现更长文本的输入 / 输出,是长文本微调的核心配置

image-20260525205820789

**默认规则:**只要你的输入长度不超过模型原生的上下文窗口,直接选none即可,这是最稳妥、零风险的选择。

**长文本通用规则:**绝大多数非 Llama3 的主流模型(Qwen、Mistral、Phi 等),长文本场景优先选yarn,是目前社区验证最成熟、效果最好的方案。

**专属规则:**只有使用 Llama3 系列模型时,才需要考虑llama3选项,其他模型使用该选项无任何正向收益。

7. 加速方式

image-20260525205831740

5.Train

1.训练阶段

image-20260525210042907

  1. SFT 是所有流程的基础:不管你后续要做 DPO、PPO,都必须先做 SFT没有 SFT 的基础,后续对齐完全无效。
  2. 数据集必须和训练阶段匹配:SFT 用问答数据集、DPO 用偏好数据集,数据集格式选错,训练完全无效。

2.数据集

image-20260525210114405

6.Swanlab

1.安装

https://swanlab.cn 获取key

# 1. ⚙️ 在命令行,使用pip安装swanlab
pip install swanlab
​
# 2. 📝 登录到swanlab,并在提示时粘贴你的API Key
swanlab login
​
# 3. 🚀 运行下面的Python脚本,开启第一次训练
  1. 再llamfactory中执行登录操作,并开启监控

image-20260523163844370

2.训练监控

开始训练之后就可以再swanlab看到训练得图表

image-20260523163911020

LLaMA Factory 大模型微调

1.vLLM 部署命令参考

# 基础部署(OpenAI 兼容 API)
python -m vllm.entrypoints.openai.api_server \
    --model ./models/Qwen3-4B-merged \
    --served-model-name qwen3-symptom \
    --host 0.0.0.0 --port 8000 \
    --max-model-len 1024 \
    --gpu-memory-utilization 0.9 \
    --dtype bfloat16
​
# AWQ 量化模型部署
python -m vllm.entrypoints.openai.api_server \
    --model ./models/Qwen3-4B-awq-int4 \
    --quantization awq \
    --served-model-name qwen3-symptom \
    --port 8000
​
# 多 LoRA 动态切换部署
python -m vllm.entrypoints.openai.api_server \
    --model ./models/Qwen2.5-7B \
    --enable-lora \
    --lora-modules \
        symptom_norm=./lora-symptom \
        hyde_medical=./lora-hyde \
        nl2cypher=./lora-nl2cypher \
    --max-loras 3 \
    --port 8000

调用方式完全兼容 OpenAI SDK:

from openai import AsyncOpenAI
​
client = AsyncOpenAI(base_url="http://localhost:8000/v1", api_key="none")
​
response = await client.chat.completions.create(
    model="symptom_norm",  # 指定 LoRA adapter 名称
    messages=[{"role": "user", "content": "肚子疼拉肚子"}],
    temperature=0,
    max_tokens=256,
)

原始模型:/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct

LoRA 位置:/workspace/lora/train_2026-05-21-13-47-50

# 这就是模型部署命令
python -m vllm.entrypoints.openai.api_server \
    --model /root/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct \
    --enable-lora \
    --lora-modules \
        symptom_norm=/workspace/lora/train_2026-05-21-13-47-50 \
    --max-loras 1 \
    --port 8000

2.自己确定 cutoff 值

image-20260523164000688

cd到Llamfactory目录中执行脚本查看

python scripts/stat_utils/length_cdf.py \
      --model_name_or_path Qwen/Qwen2.5-3B-Instruct \
      --dataset "[Easy Dataset] [4TRBiQX08UsN] Alpaca" \
      --dataset_dir /workspace/LLaMA-Factory/data/4TRBiQX08UsN \
      --template qwen \
      --interval 1000

**在 **LLaMaFactory自己目录下 saves文件夹里面

图.drawio

**### **

llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path Qwen/Qwen2.5-3B-Instruct \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template qwen \
    --flash_attn auto \
    --dataset_dir /workspace/LLaMA-Factory/data/4TRBiQX08UsN \
    --dataset [Easy Dataset] [4TRBiQX08UsN] Alpaca \
    --cutoff_len 2000 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --packing False \
    --enable_thinking True \
    --report_to none \
    --use_swanlab True \
    --output_dir saves/Qwen2.5-3B-Instruct/lora/train_2026-05-21-13-47-50 \
    --bf16 True \
    --plot_loss True \
    --trust_remote_code True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --optim adamw_torch \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0.01 \
    --lora_target all \
    --swanlab_project llamafactory \
    --swanlab_mode cloud \
    --val_size 0.01 \
    --eval_strategy steps \
    --eval_steps 100 \
    --per_device_eval_batch_size 2

标题:模型微调
作者:llp
地址:https://llinp.cn/articles/2026/05/25/1779716042987.html