从 LoRA 到 vLLM:大模型训练与企业部署名词通识(图解版)
这篇文章写给第一次接触大模型训练和部署的工程师。先记住一条主线:基础模型 → 训练适配 → 模型文件 → 推理引擎 → 生产服务。
很多人第一次接触大模型时,会同时遇到 LoRA、QLoRA、SFT、GGUF、llama.cpp、Ollama、vLLM、Docker。它们不是同一层面的概念,而是分别处在模型生命周期的不同位置。
一、先讲一个工厂故事
把一个大模型想象成一家已经培养多年的"知识工厂":
- 基础模型:工厂已经掌握语言、代码和常识,但不懂你公司的业务流程。
- SFT:给工厂一批"问题和标准答案",教它按照你的方式回答。
- LoRA:不重建整座工厂,只额外安装一套轻量改造设备。
- QLoRA:把原工厂的设备压缩得更小,再安装 LoRA 改造设备。
- GGUF:把模型打包成适合本地推理的文件格式。
- llama.cpp / Ollama / vLLM:负责加载模型并回答问题的"生产线设备"。
- Docker:把生产线、依赖和启动配置一起装进标准集装箱。
#mermaid-svg-1scu3V2g6UYXgDjP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1scu3V2g6UYXgDjP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1scu3V2g6UYXgDjP .error-icon{fill:#552222;}#mermaid-svg-1scu3V2g6UYXgDjP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1scu3V2g6UYXgDjP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1scu3V2g6UYXgDjP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1scu3V2g6UYXgDjP .marker.cross{stroke:#333333;}#mermaid-svg-1scu3V2g6UYXgDjP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1scu3V2g6UYXgDjP p{margin:0;}#mermaid-svg-1scu3V2g6UYXgDjP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1scu3V2g6UYXgDjP .cluster-label text{fill:#333;}#mermaid-svg-1scu3V2g6UYXgDjP .cluster-label span{color:#333;}#mermaid-svg-1scu3V2g6UYXgDjP .cluster-label span p{background-color:transparent;}#mermaid-svg-1scu3V2g6UYXgDjP .label text,#mermaid-svg-1scu3V2g6UYXgDjP span{fill:#333;color:#333;}#mermaid-svg-1scu3V2g6UYXgDjP .node rect,#mermaid-svg-1scu3V2g6UYXgDjP .node circle,#mermaid-svg-1scu3V2g6UYXgDjP .node ellipse,#mermaid-svg-1scu3V2g6UYXgDjP .node polygon,#mermaid-svg-1scu3V2g6UYXgDjP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1scu3V2g6UYXgDjP .rough-node .label text,#mermaid-svg-1scu3V2g6UYXgDjP .node .label text,#mermaid-svg-1scu3V2g6UYXgDjP .image-shape .label,#mermaid-svg-1scu3V2g6UYXgDjP .icon-shape .label{text-anchor:middle;}#mermaid-svg-1scu3V2g6UYXgDjP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1scu3V2g6UYXgDjP .rough-node .label,#mermaid-svg-1scu3V2g6UYXgDjP .node .label,#mermaid-svg-1scu3V2g6UYXgDjP .image-shape .label,#mermaid-svg-1scu3V2g6UYXgDjP .icon-shape .label{text-align:center;}#mermaid-svg-1scu3V2g6UYXgDjP .node.clickable{cursor:pointer;}#mermaid-svg-1scu3V2g6UYXgDjP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1scu3V2g6UYXgDjP .arrowheadPath{fill:#333333;}#mermaid-svg-1scu3V2g6UYXgDjP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1scu3V2g6UYXgDjP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1scu3V2g6UYXgDjP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1scu3V2g6UYXgDjP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1scu3V2g6UYXgDjP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1scu3V2g6UYXgDjP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1scu3V2g6UYXgDjP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1scu3V2g6UYXgDjP .cluster text{fill:#333;}#mermaid-svg-1scu3V2g6UYXgDjP .cluster span{color:#333;}#mermaid-svg-1scu3V2g6UYXgDjP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1scu3V2g6UYXgDjP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1scu3V2g6UYXgDjP rect.text{fill:none;stroke-width:0;}#mermaid-svg-1scu3V2g6UYXgDjP .icon-shape,#mermaid-svg-1scu3V2g6UYXgDjP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1scu3V2g6UYXgDjP .icon-shape p,#mermaid-svg-1scu3V2g6UYXgDjP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1scu3V2g6UYXgDjP .icon-shape .label rect,#mermaid-svg-1scu3V2g6UYXgDjP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1scu3V2g6UYXgDjP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1scu3V2g6UYXgDjP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1scu3V2g6UYXgDjP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础模型
Qwen / DeepSeek / Llama
训练方式
SFT
用问答示例教模型
继续预训练
用大量领域文本继续学习
LoRA / QLoRA
生成适配器
新的模型权重
合并或运行时加载
模型文件
safetensors / GGUF
推理引擎
llama.cpp
轻量本地推理
Ollama
本地模型管理
vLLM
GPU高并发服务
CLI / 本地应用
Java / Python / Web API
二、训练和推理不是一回事
1. 训练
训练是修改模型参数,让模型形成新的能力或行为。例如:
text
问题:FTD SaaS 是什么?
答案:FTD SaaS 是面向交付和运维的 DevOps 管理平台,覆盖制品、发布、变更、环境和监控等功能。
2. 推理
推理是模型已经训练完成之后,输入问题并生成答案:
text
输入问题 → 模型计算 → 输出答案
vLLM、Ollama、llama.cpp 主要负责推理,不是训练。
| 名词 | 解决的问题 |
|---|---|
| SFT / LoRA / QLoRA | 模型怎么训练 |
| GGUF | 模型怎么保存 |
| llama.cpp / Ollama | 模型怎么在本地运行 |
| vLLM | 模型怎么作为高性能服务运行 |
| Docker | 运行环境怎么打包和交付 |
三、什么是 SFT:用标准答案教模型
SFT 的全称是 Supervised Fine-Tuning ,中文叫监督微调。"监督"表示训练数据同时提供输入和期望输出。
json
{
"messages": [
{"role": "user", "content": "FTD SaaS 主要解决什么问题?"},
{"role": "assistant", "content": "FTD SaaS 是交付运维平台,主要覆盖制品管理、系统发布、数据库变更、Apollo 配置、集群环境和监控排查。"}
]
}
训练过程可以简化为:
#mermaid-svg-oq6Y3w8ygRSCY9vb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oq6Y3w8ygRSCY9vb .error-icon{fill:#552222;}#mermaid-svg-oq6Y3w8ygRSCY9vb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oq6Y3w8ygRSCY9vb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .marker.cross{stroke:#333333;}#mermaid-svg-oq6Y3w8ygRSCY9vb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oq6Y3w8ygRSCY9vb p{margin:0;}#mermaid-svg-oq6Y3w8ygRSCY9vb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster-label text{fill:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster-label span{color:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster-label span p{background-color:transparent;}#mermaid-svg-oq6Y3w8ygRSCY9vb .label text,#mermaid-svg-oq6Y3w8ygRSCY9vb span{fill:#333;color:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .node rect,#mermaid-svg-oq6Y3w8ygRSCY9vb .node circle,#mermaid-svg-oq6Y3w8ygRSCY9vb .node ellipse,#mermaid-svg-oq6Y3w8ygRSCY9vb .node polygon,#mermaid-svg-oq6Y3w8ygRSCY9vb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .rough-node .label text,#mermaid-svg-oq6Y3w8ygRSCY9vb .node .label text,#mermaid-svg-oq6Y3w8ygRSCY9vb .image-shape .label,#mermaid-svg-oq6Y3w8ygRSCY9vb .icon-shape .label{text-anchor:middle;}#mermaid-svg-oq6Y3w8ygRSCY9vb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .rough-node .label,#mermaid-svg-oq6Y3w8ygRSCY9vb .node .label,#mermaid-svg-oq6Y3w8ygRSCY9vb .image-shape .label,#mermaid-svg-oq6Y3w8ygRSCY9vb .icon-shape .label{text-align:center;}#mermaid-svg-oq6Y3w8ygRSCY9vb .node.clickable{cursor:pointer;}#mermaid-svg-oq6Y3w8ygRSCY9vb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .arrowheadPath{fill:#333333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oq6Y3w8ygRSCY9vb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oq6Y3w8ygRSCY9vb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oq6Y3w8ygRSCY9vb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster text{fill:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb .cluster span{color:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oq6Y3w8ygRSCY9vb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oq6Y3w8ygRSCY9vb rect.text{fill:none;stroke-width:0;}#mermaid-svg-oq6Y3w8ygRSCY9vb .icon-shape,#mermaid-svg-oq6Y3w8ygRSCY9vb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oq6Y3w8ygRSCY9vb .icon-shape p,#mermaid-svg-oq6Y3w8ygRSCY9vb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oq6Y3w8ygRSCY9vb .icon-shape .label rect,#mermaid-svg-oq6Y3w8ygRSCY9vb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oq6Y3w8ygRSCY9vb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oq6Y3w8ygRSCY9vb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oq6Y3w8ygRSCY9vb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户问题
模型生成答案
与标准答案比较
计算损失
反向传播更新参数
SFT 适合教模型公司术语、固定回答格式、故障排查顺序、错误码解释、工具调用格式,以及什么时候应该回答"无法确认"。
企业故障数据最好写成:
text
现象 → 证据 → 判断 → 只读检查 → 修复建议 → 回滚方式
四、什么是 LoRA:只训练一块"小补丁"
假设一个模型有 70 亿个参数。全量微调意味着 70 亿个参数都参与训练,需要大量显存、计算时间和存储空间。
LoRA 的全称是 Low-Rank Adaptation ,中文通常叫低秩适配。
原来的权重矩阵是 W。LoRA 不直接修改整个 W,而是学习两个更小的矩阵 A 和 B:
text
训练后的权重:W' = W + ΔW
变化量: ΔW = B × A
其中 W 是冻结的原始权重,A 和 B 是新训练的小矩阵,ΔW 是 LoRA 学到的变化量。
假设 W 是 4×6,LoRA 使用 B(4×2)和 A(2×6):
text
B × A 的结果仍然是 4×6
真正训练的参数只有 4×2 + 2×6 = 20 个
这就是"低秩"的直观含义:用两个小矩阵表达一个大矩阵的变化。
#mermaid-svg-R2fYI8tAkASVFkaU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-R2fYI8tAkASVFkaU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-R2fYI8tAkASVFkaU .error-icon{fill:#552222;}#mermaid-svg-R2fYI8tAkASVFkaU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-R2fYI8tAkASVFkaU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-R2fYI8tAkASVFkaU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-R2fYI8tAkASVFkaU .marker.cross{stroke:#333333;}#mermaid-svg-R2fYI8tAkASVFkaU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-R2fYI8tAkASVFkaU p{margin:0;}#mermaid-svg-R2fYI8tAkASVFkaU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-R2fYI8tAkASVFkaU .cluster-label text{fill:#333;}#mermaid-svg-R2fYI8tAkASVFkaU .cluster-label span{color:#333;}#mermaid-svg-R2fYI8tAkASVFkaU .cluster-label span p{background-color:transparent;}#mermaid-svg-R2fYI8tAkASVFkaU .label text,#mermaid-svg-R2fYI8tAkASVFkaU span{fill:#333;color:#333;}#mermaid-svg-R2fYI8tAkASVFkaU .node rect,#mermaid-svg-R2fYI8tAkASVFkaU .node circle,#mermaid-svg-R2fYI8tAkASVFkaU .node ellipse,#mermaid-svg-R2fYI8tAkASVFkaU .node polygon,#mermaid-svg-R2fYI8tAkASVFkaU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-R2fYI8tAkASVFkaU .rough-node .label text,#mermaid-svg-R2fYI8tAkASVFkaU .node .label text,#mermaid-svg-R2fYI8tAkASVFkaU .image-shape .label,#mermaid-svg-R2fYI8tAkASVFkaU .icon-shape .label{text-anchor:middle;}#mermaid-svg-R2fYI8tAkASVFkaU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-R2fYI8tAkASVFkaU .rough-node .label,#mermaid-svg-R2fYI8tAkASVFkaU .node .label,#mermaid-svg-R2fYI8tAkASVFkaU .image-shape .label,#mermaid-svg-R2fYI8tAkASVFkaU .icon-shape .label{text-align:center;}#mermaid-svg-R2fYI8tAkASVFkaU .node.clickable{cursor:pointer;}#mermaid-svg-R2fYI8tAkASVFkaU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-R2fYI8tAkASVFkaU .arrowheadPath{fill:#333333;}#mermaid-svg-R2fYI8tAkASVFkaU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-R2fYI8tAkASVFkaU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-R2fYI8tAkASVFkaU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-R2fYI8tAkASVFkaU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-R2fYI8tAkASVFkaU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-R2fYI8tAkASVFkaU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-R2fYI8tAkASVFkaU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-R2fYI8tAkASVFkaU .cluster text{fill:#333;}#mermaid-svg-R2fYI8tAkASVFkaU .cluster span{color:#333;}#mermaid-svg-R2fYI8tAkASVFkaU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-R2fYI8tAkASVFkaU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-R2fYI8tAkASVFkaU rect.text{fill:none;stroke-width:0;}#mermaid-svg-R2fYI8tAkASVFkaU .icon-shape,#mermaid-svg-R2fYI8tAkASVFkaU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-R2fYI8tAkASVFkaU .icon-shape p,#mermaid-svg-R2fYI8tAkASVFkaU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-R2fYI8tAkASVFkaU .icon-shape .label rect,#mermaid-svg-R2fYI8tAkASVFkaU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-R2fYI8tAkASVFkaU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-R2fYI8tAkASVFkaU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-R2fYI8tAkASVFkaU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入
原始模型权重 W
冻结,不更新
LoRA 分支
训练 A 和 B
低秩变化量 ΔW
原始输出
适配输出
原始输出 + LoRA变化量
LoRA 训练完成后,通常得到:
text
adapter_model.safetensors
adapter_config.json
tokenizer 配置
训练参数
注意:LoRA Adapter 通常不是完整模型。
text
基础模型 + LoRA Adapter = 训练后的模型效果
如果只有 Adapter,没有对应版本的基础模型,通常不能独立运行。
五、什么是 QLoRA:压缩基础模型后再做 LoRA
QLoRA 可以拆成:
text
Q:Quantization,量化
LoRA:低秩适配
它的过程是:先把基础模型用 4-bit 等低精度表示,再冻结量化模型,只训练 LoRA 适配器。
#mermaid-svg-PS1L0SYZFXCvj3BM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PS1L0SYZFXCvj3BM .error-icon{fill:#552222;}#mermaid-svg-PS1L0SYZFXCvj3BM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PS1L0SYZFXCvj3BM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PS1L0SYZFXCvj3BM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PS1L0SYZFXCvj3BM .marker.cross{stroke:#333333;}#mermaid-svg-PS1L0SYZFXCvj3BM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PS1L0SYZFXCvj3BM p{margin:0;}#mermaid-svg-PS1L0SYZFXCvj3BM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster-label text{fill:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster-label span{color:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster-label span p{background-color:transparent;}#mermaid-svg-PS1L0SYZFXCvj3BM .label text,#mermaid-svg-PS1L0SYZFXCvj3BM span{fill:#333;color:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM .node rect,#mermaid-svg-PS1L0SYZFXCvj3BM .node circle,#mermaid-svg-PS1L0SYZFXCvj3BM .node ellipse,#mermaid-svg-PS1L0SYZFXCvj3BM .node polygon,#mermaid-svg-PS1L0SYZFXCvj3BM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PS1L0SYZFXCvj3BM .rough-node .label text,#mermaid-svg-PS1L0SYZFXCvj3BM .node .label text,#mermaid-svg-PS1L0SYZFXCvj3BM .image-shape .label,#mermaid-svg-PS1L0SYZFXCvj3BM .icon-shape .label{text-anchor:middle;}#mermaid-svg-PS1L0SYZFXCvj3BM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PS1L0SYZFXCvj3BM .rough-node .label,#mermaid-svg-PS1L0SYZFXCvj3BM .node .label,#mermaid-svg-PS1L0SYZFXCvj3BM .image-shape .label,#mermaid-svg-PS1L0SYZFXCvj3BM .icon-shape .label{text-align:center;}#mermaid-svg-PS1L0SYZFXCvj3BM .node.clickable{cursor:pointer;}#mermaid-svg-PS1L0SYZFXCvj3BM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PS1L0SYZFXCvj3BM .arrowheadPath{fill:#333333;}#mermaid-svg-PS1L0SYZFXCvj3BM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PS1L0SYZFXCvj3BM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PS1L0SYZFXCvj3BM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PS1L0SYZFXCvj3BM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PS1L0SYZFXCvj3BM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PS1L0SYZFXCvj3BM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster text{fill:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM .cluster span{color:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PS1L0SYZFXCvj3BM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PS1L0SYZFXCvj3BM rect.text{fill:none;stroke-width:0;}#mermaid-svg-PS1L0SYZFXCvj3BM .icon-shape,#mermaid-svg-PS1L0SYZFXCvj3BM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PS1L0SYZFXCvj3BM .icon-shape p,#mermaid-svg-PS1L0SYZFXCvj3BM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PS1L0SYZFXCvj3BM .icon-shape .label rect,#mermaid-svg-PS1L0SYZFXCvj3BM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PS1L0SYZFXCvj3BM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PS1L0SYZFXCvj3BM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PS1L0SYZFXCvj3BM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始基础模型
较高精度
4-bit量化
占用更小
冻结量化模型
训练LoRA适配器
基础模型 + LoRA
| 对比项 | LoRA | QLoRA |
|---|---|---|
| 基础模型 | 通常保持较高精度 | 先量化基础模型 |
| 训练显存 | 较低 | 更低 |
| 训练结果 | 适配器 | 适配器 |
| 适合场景 | 显存较充足 | 显存更有限 |
所以:
text
SFT:训练任务是什么?
LoRA:参数怎么更新?
QLoRA:量化基础模型后,再使用 LoRA。
六、什么是 GGUF:适合本地推理的模型文件
训练平台常见的权重目录可能是:
text
config.json
tokenizer.json
model-00001-of-000xx.safetensors
generation_config.json
GGUF 是一种适合本地推理的模型文件格式,常用于 llama.cpp、桌面端模型工具、CPU 推理和量化模型。
典型文件名:
text
qwen-model-Q4_K_M.gguf
| 量化方式 | 大致特点 |
|---|---|
| Q4 | 文件更小,内存要求低,效果有一定损失 |
| Q5 | 体积和效果折中 |
| Q8 | 更接近高精度,体积更大 |
| FP16/BF16 | 效果和兼容性好,但占用显存/内存大 |
量化不是单纯压缩文件,它会降低参数表示精度,从而减少内存和计算压力。
text
GGUF 是文件格式
不是训练方法
不是模型本身
也不是推理服务
模型文件大小也不等于运行时内存,还要加上推理引擎、KV Cache、上下文、并发会话和操作系统占用。
七、什么是 llama.cpp
llama.cpp 是一个使用 C/C++ 编写的轻量级本地大模型推理项目。
特点:
- 可以运行 GGUF 模型;
- 支持 CPU,也支持部分 GPU 加速;
- 适合个人电脑、边缘服务器和离线环境;
- 可以使用命令行;
- 可以启动 HTTP 服务。
bash
./llama-cli \
-m ./qwen-model-Q4_K_M.gguf \
-p "请介绍一下FTD SaaS平台"
也可以启动服务:
bash
./llama-server \
-m ./qwen-model-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 8192
llama.cpp 更适合 CPU 离线部署、个人电脑、单机单用户、内网 CLI 和资源有限的边缘服务器。
八、什么是 Ollama
Ollama 可以理解成一个更容易使用的本地模型管理器:
bash
ollama run qwen3:8b
启动服务后,应用通常可以访问:
text
http://127.0.0.1:11434/v1
| 对比项 | llama.cpp | Ollama |
|---|---|---|
| 定位 | 推理底层引擎 | 本地模型管理工具 |
| 使用方式 | 参数较多 | 命令简单 |
| 灵活性 | 更高 | 更易上手 |
| 适合 | 精细调优、嵌入产品 | 本地开发、CLI和快速部署 |
九、什么是 vLLM
vLLM 也是推理引擎,但定位和 llama.cpp、Ollama 不一样。它重点解决:
text
如何让 GPU 上的大模型服务同时处理很多请求,并尽量提高吞吐量。
vLLM 常见能力:
- GPU 推理;
- 连续批处理;
- KV Cache 管理;
- OpenAI 兼容接口;
- 多请求并发;
- 多 GPU 和张量并行;
- 生产服务部署。
bash
vllm serve Qwen/Qwen3-8B \
--host 0.0.0.0 \
--port 8000
应用侧通常访问:
text
http://vllm-server:8000/v1/chat/completions
| 对比项 | Ollama | vLLM |
|---|---|---|
| 主要定位 | 本地模型管理和简单服务 | GPU高吞吐推理服务 |
| 上手难度 | 低 | 中等 |
| CPU场景 | 可以尝试 | 通常不作为首选 |
| 并发能力 | 适合较低并发 | 适合生产并发 |
| 多GPU | 能力有限 | 支持更完整 |
重要理解:
text
vLLM 不是训练框架
vLLM 不是 Docker
vLLM 是负责加载模型并提供推理服务的软件
十、企业生产环境一定要用 Docker 吗
不一定。
方式一:服务器裸机运行
text
Linux服务器
├── NVIDIA驱动
├── CUDA
├── Python环境
├── PyTorch
├── vLLM
└── 模型文件
优点是直接、调试方便;缺点是 Python、CUDA、PyTorch 和 vLLM 版本容易漂移,换服务器和回滚也比较麻烦。
方式二:Docker 运行
text
宿主机
├── NVIDIA驱动
├── nvidia-container-toolkit
└── Docker
└── vLLM容器
├── CUDA运行时
├── PyTorch
├── vLLM
└── 启动命令
bash
docker run --gpus all \
--ipc=host \
-p 8000:8000 \
-v /data/models:/models \
vllm/vllm-openai:latest \
--model /models/qwen \
--host 0.0.0.0 \
--port 8000
Docker 不能替代宿主机 NVIDIA 驱动。宿主机仍然需要正确的驱动、GPU 识别能力、nvidia-container-toolkit、足够的显存和磁盘。
方式三:Kubernetes 部署
适合多个模型服务、多台 GPU 服务器、自动扩缩容、灰度发布、统一监控和调度。
十一、企业生产更推荐哪种方式
text
单机验证:裸机或Docker都可以
团队测试:Docker
正式生产:Docker + 监控 + 网关
多GPU多节点:Kubernetes + vLLM
生产部署不是"用了 Docker 就生产了",还需要模型版本管理、健康检查、超时和限流、并发队列、GPU显存监控、日志、灰度发布、回滚、数据脱敏和 API 权限控制。
十二、真实企业部署架构
#mermaid-svg-21kpV0VyatXrFWMP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-21kpV0VyatXrFWMP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-21kpV0VyatXrFWMP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-21kpV0VyatXrFWMP .error-icon{fill:#552222;}#mermaid-svg-21kpV0VyatXrFWMP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-21kpV0VyatXrFWMP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-21kpV0VyatXrFWMP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-21kpV0VyatXrFWMP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-21kpV0VyatXrFWMP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-21kpV0VyatXrFWMP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-21kpV0VyatXrFWMP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-21kpV0VyatXrFWMP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-21kpV0VyatXrFWMP .marker.cross{stroke:#333333;}#mermaid-svg-21kpV0VyatXrFWMP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-21kpV0VyatXrFWMP p{margin:0;}#mermaid-svg-21kpV0VyatXrFWMP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-21kpV0VyatXrFWMP .cluster-label text{fill:#333;}#mermaid-svg-21kpV0VyatXrFWMP .cluster-label span{color:#333;}#mermaid-svg-21kpV0VyatXrFWMP .cluster-label span p{background-color:transparent;}#mermaid-svg-21kpV0VyatXrFWMP .label text,#mermaid-svg-21kpV0VyatXrFWMP span{fill:#333;color:#333;}#mermaid-svg-21kpV0VyatXrFWMP .node rect,#mermaid-svg-21kpV0VyatXrFWMP .node circle,#mermaid-svg-21kpV0VyatXrFWMP .node ellipse,#mermaid-svg-21kpV0VyatXrFWMP .node polygon,#mermaid-svg-21kpV0VyatXrFWMP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-21kpV0VyatXrFWMP .rough-node .label text,#mermaid-svg-21kpV0VyatXrFWMP .node .label text,#mermaid-svg-21kpV0VyatXrFWMP .image-shape .label,#mermaid-svg-21kpV0VyatXrFWMP .icon-shape .label{text-anchor:middle;}#mermaid-svg-21kpV0VyatXrFWMP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-21kpV0VyatXrFWMP .rough-node .label,#mermaid-svg-21kpV0VyatXrFWMP .node .label,#mermaid-svg-21kpV0VyatXrFWMP .image-shape .label,#mermaid-svg-21kpV0VyatXrFWMP .icon-shape .label{text-align:center;}#mermaid-svg-21kpV0VyatXrFWMP .node.clickable{cursor:pointer;}#mermaid-svg-21kpV0VyatXrFWMP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-21kpV0VyatXrFWMP .arrowheadPath{fill:#333333;}#mermaid-svg-21kpV0VyatXrFWMP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-21kpV0VyatXrFWMP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-21kpV0VyatXrFWMP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-21kpV0VyatXrFWMP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-21kpV0VyatXrFWMP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-21kpV0VyatXrFWMP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-21kpV0VyatXrFWMP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-21kpV0VyatXrFWMP .cluster text{fill:#333;}#mermaid-svg-21kpV0VyatXrFWMP .cluster span{color:#333;}#mermaid-svg-21kpV0VyatXrFWMP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-21kpV0VyatXrFWMP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-21kpV0VyatXrFWMP rect.text{fill:none;stroke-width:0;}#mermaid-svg-21kpV0VyatXrFWMP .icon-shape,#mermaid-svg-21kpV0VyatXrFWMP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-21kpV0VyatXrFWMP .icon-shape p,#mermaid-svg-21kpV0VyatXrFWMP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-21kpV0VyatXrFWMP .icon-shape .label rect,#mermaid-svg-21kpV0VyatXrFWMP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-21kpV0VyatXrFWMP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-21kpV0VyatXrFWMP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-21kpV0VyatXrFWMP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Java业务服务
API网关
鉴权 / 限流 / 审计
vLLM服务池
GPU节点1
Qwen模型
GPU节点2
Qwen模型
GPU节点3
Qwen模型
模型注册与版本
Prometheus / Grafana
请求日志
推理日志和指标
一次请求通常是:
text
Java服务 → API网关 → 鉴权和限流 → vLLM接口 → GPU推理 → 返回答案
如果有 10 个并发请求,通常不是每个请求单独启动一个模型,而是"一份模型权重 + 一个或多个 vLLM 服务进程 + 连续批处理 + 请求队列"。模型权重可以共享,但每个会话仍然需要 KV Cache,所以并发越高,显存占用越高。
十三、Java 怎么调用 vLLM
如果 vLLM 服务提供 OpenAI 兼容接口,Java 服务可以通过 HTTP 调用:
http
POST http://vllm-server:8000/v1/chat/completions
Content-Type: application/json
{
"model": "qwen3-8b",
"messages": [
{"role": "user", "content": "请分析这段启动日志"}
],
"temperature": 0.2,
"max_tokens": 1024
}
企业应用通常增加一层模型网关:
text
业务系统 → AI网关 → vLLM
网关负责模型路由、API Key、限流、超时、重试、审计、敏感信息过滤、统一返回格式和多模型切换。
十四、Docker Compose 能不能部署 vLLM
可以,单机或少量服务时很常见:
yaml
services:
vllm:
image: vllm/vllm-openai:latest
command:
- --model
- /models/qwen
- --host
- 0.0.0.0
- --port
- "8000"
ports:
- "8000:8000"
volumes:
- /data/models:/models
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
但是:
text
Docker Compose 适合单机编排
不等于自动拥有负载均衡和高可用
多台服务器和自动调度通常需要 Kubernetes、NVIDIA Device Plugin、vLLM Deployment 和 Service。
十五、结合 FTD 离线场景怎么选
你的银行行内场景是 CPU、8GB~16GB 内存、CLI 对话、读取日志和配置。这个场景不应该优先使用 vLLM。
#mermaid-svg-4zEvDKtWz3BmkQ00{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4zEvDKtWz3BmkQ00 .error-icon{fill:#552222;}#mermaid-svg-4zEvDKtWz3BmkQ00 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4zEvDKtWz3BmkQ00 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .marker.cross{stroke:#333333;}#mermaid-svg-4zEvDKtWz3BmkQ00 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4zEvDKtWz3BmkQ00 p{margin:0;}#mermaid-svg-4zEvDKtWz3BmkQ00 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster-label text{fill:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster-label span{color:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster-label span p{background-color:transparent;}#mermaid-svg-4zEvDKtWz3BmkQ00 .label text,#mermaid-svg-4zEvDKtWz3BmkQ00 span{fill:#333;color:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .node rect,#mermaid-svg-4zEvDKtWz3BmkQ00 .node circle,#mermaid-svg-4zEvDKtWz3BmkQ00 .node ellipse,#mermaid-svg-4zEvDKtWz3BmkQ00 .node polygon,#mermaid-svg-4zEvDKtWz3BmkQ00 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .rough-node .label text,#mermaid-svg-4zEvDKtWz3BmkQ00 .node .label text,#mermaid-svg-4zEvDKtWz3BmkQ00 .image-shape .label,#mermaid-svg-4zEvDKtWz3BmkQ00 .icon-shape .label{text-anchor:middle;}#mermaid-svg-4zEvDKtWz3BmkQ00 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .rough-node .label,#mermaid-svg-4zEvDKtWz3BmkQ00 .node .label,#mermaid-svg-4zEvDKtWz3BmkQ00 .image-shape .label,#mermaid-svg-4zEvDKtWz3BmkQ00 .icon-shape .label{text-align:center;}#mermaid-svg-4zEvDKtWz3BmkQ00 .node.clickable{cursor:pointer;}#mermaid-svg-4zEvDKtWz3BmkQ00 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .arrowheadPath{fill:#333333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4zEvDKtWz3BmkQ00 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4zEvDKtWz3BmkQ00 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4zEvDKtWz3BmkQ00 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster text{fill:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 .cluster span{color:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4zEvDKtWz3BmkQ00 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4zEvDKtWz3BmkQ00 rect.text{fill:none;stroke-width:0;}#mermaid-svg-4zEvDKtWz3BmkQ00 .icon-shape,#mermaid-svg-4zEvDKtWz3BmkQ00 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4zEvDKtWz3BmkQ00 .icon-shape p,#mermaid-svg-4zEvDKtWz3BmkQ00 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4zEvDKtWz3BmkQ00 .icon-shape .label rect,#mermaid-svg-4zEvDKtWz3BmkQ00 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4zEvDKtWz3BmkQ00 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4zEvDKtWz3BmkQ00 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4zEvDKtWz3BmkQ00 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 工程师CLI
FTD诊断Skill
本地检索知识库
只读诊断工具
日志 / 配置 / 数据库检查
llama.cpp或Ollama
排查结论和下一步建议
建议优先验证:
text
4B Q4:内存压力小,适合先跑通流程
8B Q4:能力更强,但16GB内存需要限制上下文和并发
9B Q4:需要实际压测,不要只看模型文件大小
如果模型文件是 5GB,不代表进程只需要 5GB 内存,因为还要加上 KV Cache、运行时和日志上下文。
十六、最容易犯的错误
错误一:以为 LoRA 是完整模型
LoRA 通常只是适配器,需要匹配的基础模型。
错误二:以为 QLoRA 是推理方式
QLoRA 是训练方式,不是 Ollama、vLLM 这样的推理软件。
错误三:以为 GGUF 是模型能力
GGUF 是文件格式。模型能力主要来自基础模型和训练结果。
错误四:以为用了 Docker 就自动高可用
Docker 只是打包和运行环境。高可用还需要多实例、健康检查、网关和故障恢复。
错误五:以为 vLLM 适合所有场景
vLLM 主要面向 GPU 服务和并发请求。CPU 离线 CLI 通常优先考虑 llama.cpp 或 Ollama。
错误六:以为微调后不需要上下文
微调适合学习稳定知识和回答方式,但当前版本、现场日志、数据库状态仍然需要通过检索和工具提供。
十七、最后用一张表记住所有名词
| 名词 | 一句话解释 | 所在环节 |
|---|---|---|
| SFT | 用问题和标准答案监督微调 | 训练 |
| LoRA | 只训练一组低秩适配器 | 训练 |
| QLoRA | 量化基础模型后再训练 LoRA | 训练 |
| safetensors | 常见的安全模型权重文件 | 模型存储 |
| GGUF | 适合本地推理的模型文件格式 | 模型存储 |
| llama.cpp | 轻量级本地推理引擎 | 推理 |
| Ollama | 易用的本地模型管理和服务工具 | 推理 |
| vLLM | 面向 GPU 高吞吐和并发的推理引擎 | 推理 |
| Docker | 打包运行环境的容器技术 | 部署 |
| Docker Compose | 单机多容器编排工具 | 部署 |
| Kubernetes | 多节点容器编排和调度平台 | 部署 |
| AI 网关 | 统一管理模型请求、权限和流量 | 生产架构 |
十八、推荐学习顺序
text
1. 先用 Ollama 跑通一个本地模型
2. 理解基础模型、Token、上下文和推理
3. 学会用 SFT 数据格式写问答样本
4. 理解 LoRA 和 QLoRA
5. 了解模型文件和量化
6. 用 llama.cpp 做 CPU 离线推理
7. 用 Docker 启动 vLLM
8. 再学习并发、限流、监控和高可用
9. 最后接入 Java 服务和企业网关
SFT/LoRA/QLoRA 是训练阶段的概念;GGUF 是模型文件格式;llama.cpp、Ollama 和 vLLM 是推理运行时;Docker 和 Kubernetes 是部署和运维方式。