从 LoRA 到 vLLM:大模型训练与企业部署名词通识(图解版)

从 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 是部署和运维方式。

相关推荐
数据与后端架构提升之路6 小时前
四个模型,四条路:一份来自生产环境的 LLM 部署横评与选型框架
gpu算力·vllm·h100
缘友一世1 天前
GLM5.3 flash cybersec本地部署[5]:生产运维与故障恢复
ubuntu·vllm·glm5.3 flash
缘友一世2 天前
GLM5.3 flash cybersec本地部署[4]:基准测试与复现
vllm·glm5.3 flash
rjc_lihui3 天前
NCCL,Tokio ,vLLM ,Vue 3在线书籍
vllm
GPUStack3 天前
一张 A800 80GB,跑通 Qwen-Image-2.1:GPUStack 部署、生成与图像编辑实战
人工智能·开源·github·vllm·大模型部署·gpustack
缘友一世4 天前
GLM5.3 flash cybersec本地部署[0]:环境准备与首次启动
vllm·glm5.3 flash
DongQiShanRen5 天前
裁决台账双向互校(中):五向一致性链——②向解读与③向实现
人工智能·深度学习·自然语言处理·集成学习·vllm
智码看视界5 天前
开源大模型每日追踪:小米 MiMo-V2.6-Pro,登顶开放权重第一(超过 GLM-5.3 、Kimi K3)
agent·vllm·moe·全模态·小米大模型·mimo-v2.6
零基础1237 天前
DeepSeek V4.1 Flash (Batch) 的性能测试与应用
经验分享·python·语言模型·vllm