1. 先想清楚:你要的到底是"能跑"还是"能扛"
很多人第一次做大模型部署,卡点不在模型权重下载,而在选错框架。直接拿 Transformers 的generate()写个 Flask 接口,本地跑通没问题,一上并发就露馅:KV Cache 按最大长度预留导致显存爆掉、静态批处理让短请求干等长请求、相同 System Prompt 每个请求都重算一遍 Prefill。这些不是代码写得烂,而是朴素实现天生不具备服务能力。
vLLM、TGI、llama.cpp、SGLang 这四类框架解决的就是这件事——把固定硬件榨成稳定服务能力。它们各自有明确的甜点区:vLLM 是通用 GPU 在线服务的默认答案,SGLang 对 Agent 和共享前缀工作负载更狠,llama.cpp 在本地、Mac、边缘和隐私场景几乎无对手,TGI 则已经进入维护模式,存量系统能跑但新项目要慎重。这篇不给你排"谁第一",而是按硬件位置、请求形态、前缀重复率三个维度帮你选,再把 TaoToken 作为统一 Key/API 通道接进去,让本地框架和云端模型走同一套配置。
适合谁看:手里有 GPU 想自建推理服务的后端、要在 Mac 上跑本地模型的独立开发者、以及已经在用多个框架但被 Key 管理搞烦的团队。下面每个框架都给启动参数骨架,TaoToken 部分给settings.json和config.toml两份可直接抄的配置。
2. TaoToken 前置:为什么部署框架旁边要放一个统一通道
自建推理服务有个绕不开的现实:你不可能所有请求都走本地。小模型本地跑,大模型调云端;高峰期本地扛不住要溢出到 API;Agent 的工具调用和长上下文推理可能分别落在不同模型上。如果每个框架、每个模型都维护一套 Key 和 endpoint,配置会迅速失控。
TaoToken 在这里的角色是统一入口。官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 上有完整说明,API 地址是 https://taotoken.net/api(这个不加 UTM)。它提供 OpenAI 兼容的接口形态,意味着 vLLM、SGLang、llama.cpp 的llama-server这些本身就暴露 OpenAI 兼容端点的框架,可以和 TaoToken 用同一套客户端代码切换。
关键动作是先拿到 Key。进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 创建,然后在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 生成。建议按用途分 Key:本地调试一个、生产服务一个、Agent 一个,方便单独吊销和统计。
注意:Key 只显示一次,生成后立刻存进环境变量或密钥管理,别硬编码进代码仓库。
拿到 Key 后,本地框架和 TaoToken 的关系是这样:本地框架负责你自己的 GPU 算力,TaoToken 负责云端模型和统一路由。两者用同一个base_url切换逻辑,代码里只改一个变量。
3. 可复制配置:四个框架的启动骨架 + TaoToken 双配置
3.1 vLLM:通用 GPU 在线服务优先候选
vLLM 的核心是 PagedAttention,把 KV Cache 切成固定大小 Block 按需分配,请求用多少 token 占多少 Block。现在它已经不只是单点优化,连续批处理、Chunked Prefill、Automatic Prefix Caching、量化、推测解码、OpenAI 兼容接口都齐了。
vllm serve Qwen/Qwen3-8B \ --host 0.0.0.0 \ --port 8000 \ --max-model-len 32768 \ --enable-prefix-caching \ --gpu-memory-utilization 0.90--enable-prefix-caching对长文档问答和固定 System Prompt 场景收益明显,但要注意它只省 Prefill,不加速 Decode。--gpu-memory-utilization别拉满,留 10% 给激活和碎片。
3.2 SGLang:Agent 和共享前缀工作负载
SGLang 的 RadixAttention 把不同请求的公共 token 前缀组织成树,Agent 反复携带工具说明、系统约束、对话历史时命中率很高。
python -m sglang.launch_server \ --model-path Qwen/Qwen3-8B \ --host 0.0.0.0 \ --port 30000 \ --mem-fraction-static 0.85别简单认为"有共享前缀就只能选 SGLang",vLLM 现在也有 Automatic Prefix Caching。正确做法是用真实 Agent 轨迹同口径压测,比缓存命中率、TTFT、TPOT 和显存占用。
3.3 llama.cpp:本地、Mac、边缘与隐私
llama.cpp 纯 C/C++、依赖少、后端覆盖 Apple Metal、CUDA、Vulkan、SYCL、WebGPU,支持 CPU+GPU 混合推理,模型格式是 GGUF。
llama-server -hf ggml-org/gemma-3-1b-it-GGUF \ --host 0.0.0.0 \ --port 8080 \ --ctx-size 8192 \ --n-gpu-layers 99--n-gpu-layers 99表示尽量把层放 GPU,Mac 上会自动走 Metal。它也能当轻量 Embedding 和 Rerank 服务用。
3.4 TGI:存量维护,新项目慎选
TGI 曾经提供 HF Hub 快速部署、连续批处理、张量并行、Prometheus 指标。但 Hugging Face 已将 TGI 仓库归档转入维护模式,只接受小型修复和文档改进,官方推荐转向 vLLM、SGLang 和 llama.cpp。已有系统不必推倒,新项目要把迁移能力和长期维护风险写进选型清单。
3.5 TaoToken 的 settings.json 配置
给 Claude Code 或类似工具用:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-your-taotoken-key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }3.6 TaoToken 的 config.toml 配置
给 Codex 或 TOML 风格客户端用:
[model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" [profiles.default] model_provider = "taotoken" model = "gpt-5"两份配置的共同点:base_url指向https://taotoken.net/api,Key 从环境变量读。这样本地 vLLM 的http://localhost:8000/v1和 TaoToken 的云端端点,在客户端代码里只是换一个base_url。
4. 验证请求:连通性和推理延迟怎么测
配置写完别急着上业务,先做三步验证。
第一步,确认本地框架活着:
curl http://localhost:8000/v1/models返回模型列表说明 OpenAI 兼容端点正常。
第二步,测一次真实推理并记录 TTFT:
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen/Qwen3-8B", "messages": [{"role": "user", "content": "用一句话解释 PagedAttention"}], "stream": true }'流式输出下,第一个 chunk 到达的时间就是 TTFT,后续 chunk 间隔反映 TPOT。
第三步,验证 TaoToken 通道:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5", "messages": [{"role": "user", "content": "ping"}] }'两边都通,说明本地和云端走同一套客户端逻辑没问题。想直接对比模型输出,可以进模型对话 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 手动试几个 Prompt,确认路由和模型名对得上。
压测别只报一个 tokens/s。固定模型版本、量化方式、GPU、上下文长度分布、输出长度分布、并发和采样参数,至少准备短问短答、长文档问答、Agent 多轮三套负载。TTFT 看首字等待,TPOT 看流式节奏,P95/P99 暴露排队抖动,显存和成本决定商业可行性。
5. 本篇常见错排查
启动就 OOM:--max-model-len设太大,KV Cache 按最大长度预留。先降到 8192 跑通,再按实际上下文分布往上调。vLLM 的--gpu-memory-utilization别超过 0.92。
Prefix Cache 命中率低:提示词前面有变化的内容。固定 System Prompt 和 Few-shot 放最前面,用户变量放后面,缓存块边界才稳定。
llama.cpp 速度慢:--n-gpu-layers没设或设太小,层还在 CPU 上。Mac 上确认走 Metal,Linux 上确认 CUDA/Vulkan 后端编译进去了。
TaoToken 返回 401:Key 没读到或环境变量名写错。settings.json里是ANTHROPIC_AUTH_TOKEN,config.toml里是env_key指定的变量名,两者别混。
并发一高尾延迟爆炸:只盯吞吐没看 P99。连续批处理在高并发下如果调度参数激进,会牺牲首 token 延迟。生产环境必须同时观察吞吐和尾延迟。
多框架 Key 管理混乱:本地框架和 TaoToken 用同一个客户端封装,base_url和 Key 从配置读,别在每个脚本里硬编码。
6. 选型落地与统一通道
选型从三个问题开始:硬件在哪、请求是否高并发、前缀重复率多高。本地和边缘优先 llama.cpp;通用 GPU 在线服务优先 vLLM;Agent、多轮、共享前缀明显时把 SGLang 拉进同口径压测;NVIDIA 大集群且模型稳定再考虑 TensorRT-LLM 的深度优化。TGI 作为存量维护对象,新项目别默认选它。
框架更新很快,锁定版本和容器镜像,每次升级保留可重复 benchmark 和一小套业务质量回归数据。长期做编码和 Agent 的,可以看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 把云端模型和本地推理串成一条链路;接入细节和参数说明在接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里,Claude Code 相关配置参考 ClaudeCodeAnthropic https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecodeanthropic&utm_campaign=rewrite。先把本地curl打通,再把 TaoToken 的 Key 塞进环境变量,两套端点跑同一份客户端代码,部署这件事就从"选型焦虑"变成"改一个 base_url"。