模型微调

模型微调
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
2.配置DataSet
1.创建项目

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

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

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

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

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

3.生成微调数据

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

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


如果部分问题的答案生成失败,可以重复以上操作再次生成。
4.导出数据集到 LLaMA Factory
答案全部生成结束后,打开****数据集管理页面,点击导出数据集

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

在配置文件路径对应的文件夹中可以看到生成的数据文件,其中主要关注以下三个文件
dataset_info.json:LLaMA Factory 所需的数据集配置文件alpaca.json:以 Alpaca 格式组织的数据集文件sharegpt.json:以 Sharegpt 格式组织的数据集文件
其中 alpaca 和 sharegpt 格式均可以用来微调,两个文件内容相同。

2.LlaMA-Factory

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
3.配置
- 进入 Web UI 界面后,选择模型为 Qwen2.5-3B-Instruct,模型路径可填写本地绝对路径,不填则从会从互联网下载

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

注意这里得数据路径是前面EasyDataset导出配置路径,才能加载出数据集,当然你也可以移动目录,执照能够找到对应的数据集就可以
为了让模型更好地学习数据知识,将****学习率改为 1e-4,训练轮数提高到 8 轮。批处理大小和梯度累计则根据设备显存大小调整,在显存允许的情况下提高批处理大小有助于加速训练,一般保持批处理大小×梯度累积×显卡数量等于 32 即可

学习率和训练轮数不知道怎么调? 可以直接ai问一下结合实际业务情况调整
| 微调方式 | 推荐学习率范围 | 为什么? |
|---|---|---|
| LoRA / QLoRA | 1e-4 ~ 5e-4 | 只微调少量参数,步子可以大一点,1e-4是通用安全值 |
| 全参数微调 | 1e-5 ~ 5e-5 | 动了所有参数,步子必须很小,不然直接训崩 |
点击其他参数设置,将****保存间隔设置为 50,保存更多的检查点,有助于观察模型效果随训练轮数的变化

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

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

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

3.验证微调效果
- 选择****检查点路径为刚才的输出目录,打开 Chat 页面,点击加载模型

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

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

输入相同的问题与模型进行对话,发现原始模型回答错误,证明微调有效
3B 模型的微调效果相对有限,此处仅用作教程演示。如果希望得到更好的结果,建议在资源充足的条件下尝试 7B/14B 模型。
欢迎大家关注 GitHub 仓库:
- **Easy Dataset: **https://github.com/ConardLi/easy-dataset
- **LLaMA Factory: **https://github.com/hiyouga/LLaMA-Factory
4.微调参数
1.操作界面

2.参数
-
微调方法

3.量化等级

有 24G 以上显存,追求极致效果 → 选 none
有 10~16G 显存,想省显存又不想丢精度 → 选 8
8G 及以下显存,想让模型能跑起来 → 闭眼选 4
4.量化方法

**新手 / 个人用户 / 求稳 / 常规微调 → **闭眼选 bnb,是最稳妥、最不容易踩坑的选择
显存紧张 / 进阶用户 / 想进一步压榨显存 → 选 hqq
仅推理部署 / 做实验 → 再考虑 eetq
5. 对话模板
**本质是给模型的「固定话术格式」,**模型训练时就是按这个格式学习,推理时也必须用完全一致的格式,否则模型会直接变 “智障”。
训练和推理必须用同一个模板:微调时用什么模板,后续推理、部署时就必须用同一个,哪怕差一个特殊标记,效果都会大打折扣。
指令模型才需要对话模板:纯续写的非指令模型,用default通用模板即可;
只有带对话 / 问答能力的指令模型,才需要选专属模板。
6. RoPE(旋转位置编码)
RoPE(旋转位置编码)是大模型用来感知文本顺序、位置信息的核心机制。核心作用是****突破模型原生的上下文长度限制,实现更长文本的输入 / 输出,是长文本微调的核心配置。

**默认规则:**只要你的输入长度不超过模型原生的上下文窗口,直接选none即可,这是最稳妥、零风险的选择。
**长文本通用规则:**绝大多数非 Llama3 的主流模型(Qwen、Mistral、Phi 等),长文本场景优先选yarn,是目前社区验证最成熟、效果最好的方案。
**专属规则:**只有使用 Llama3 系列模型时,才需要考虑llama3选项,其他模型使用该选项无任何正向收益。
7. 加速方式

5.Train
1.训练阶段

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

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

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

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 值

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文件夹里面

**### **
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
JavaWeb
Spring
MyBatis
linux
消息队列
JavaSE
工具
片段
AI
搜索
dy