跳转至

模型训练与部署学习路线

这篇先画地图。

你提到的内容很多:

  • 模型训练。
  • 模型部署。
  • 原生 Python 代码实现。
  • 框架实现。
  • Unsloth。
  • LLaMA-Factory。
  • llama.cpp。
  • vLLM。
  • SGLang。
  • 各种参数调优。

这些不是一堆散点,而是一条工程链路:

API 调用
  ↓
理解模型输入输出
  ↓
准备数据
  ↓
训练或微调
  ↓
评估
  ↓
导出和量化
  ↓
部署推理服务
  ↓
线上参数调优

如果你想先从“模型怎么出生”看全流程,读:LLM 生命周期:从数据到线上模型

如果你现在关心的是量化、买什么卡、多少显存、32B/671B 怎么部署,先读:模型量化与推理压缩入门模型部署硬件选型

先分清几件事

训练

训练是在改模型参数。

例子:

给模型一批问答数据,让它更擅长客服回复。

训练会改变模型本身。

推理

推理是在使用模型。

例子:

用户问一个问题,模型生成回答。

推理通常不改变模型参数。

微调

微调是在已有模型基础上继续训练。

常见目标:

  • 学会某种输出格式。
  • 适应某个领域语料。
  • 学会某类任务风格。
  • 提升特定业务场景表现。

部署

部署是把模型变成可访问的服务。

例子:

启动一个 HTTP 服务,应用通过 OpenAI-compatible API 调用本地模型。

原生 Python 代码实现学什么

原生 Python 不是为了替代成熟框架。

它的价值是:

让你知道训练循环内部到底发生了什么。

最小训练循环大概是:

for batch in dataloader:
    outputs = model(**batch)
    loss = outputs.loss
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

这几行背后对应:

取数据
  ↓
前向计算
  ↓
计算 loss
  ↓
反向传播
  ↓
更新参数
  ↓
清空梯度

第一遍不需要从零写出 GPT。

建议原生 Python 先实现这些小目标:

  1. 用 tokenizer 把文本变成 token id。
  2. 用 PyTorch 做一个小的语言模型。
  3. 写一个训练循环。
  4. 看懂 loss 为什么下降。
  5. 写一个简单 generate 函数。
  6. 再理解 LoRA 为什么只训练一小部分参数。

训练方法地图

常见训练方式可以这样看:

方法 改什么 适合什么场景
Pretraining 从大量文本学基础能力 从头训练基础模型,成本极高
Continued Pretraining 在领域语料上继续预训练 医疗、法律、代码等领域适配
SFT 用指令数据监督微调 问答、客服、工具调用格式
LoRA 只训练低秩适配器 低成本微调
QLoRA 量化底座 + LoRA 显存更紧张时微调
DPO 用偏好数据对齐 让模型更偏好某类回答
PPO / RLHF 强化学习对齐 更复杂的人类偏好优化
RFT 面向可验证任务强化微调 数学、代码、结构化任务

第一阶段建议重点学:

SFT + LoRA + QLoRA

不要一上来就扎进 RLHF。

如果你想弄清 SFT、DPO、RLHF、RFT 分别解决什么问题,先读:后训练与对齐入门:SFT、DPO、RLHF、RFT

训练参数怎么理解

训练参数很多,但可以分组。

数据参数

参数 直觉
dataset 用哪批数据训练
max_seq_length 每条样本最多多少 token
packing 是否把多条短样本拼成一条,提高利用率
train/validation split 训练集和验证集怎么切

例子:

max_seq_length 太短:长答案被截断。
max_seq_length 太长:显存压力变大。

优化参数

参数 直觉
learning_rate 每次更新参数的步子多大
batch_size 每步看多少样本
gradient_accumulation_steps 累积多步梯度再更新,模拟更大 batch
epochs 数据被完整看几轮
warmup_steps 训练初期慢慢升学习率
weight_decay 防止参数过度放飞
lr_scheduler 学习率怎么变化

一个常见问题:

learning_rate 太大:loss 震荡甚至爆炸。
learning_rate 太小:训练很慢,效果上不去。

LoRA 参数

