大模型部署实战:远程 API 与本地深度对比
大模型部署的核心决策不是"用 Ollama 还是 vLLM"——是先搞清楚你的显存够不够、API 和自建的成本差多少、单机测试和生产高并发的工具选型完全不同。这篇文章给你三个硬通货:KV Cache 显存公式(精确算出模型需要多少显存)、12 维度 API 对比表(DeepSeek/通义/Claude/GPT/GLM/Moonshot/Kimi)、Ollama vs vLLM 选型决策树。
阅读约 16 分钟 | 系列第 7/14 篇
⚠️ 时效性提示:本文基于 2026 年 7 月的技术状态撰写。大模型版本迭代迅速(通常 3-6 个月一次大版本更新),文中涉及的模型名称、API 端点及性能基准数据请以各厂商最新公告为准。建议重点关注文章中的架构原理与设计决策——这些内容具有更长的时效性。
一、两种使用模式概述
1.1 远程 API 模式
模型运行在服务商的 GPU 集群上,用户通过 HTTP 请求调用。本地无需显卡,按量付费。
用户代码 → HTTP 请求 → 服务商网关 → 负载均衡 → 模型推理集群(GPU)→ 返回结果
优点:零硬件投入、开箱即用、自动享受最新模型。缺点:数据需上传至第三方、按量付费。
1.2 本地部署模式
将模型权重文件下载到本地,在自己的 GPU(或 CPU)上运行推理。优点:数据不出本地、高频使用时边际成本低。缺点:需要 GPU 硬件、环境配置复杂。
1.3 混合模式
高频小任务本地跑(省成本),低频大任务调远程 API(免硬件投入)。
1.4 远程 API 与本地部署的深度对比
运行原理
远程 API 模式 本地部署模式
════════════ ════════════
┌──────────┐ ┌──────────┐
│ 你的电脑 │ 纯客户端 │ 你的电脑 │ 既是客户端也是服务器
└────┬─────┘ └────┬─────┘
│ HTTPS(公网)延迟:50-500ms │ 本地进程间通信延迟:<5ms
▼ ▼
┌──────────────┐ ┌──────────────┐
│ API 网关 │ 鉴权、限流、路由 │ 本地推理引擎 │ Ollama/vLLM/diffusers
└──────┬───────┘ └──────┬───────┘
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 推理集群 │ A100/H100 + TensorRT │ 你的 GPU │ RTX 4060/4090
│ Batch 合并 │ KV Cache 复用 │ fp16 推理 │ 单用户独占
└──────────────┘ └──────────────┘
11 维度对比
| 远程 API | 本地部署 | |
|---|---|---|
| 硬件成本 | ✅ 无需 GPU | ❌ 需要显卡(8GB VRAM 起步) |
| 使用成本 | ❌ 按量付费,高频累积成本高 | ✅ 硬件一次性投入,边际成本极低 |
| 部署复杂度 | ✅ 注册 → 拿 key → 3 行代码 | ❌ 环境配置 + 模型下载 + 服务启动 |
| 模型选择 | ✅ 即时访问最新/最大模型 | ❌ 受限于本地显存 |
| 推理速度 | ✅ A100/H100 集群 | ⚠️ 取决于本地显卡 |
| 网络依赖 | ❌ 断网即不可用 | ✅ 完全离线运行 |
| 数据隐私 | ❌ 数据上传至第三方 | ✅ 数据不出本机 |
| 延迟稳定性 | ❌ 受公网波动影响 | ✅ 本地通信,延迟稳定 |
| 可定制性 | ❌ 不能改模型、不能加 LoRA | ✅ 完全控制管线 |
| 运维负担 | ✅ 服务商负责 | ❌ 需自行维护 |
| 合规性 | ❌ 部分行业不可用 | ✅ 满足数据不出域要求 |
二、远程 API 调用
2.1 OpenAI 兼容协议 — 事实标准
当前几乎所有厂商的 API 都兼容 OpenAI 的请求/响应格式。掌握一套写法即可对接所有平台。
文本对话:
from openai import OpenAI
client = OpenAI(
base_url="https://api.your-provider.com/v1", # 各厂商的唯一差异
api_key="sk-xxxxxxxx"
)
response = client.chat.completions.create(
model="model-name",
messages=[
{"role": "system", "content": "你是一个有用的助手。"},
{"role": "user", "content": "解释什么是扩散模型"}
]
)
print(response.choices[0].message.content)
图片生成:
response = client.images.generate(
model="flux-1.1-pro",
prompt="一只橘猫在沙滩上,日落光线",
size="1024x1024"
)
2.2 主流厂商接入速查
文本模型
| 厂商 | base_url | 注册地址 |
|---|---|---|
| DeepSeek | https://api.deepseek.com | platform.deepseek.com |
| 智谱 | https://open.bigmodel.cn/api/paas/v4 | open.bigmodel.cn |
| 阿里百炼 | https://dashscope.aliyuncs.com/compatible-mode/v1 | bailian.console.aliyun.com |
| 硅基流动 | https://api.siliconflow.cn/v1 | cloud.siliconflow.cn |
| 月之暗面 | https://api.moonshot.cn/v1 | platform.moonshot.cn |
图片模型
| 厂商 | 端点类型 | 可用模型 |
|---|---|---|
| 硅基流动 | OpenAI 兼容 /v1/images/generations | FLUX.1-dev, SD 3.5, SANA-1.5 |
| 智谱 | 官方 SDK client.images.generations | CogView-4 |
| 阿里百炼 | 官方 SDK ImageSynthesis.call | Qwen-Image 2.0, 通义万相 |
2.3 多模型统一接入
方案 A:one-api(Go 实现,Web 管理界面)——部署后所有模型通过同一个 base_url 访问,在管理界面配置渠道和模型映射。
方案 B:LiteLLM(Python 库 + 代理服务):
from litellm import completion
response = completion(model="deepseek/deepseek-chat", messages=[{"role": "user", "content": "你好"}])
2.4 切换模型时的 Token 成本变化
切换模型不只是改 base_url——不同模型的 Tokenizer 不同,相同文本产生的 Token 数差异很大。
| 模型 | 英文(Token/英文单词) | 中文(Token/中文字符) | 代码(Token/中文字符) |
|---|---|---|---|
| DeepSeek V3 | 约 1.3(英文单词平均约 5 个字符) | 约 1.5 | 约 0.4 |
| Qwen 2.5 | 约 1.2(英文单词平均约 5 个字符) | 约 1.2 | 约 0.5 |
| GLM-4 | 约 1.4(英文单词平均约 5 个字符) | 约 1.8 | 约 0.5 |
实用建议:中英文混合内容 → Qwen Tokenizer 效率最高;纯代码 → DeepSeek BBPE 有优化。评估成本时要实测 Token 数,最可靠的方式是直接查看厂商 API 返回的 usage.prompt_tokens 字段。
三、本地部署 — 文本模型
3.1 方案总览
Ollama 最简单的本地部署方案,一行命令下载+启动
适合:个人使用、快速体验、开发调试
llama.cpp C++ 实现的纯推理引擎,CPU 推理优化最佳
适合:无显卡场景、嵌入式设备、底层定制
vLLM 生产级高并发推理服务,OpenAI 兼容 API
适合:团队共享、需要高吞吐的服务
3.2 Ollama — 最简本地部署
ollama run qwen2.5:7b # 下载并运行模型(首次自动下载,约 4GB)
ollama serve # 启动 API 服务(默认 http://localhost:11434)
# 调用 Ollama API(OpenAI 兼容格式)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
response = client.chat.completions.create(model="qwen2.5:7b", messages=[...])
Ollama 内部架构:
Ollama (Go 编写的管理程序)
├── 管理模型下载/加载/卸载
├── 暴露 HTTP API (:11434)
└── 底层:llama.cpp (C++ 推理引擎)
└── 加载 GGUF 格式量化模型 → 执行 Transformer 推理
3.3 llama.cpp — 纯推理引擎
GGUF 格式:GGUF 是一种将模型推理所需全部数据打包为单个文件的格式。一个
.gguf文件包含三部分:模型权重(支持 2-bit 到 8-bit 量化)、Tokenizer 词表(不再需要外部 tokenizer 文件)、模型配置元数据。价值在于自包含——一个文件就是完整的模型,不需要 PyTorch、不需要 Python。
git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp && make
./llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf --port 8080
3.4 vLLM — 生产级推理服务
pip install vllm
vllm serve Qwen/Qwen2.5-7B-Instruct --host 0.0.0.0 --port 8000
# 使用 AWQ 量化模型以节省显存(7B 模型从 14GB 降至 ~4GB):
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ --quantization awq
vLLM 的核心优化:
| 优化技术 | 效果 |
|---|---|
| PagedAttention | KV Cache 分页管理,显存利用率提升 2-4 倍 |
| Continuous Batching | 动态合并请求,GPU 利用率大幅提升 |
| Tensor Parallelism | 单模型拆分到多张显卡并行推理 |
| Prefix Caching | 相同前缀(System Prompt)只计算一次 |
| AWQ/GPTQ 量化 | 加载 4-bit 量化模型,显存占用降至原始的 1/4 |
三方案选型:
个人电脑、想立刻用 → Ollama
服务器、多人共享 → vLLM
嵌入设备、无 GPU → llama.cpp
做研究、要改模型 → PyTorch + transformers
四、本地部署 — 图片模型
4.1 为什么没有"图片版 Ollama"
文本模型的本地部署可以一行命令搞定(ollama run qwen2.5:7b),是因为文本模型结构高度标准化——一个模型文件、统一输入输出。图片模型的情况不同:
文本模型 图片模型
──────── ────────
结构 单个 Transformer Text Encoder + UNet + VAE + Scheduler
一个 .gguf 文件 一套 .safetensors 文件(3-5 个)
输入 文字 Prompt 文字 + 可选图片 + 可选遮罩 + 可选控制图
输出 文字 像素矩阵(还需后处理)
统一工具 ✅ Ollama ❌ 不存在等价的一键工具
标准 chat API 最接近的是 ComfyUI(可视化)
4.2 方案 A:diffusers + Python 脚本(最灵活)
from diffusers import AutoPipelineForText2Image
import torch
pipe = AutoPipelineForText2Image.from_pretrained(
"black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16
).to("cuda")
image = pipe(prompt="一只橘猫在沙滩上", num_inference_steps=4).images[0]
4.3 方案 B:ComfyUI — 可视化工作流 + API 模式
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI && pip install -r requirements.txt
python main.py --listen 0.0.0.0 --port 8188
# 在界面搭好工作流后导出为 JSON,通过 HTTP API 批量调用
4.4 方案 C:diffusers + FastAPI 自建服务
from fastapi import FastAPI, Form
from fastapi.responses import Response
import io, torch
from diffusers import AutoPipelineForText2Image
app = FastAPI()
@app.on_event("startup")
async def load_model():
global pipe
pipe = AutoPipelineForText2Image.from_pretrained(
"black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16
).to("cuda")
@app.post("/generate")
async def generate(prompt: str = Form(...)):
image = pipe(prompt=prompt).images[0]
buf = io.BytesIO(); image.save(buf, format="JPEG", quality=95)
return Response(content=buf.getvalue(), media_type="image/jpeg")
五、附:KV Cache 的工作原理与显存计算
为什么需要 KV Cache
Transformer 的自注意力机制中,每个 Token 需要与所有之前的 Token 计算注意力权重。在自回归生成时:
没有缓存:
生成第 1 个 Token:计算 "你好" 的 Key 和 Value
生成第 2 个 Token:重新计算 "你好"+"," 的 Key 和 Value(白算了)
生成第 3 个 Token:重新计算 "你好"+","+"世界" 的 Key 和 Value
...
有 KV Cache:
生成第 1 个 Token:计算 "你好" 的 K/V → 存入 Cache
生成第 2 个 Token:从 Cache 读取 "你好" 的 K/V + 只计算 "," 的 K/V
生成第 3 个 Token:从 Cache 读取前 2 个的 K/V + 只计算 "世界" 的 K/V
计算量从 O(n²) 降为 O(n)。
KV Cache 显存公式
KV Cache 显存 = 2 × batch_size × num_layers × num_kv_heads × head_dim × seq_len × dtype_bytes
实际案例(Qwen2.5-7B, num_layers=28, num_kv_heads=4, head_dim=128, fp16):
单请求、序列长度 4096: 约 235 MB
单请求、序列长度 32768: 约 1.88 GB
8 并发、序列长度 8192: 约 3.76 GB
权重本身(bf16):约 14 GB
峰值显存:14 + 3.76 + ~2 = 约 20 GB(需要 24GB 显卡)
这意味着:上下文越长,KV Cache 占比越大——这就是 vLLM 的 PagedAttention 的核心优化战场。
核心要点回顾
- 远程 API vs 本地不是性能问题,是场景选择问题——同权重同精度下推理质量相同,区别在 12 个工程维度
- Ollama/vLLM/llama.cpp 三选一:个人用 Ollama,生产用 vLLM,嵌入设备用 llama.cpp
- 图片模型没有一键部署工具是结构决定的——多组件管线 vs 单文件模型
- KV Cache 是显存消耗大户——长对话场景下可能超过模型权重本身
- Tokenizer 不同 = 费用不同——切换模型前要实测 Token 数,不是简单"字符数÷2"
大模型部署选型三步决策链:先算显存(KV Cache 公式)→再看成本(API vs 自建 12 维度对比)→最后选框架(Ollama 单机 vs vLLM 高并发)。三步走完,部署方案不再纠结。收藏这篇,下次做部署决策时直接翻出来套公式。
上一篇:《精确控制与视频生成》 | 下一篇:《Claude Code深度拆解》 系列合集:掘金AI合集