参数 直觉
r LoRA 适配器的容量
lora_alpha LoRA 更新强度
lora_dropout 防止过拟合
target_modules LoRA 加到哪些层上

例子:

r 太小:模型学不进去。
r 太大:更占显存,也更可能过拟合。

精度和显存参数

参数 直觉
fp16 / bf16 用低精度加速训练
load_in_4bit 4bit 加载底座模型
gradient_checkpointing 用计算换显存
flash_attention 更高效地算 attention

这些参数会影响:

  • 显存占用。
  • 速度。
  • 稳定性。
  • 可训练模型大小。

框架怎么选

Unsloth

Unsloth 更适合:

  • 快速做 LoRA / QLoRA 微调。
  • 单机 GPU 资源有限。
  • 想先跑通训练流程。
  • 想少写底层训练代码。

它的核心价值是:

把常见开源模型微调做得更省显存、更快、更容易上手。

学习时可以用它先跑通:

准备数据 -> LoRA 微调 -> 保存 adapter -> 合并或导出

LLaMA-Factory

LLaMA-Factory 更像一个统一训练平台。

适合:

  • 想用配置文件管理训练。
  • 想支持很多模型和数据集。
  • 想比较 SFT、LoRA、DPO 等多种训练方式。
  • 想用 Web UI 或命令行快速实验。

它的核心价值是:

把大量微调方法和模型适配封装成统一工作流。

如果你要做系统化实验,LLaMA-Factory 很适合作为框架入口。

原生 Python、Unsloth、LLaMA-Factory 的关系

方式 学习价值 工程价值
原生 Python 理解训练本质 适合小实验和教学
Unsloth 快速掌握 LoRA 微调 适合省显存快速训练
LLaMA-Factory 理解完整训练流程 适合多模型、多方法实验

建议顺序:

原生 Python 看懂训练循环
  ↓
Unsloth 跑通一次 LoRA
  ↓
LLaMA-Factory 做系统化实验

部署框架地图

训练完模型后,还要部署。

常见框架可以这样分:

框架 更适合什么 关键词
llama.cpp 本地、CPU、Apple Silicon、GGUF、轻量部署 低门槛、本地运行
llama-cpp-python Python 调用 llama.cpp Python binding、OpenAI-compatible server
vLLM GPU 高吞吐服务 PagedAttention、continuous batching、OpenAI-compatible
SGLang Agent/RAG/结构化生成、高性能服务 RadixAttention、prefix cache、structured generation

llama.cpp

llama.cpp 适合先体验本地模型。

它的特点:

  • C/C++ 实现。
  • 部署门槛低。
  • 支持多种硬件后端。
  • 常配合 GGUF 量化模型使用。
  • 可以启动 HTTP server。

它适合:

我想在自己电脑上跑一个本地模型。

不适合第一目标就是:

高并发、多 GPU、大规模线上服务。

vLLM

vLLM 更适合 GPU 服务化部署。

它的关键词:

  • OpenAI-compatible API server。
  • PagedAttention。
  • continuous batching。
  • 高吞吐。
  • 支持 LoRA 服务。

它适合:

我要把一个开源模型部署成服务,供应用调用。

典型启动方式类似:

vllm serve Qwen/Qwen2.5-7B-Instruct

然后应用可以像调用 OpenAI API 一样调用它。

SGLang

SGLang 也用于高性能推理服务。

它尤其适合:

  • 多轮生成。
  • Agent 工作流。
  • RAG。
  • 结构化输出。
  • 有共享前缀和复杂控制流的场景。

它的关键词:

  • OpenAI-compatible API。
  • RadixAttention。
  • KV cache 复用。
  • continuous batching。
  • 结构化生成。

如果一个 Agent 工作流里有很多相似前缀、工具调用、分支生成,SGLang 的思路会很值得学。

部署参数怎么理解

部署参数也很多,但仍然可以分组。

模型加载参数

参数 直觉
model 加载哪个模型
dtype 权重和计算精度
quantization 是否使用量化
max_model_len 最大上下文长度
tensor_parallel_size 多 GPU 切模型

服务并发参数

参数 直觉
max_num_seqs 同时处理多少序列
max_num_batched_tokens 一个 batch 里最多多少 token
gpu_memory_utilization 允许占用多少 GPU 显存
enable_prefix_caching 是否启用前缀缓存

生成采样参数

这些和 API 调用里看到的一样:

参数 直觉
temperature 随机性
top_p 候选 token 范围
top_k 只看概率最高的 k 个 token
max_tokens 最多生成多少 token
repetition_penalty 降低重复
stop 生成到哪些字符串就停止

注意:

训练参数调的是模型学习过程。
部署参数调的是服务性能和资源。
采样参数调的是输出风格。

这三类不要混在一起。

一条推荐学习路线

第一阶段:会调用

目标:

会用 API 和模型对话。

学习内容:

  • Responses API。
  • Chat Completions API。
  • temperaturetop_pmax_output_tokens
  • streaming。
  • tools。
  • structured output。

对应文档:

第二阶段:懂训练

目标:

知道模型参数是怎么被训练改变的。

学习内容:

  • tokenizer。
  • dataset。
  • loss。
  • optimizer。
  • training loop。
  • evaluation。

对应文档:

第三阶段:会微调

目标:

能用自己的数据微调一个开源模型。

学习内容:

  • SFT。
  • LoRA。
  • QLoRA。
  • Unsloth。
  • LLaMA-Factory。
  • 训练参数调优。

对应文档:

第四阶段:会部署

目标:

能把模型变成服务。

学习内容:

  • GGUF。
  • 量化。
  • llama.cpp。
  • vLLM。
  • SGLang。
  • OpenAI-compatible API。
  • streaming。
  • 并发和显存。

对应文档:

第五阶段:会优化

目标:

知道慢在哪里、贵在哪里、怎么调。

学习内容:

  • KV Cache。
  • Prefix Cache。
  • PagedAttention。
  • continuous batching。
  • speculative decoding。
  • quantization。
  • eval。
  • 压测。

对应文档:

一个端到端例子

假设你想做一个“公司内部客服模型”。

方案 A:不训练,只做 RAG

流程:

整理文档
  ↓
切片入库
  ↓
用户提问
  ↓
检索相关文档
  ↓
把文档片段放进 prompt
  ↓
模型回答

优点:

  • 上手快。
  • 知识更新方便。
  • 不需要改模型参数。

缺点:

  • 对检索质量敏感。
  • prompt 可能变长。
  • 回答风格不一定稳定。

方案 B:SFT / LoRA 微调

流程:

收集高质量问答
  ↓
整理成 instruction 数据
  ↓
用 Unsloth 或 LLaMA-Factory 做 LoRA 微调
  ↓
评估
  ↓
导出 adapter 或合并模型
  ↓
用 vLLM / SGLang / llama.cpp 部署

优点:

  • 风格更稳定。
  • 特定任务更顺手。
  • 可以减少 prompt 里反复写规则。

缺点:

  • 数据质量要求高。
  • 需要评估。
  • 更新知识没有 RAG 灵活。

方案 C:RAG + 微调

很多真实系统会两者结合:

微调负责格式和行为习惯
RAG 负责最新知识和具体资料

常见误区

误区 1:想让模型知道新知识,就一定要微调

不一定。

如果知识经常变化,RAG 往往更合适。

微调更适合改变行为、格式、风格和稳定任务模式。

误区 2:训练 loss 降了,就代表线上效果好

不一定。

loss 只是训练指标。

线上还要看:

  • 答案准确性。
  • 格式稳定性。
  • 幻觉率。
  • 拒答是否合理。
  • 延迟和成本。

误区 3:部署框架越强越适合自己

不一定。

本地小模型用 llama.cpp 可能最舒服。

GPU 服务化用 vLLM 可能更直接。

复杂 Agent 推理链路可以再研究 SGLang。

误区 4:参数越多越高级

不是。

参数调优的目标不是“都调一遍”,而是知道问题属于哪一类:

效果问题:看数据、prompt、训练方法、eval
速度问题:看 batch、cache、量化、框架
显存问题:看量化、上下文长度、KV cache、并发
输出风格问题:看 temperature、top_p、prompt、SFT

已建立的实操专题

这篇是地图。具体实践可以继续读:

参考资料