Cost, Billing, and Ops2026年10月14日Flatkey Team

在你自己的 GPU 上构建 OpenAI 兼容推理服务器:vLLM 推理服务器 OpenAI 兼容 API 指南

在你自己的 GPU 上构建 vLLM 推理服务器的 OpenAI 兼容 API,然后通过 SDK 迁移、边缘控制、测试、指标和回退路由来加固它。

在你自己的 GPU 上构建 OpenAI 兼容推理服务器:vLLM 推理服务器 OpenAI 兼容 API 指南

如果你已经有 GPU 算力,一个兼容 OpenAI 的推理服务器可以让你的应用保持相同的客户端形态,同时把后端从托管模型 API 切换到你自己的基础设施。通常路径在概念上很简单:在 GPU 节点上运行 vLLM 或 LocalAI,暴露一个 /v1 API,把你的 SDK base_url 指向该端点,然后为认证、路由、监控和容量对服务进行加固。

本指南聚焦实际搭建:如何架设一个 vllm inference server openai compatible api,在把它放到生产流量之前应该测试什么,以及什么时候把自托管作为基准,同时将大多数工作负载通过像 Flatkey 这样的托管模型 API 路由出去会更明智。

简要答案

对于大多数 LLM 文本工作负载,先从 vLLM 开始。它提供兼容 OpenAI 的 HTTP 服务器,支持常见的 OpenAI 风格端点,例如聊天补全、补全、嵌入,以及模型列表,具体取决于所加载的模型类型,并且提供用于部署的官方 Docker 镜像。

一个最小的自托管栈如下所示:

层 生产环境选择 其重要性
GPU 主机 H100、H200、B200、A100、L40S 或其他受支持的加速器 决定模型大小、并发、上下文长度和延迟上限。
容器运行时 NVIDIA 驱动加 NVIDIA Container Toolkit 让 Docker 容器通过 --gpus all 看到 GPU。
推理引擎 用于高吞吐文本服务的 vLLM;用于更广泛本地 OpenAI 兼容用例的 LocalAI vLLM 是在 GPU 上服务 transformer LLM 的默认起点。
API 表面 /v1/chat/completions、/v1/completions、/v1/models,以及仅限你的模型所支持的额外端点 保持客户端迁移成本较小,并避免产生错误的兼容性假设。
边缘层 Nginx、Envoy、Caddy 或云负载均衡器 处理 TLS、认证、请求限制和路由。
运维 指标、日志、GPU 遥测、金丝雀发布和回退路由 避免服务器成为一个不可见的故障来源。

当你需要直接硬件控制、数据本地性、自定义模型权重或可预测的高容量服务经济性时,使用 vllm inference server openai compatible api。当你主要需要可靠输出,而不想负责 GPU 利用率、驱动漂移、模型加载和故障切换时,使用网关/模型 API 基线。

在构建之前:先决定自托管是否值得

运行你自己的兼容 OpenAI 的推理服务器并不一定更便宜。当你的 GPU 保持繁忙,且工作负载适合你所托管的模型时,它会非常出色。当利用率波动很大、提示差异巨大、模型质量经常变化,或者团队花在调试基础设施上的时间多于交付产品时,它可能会很昂贵。

在租用或购买硬件之前,请使用下面这个决策表:

问题 如果答案是“是”,则自托管 如果答案是“是”,则优先选择托管 API 或网关
你是否有稳定流量? GPU 可以保持预热并获得高利用率。 流量是突发性的、季节性的或实验性的。
你是否需要自定义权重? 你提供经过微调、量化或私有的模型。 公开前沿模型或开权重托管模型已经足够。
是否需要数据本地性? 请求必须保留在你的 VPC 或本地网络内。 标准 API 安全控制已经满足要求。
你能否运维 GPU 基础设施? 你已经在监控驱动、CUDA、容器、内存、队列和发布风险。 你不希望 GPU 运维成为产品路线图的一部分。
输出质量是否稳定? 单一模型家族足以满足该工作流。 你需要在许多模型之间进行比较、路由或故障切换。

Flatkey 适合作为最后一列中的基线:一个兼容 OpenAI 的端点、一个账单,以及访问许多官方模型的能力。即使你构建了一个 vllm inference server openai compatible api,也应在基准测试中保留一个模型 API 基线,这样你就可以比较延迟、质量和每个被接受输出的成本,而不仅仅是每 GPU 小时成本。

参考架构

生产环境中的兼容 OpenAI 推理服务器不应直接将模型引擎暴露给公网。应在其前面放置一层薄的控制层。

flowchart LR
  A[OpenAI SDK / app workers] --> B[API edge: TLS, auth, rate limits]
  B --> C[OpenAI-compatible /v1 route]
  C --> D[vLLM inference server]
  D --> E[GPU node or GPU pool]
  D --> F[Metrics and logs]
  B --> G[Fallback route: Flatkey or another model API]

关键的设计选择是将兼容性与运维分离。vLLM 可以支持 OpenAI 风格的 API。你的边缘层应该负责认证、配额、请求大小限制、TLS、审计日志和回退行为。

第 1 步:准备 GPU 主机

从一台干净的 Linux GPU 机器开始。确认主机具备:

  • 与你计划运行的 GPU 和 CUDA 栈兼容的 NVIDIA 驱动。
  • Docker 或其他受支持的容器运行时。
  • 已配置 NVIDIA Container Toolkit,以便容器可以访问 GPU。
  • 足够的本地或网络存储用于模型权重。
  • 在认证和 TLS 就绪之前,不会暴露推理端口的网络路径。

NVIDIA 的容器工具包安装流程会使用 nvidia-ctk runtime configure --runtime=docker 配置 Docker,然后重启 Docker。之后,就可以使用 Docker 的 GPU 标志在容器中启用 GPU 访问来运行容器。

在安装模型服务器之前先运行这些检查:

nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi

如果任一命令失败,请先修复驱动/运行时层。只有当底层 GPU 运行时稳定时,vllm inference server openai compatible api 才能保持稳定。

步骤 2:启动 vLLM Inference Server OpenAI Compatible API

vLLM 的官方 Docker 部署文档将 vllm/vllm-openai ઓળખ为用于运行 OpenAI 兼容服务器的镜像。一个实际的首次运行示例如下:

docker run --rm --gpus all \
  --ipc=host \
  -p 8000:8000 \
  -e HUGGING_FACE_HUB_TOKEN="$HUGGING_FACE_HUB_TOKEN" \
  vllm/vllm-openai:latest \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name llama-3.1-8b-instruct

对于私有模型,请将模型 ID 替换为你自己的仓库或本地路径。用于生产环境时,应固定镜像标签和模型版本,而不要部署 latest。

然后测试模型列表:

curl http://localhost:8000/v1/models

再测试聊天补全:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama-3.1-8b-instruct",
    "messages": [
      {"role": "system", "content": "You are a concise assistant."},
      {"role": "user", "content": "Reply with one sentence about self-hosted inference."}
    ],
    "temperature": 0.2
  }'

这就是第一个可工作的里程碑:一个本地的 vllm inference server openai compatible api,你的应用可以用与 OpenAI 风格聊天相同的请求格式来调用它。

步骤 3:将你现有的 SDK 指向本地端点

大多数 OpenAI 兼容迁移工作应该发生在配置层,而不是应用逻辑中。使用 Python SDK 模式时,设置自定义 base_url 和 API key:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="local-dev-key",
)

response = client.chat.completions.create(
    model="llama-3.1-8b-instruct",
    messages=[
        {"role": "user", "content": "Give me a deployment checklist."}
    ],
)

print(response.choices[0].message.content)

在生产环境中,不要让应用 worker 直接连接到原始的 vLLM 进程。请将它们指向你自己的内部网关或负载均衡器:

OPENAI_BASE_URL=https://inference.example.com/v1
OPENAI_API_KEY=<your-internal-service-token>

该网关可以路由到 vLLM、阻止不受支持的请求字段、规范化模型别名,并在自托管池已饱和时故障转移到 Flatkey 或其他模型 API。

步骤 4:了解 “OpenAI-Compatible” 不意味着什么

OpenAI-compatible 并不意味着每个端点、模型行为、工具调用、流式事件或特定提供方选项都与 OpenAI 完全一致。它只是意味着服务器接受某些选定端点的熟悉请求格式。

在你认为迁移完成之前,请测试:

兼容性区域 需要验证什么
聊天消息 角色处理、系统消息、长上下文、如有使用则验证多模态负载。
流式输出 事件格式、断开连接行为、客户端超时、部分输出处理。
工具/函数调用 加载的模型和服务器是否支持你的工具调用模式。
嵌入 加载的模型是否确实是一个嵌入模型。
错误码 边缘层和引擎层的 400、401、404、408、429、500、503 行为。
请求参数 temperature、max tokens、top-p、stop 序列、额外的提供方参数。
令牌计量 提示/输出令牌计数以及成本归因。

最安全的做法是维护一套兼容性测试集。将一组固定的真实应用提示词发送到 OpenAI、Flatkey 以及你的 vllm inference server openai compatible api。比较延迟、schema 有效性、拒答行为、输出质量以及可接受输出率。

步骤 5:为模型和流量规划 GPU 内存

主要的服务失败模式不是“服务器启动得很慢”。而是“服务器能启动,但在真实上下文长度和并发下崩溃”。

按以下因素规划内存:

  • 模型权重。
  • 用于上下文和并发序列的 KV cache。
  • 运行时开销。
  • 碎片化和预留余量。
  • 当模型无法装入单个 GPU 时的张量并行。
  • 如果使用更低精度,量化带来的权衡。

如需更深入的工作表,可使用 Flatkey 指南了解 LLM GPU 内存需求。对于集群级规划,可以将其与 GPU 集群架构 和 GPU 集群 TCO 风格的分析结合起来。

一个粗略的验收规则:

usable_capacity = model_fit + target_context + target_concurrency + 20-30% headroom

如果你无法保持这部分余量,就缩短上下文长度、降低并发、使用更小的模型、拆分到多块 GPU 上,或者将溢出流量路由到自托管池之外。

第 6 步:在生产前添加 API 边缘层

原始的 vLLM 服务器并不是你的完整生产控制平面。应在它前面放置一个边缘层,并让该边缘层负责:

  • TLS 终止。
  • 服务间认证。
  • 请求体大小限制。
  • 按团队或按应用的速率限制。
  • 模型别名映射。
  • 结构化请求日志。
  • 超时和重试预算。
  • 金丝雀路由。
  • 回退路由。

Nginx 示例形态:

server {
  listen 443 ssl;
  server_name inference.example.com;

  client_max_body_size 4m;

  location /v1/ {
    proxy_pass http://vllm_backend:8000/v1/;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Request-Id $request_id;
    proxy_read_timeout 120s;
  }
}

这仅仅是一个起点。生产团队还应添加身份验证、mTLS 或私有网络、请求日志策略,以及围绕提示长度和输出长度的明确限制。

第 7 步:衡量被接受的输出,而不只是每秒 token 数

GPU 推理服务仪表板通常过度关注吞吐量。每秒 token 数很重要,但产品团队通常更关心被接受的输出:足够快、足够有效、足以交付给用户或下游工作流的响应。

跟踪:

指标 重要原因
首 token 时间 流式应用中的用户感知延迟。
端到端延迟 排队时间加生成时间。
队列深度 GPU 池饱和的早期警告。
GPU 内存利用率 上下文/并发假设是否现实。
按模型别名划分的错误率 检测模型特定故障。
输出 schema 通过率 对代理、抽取和工具工作流至关重要。
被接受的输出率 综合质量、延迟和有效性。
回退率 显示自托管池何时已不够用。

然后计算每个被接受输出的成本:

cost_per_accepted_output =
  (gpu_cost + storage + network + ops_time + fallback_api_cost)
  / accepted_outputs

这就是 vllm inference server openai compatible api 与托管 API 进行诚实比较的地方。如果本地 GPU 在原始 token 成本上更低,但在重试、失败或运维时间上更差,那么按被接受输出计算的成本可能会高于预期。

第 8 步:添加回退,而不是把 GPU 机器当作单点故障

你的应用不应关心响应来自自托管 vLLM、Flatkey,还是其他模型路由。它应该请求一个模型别名,并接收响应或受控失败。

使用如下路由规则:

条件 路由
正常流量,GPU 健康 自托管 vLLM。
GPU 队列超过阈值 溢出到 Flatkey 模型 API。
模型加载或重启 在热身前将所有流量路由到 Flatkey。
schema 失败激增 金丝雀回切到托管 API。
实验性提示评估 同时对本地和托管模型运行以作比较。

这种设计让团队在保留自托管经济性和控制权的同时,不会把产品可用性绑定到单个推理服务器上。

用于 OpenAI 兼容本地推理的 vLLM 与 LocalAI

在寻找 OpenAI 兼容推理服务器时,vLLM 和 LocalAI 都会出现在搜索结果中,但它们适合不同的场景。

选项 最佳适用场景 需要注意
vLLM 在 GPU 上进行高吞吐 LLM 服务,尤其是 transformer 文本模型。 兼容性取决于模型类型和端点;生产加固仍需在其外部完成。
LocalAI 跨多个本地模型后端和模态的本地 OpenAI 兼容 API。 吞吐量和 GPU 行为高度依赖后端、模型和硬件。
Flatkey 跨许多官方模型的托管 OpenAI 兼容模型 API 基线。 你失去了对服务引擎的直接控制,但避免了自行承担 GPU 运维。

对于本文的目标工作负载,先从 vllm inference server openai compatible api 开始。当你的目标是更广泛的本地实验,或在多个后端之上提供单一本地 API,而不是为某一类 LLM 争取最高 GPU 服务吞吐量时,再评估 LocalAI。

生产检查清单

在你将其路由给真实用户之前,请使用以下清单:

  • [ ] 已在容器内使用 nvidia-smi 验证 GPU 驱动和容器运行时。
  • [ ] 已固定 vLLM 镜像标签和模型修订版本。
  • [ ] 模型别名稳定且有文档记录。
  • [ ] 已通过最终边缘 URL 测试 /v1/models 和 /v1/chat/completions。
  • [ ] 已测试带客户端断开连接的流式传输。
  • [ ] 已按预期生产规模运行长上下文和并发测试。
  • [ ] 已在边缘添加认证;原始 vLLM 端口未公开。
  • [ ] 已强制限制请求体大小、最大输出 token 数和超时时间。
  • [ ] 日志中不包含敏感提示数据,除非明确批准。
  • [ ] 指标已捕获延迟、排队、GPU 内存、错误率和已接受输出率。
  • [ ] 已为饱和和事故配置回退路由。
  • [ ] 已使用相同提示对托管 API 基线进行测量。
  • [ ] 已测试回滚计划。

常见错误

最大的错误是把第一次成功的 curl 当成工作的结束。它只是开始。

其他常见失败包括:

  • 在生产中运行 latest 镜像,却不固定版本。
  • 将原始推理端口暴露到互联网上。
  • 假设每个 OpenAI 请求参数都受支持。
  • 只对一个短提示词做基准测试,就称结果为“已可用于生产”。
  • 忽视实际上下文长度带来的 KV cache 增长。
  • 忘记模型加载时间会影响部署和恢复。
  • 只计算 GPU 小时成本,却不算运维时间、重试和质量失败。
  • 因为本地端点“兼容 OpenAI”就跳过回退。

一个生产级的 vllm inference server openai compatible api 是有用的基础设施。它不是魔法般的兼容性,也不是运营纪律的替代品。

何时在自己的 GPU 旁边使用 Flatkey

在这种架构中,Flatkey 最适合作为托管模型/API 基线和回退路径。让你的应用继续使用 OpenAI 兼容的客户端形态,然后将一部分流量路由到本地 GPU 池,另一部分路由到 Flatkey。

这样你就能获得:

  • 比较自建模型输出质量与托管模型的一种方式。
  • 本地 GPU 饱和时的溢出容量。
  • 驱动、模型或部署事故期间的回退路由。
  • 无需增加更多提供商密钥即可访问其他模型家族。
  • 当自建模型表现不佳时,更顺畅地回到托管 API 的路径。

这个决策不是“自有 GPU 还是使用 API”。对许多团队来说,更持久的方案是两者兼有:在能带来控制权或成本优势的地方使用自己的 GPU 路径,同时保留托管路径以提升韧性和模型选择能力。

常见问题

什么是 OpenAI 兼容推理服务器?

OpenAI 兼容推理服务器会公开具有 OpenAI 风格请求和响应形态的 HTTP 端点,通常位于 /v1 下。这使应用可以使用熟悉的 SDK 配置,例如自定义 base_url,同时将流量发送到不同的后端。

vLLM 是 OpenAI 兼容推理服务器吗?

是的。vLLM 提供 OpenAI 兼容服务器,并记录了对常见 OpenAI 风格端点的支持,例如聊天补全、补全、嵌入和模型列表,具体取决于模型类型和功能。

我可以在本地运行 vLLM OpenAI 兼容服务器吗?

可以。你可以在 GPU 工作站或服务器上本地运行 vLLM,然后将 /v1 端点暴露给你的应用。对于生产环境,请在前面放置带认证的边缘层或内部网关。

我需要什么硬件?

这取决于模型大小、精度、上下文长度和并发目标。先按模型权重加 KV cache 和余量来估算容量,然后用真实提示进行测试。一个小型指令模型可能放得下一张 GPU;70B 模型或高并发工作负载可能需要更大显存的 GPU 或张量并行。

我应该使用 vLLM 还是 LocalAI?

如果任务是面向 GPU 的高吞吐量 LLM 推理,优先使用 vLLM。如果你希望在多个本地后端或模态之间拥有更广泛的本地 OpenAI 兼容服务器,则评估 LocalAI。

OpenAI 兼容是否意味着可直接替换且完全相同?

不意味着。端点形态可能一致,但模型行为、支持的参数、工具、流式传输、嵌入、错误和 token 计费都可能不同。在切换生产流量之前先运行兼容性测试。

结论

构建一个 vllm inference server openai compatible api 是把自己的 GPU 转变为 OpenAI 风格端点的最快实用方式。核心构建很直接:准备 GPU 运行时,运行 vLLM,将 SDK 指向 /v1,然后加入边缘层、监控、兼容性测试和回退路由,使其达到生产级。

最好的团队不会止步于“它能运行”。他们会将自建推理与托管模型 API 基线进行比较,衡量已接受输出,并保持回退路由随时可用。这就是你既能获得自己 GPU 的控制权,又不会让每个产品请求都依赖于一台脆弱推理服务器的方法。

官方参考

  • vLLM OpenAI 兼容服务器文档:https://docs.vllm.ai/en/latest/serving/online_serving/
  • vLLM Docker 部署文档:https://docs.vllm.ai/en/latest/deployment/docker/
  • NVIDIA Container Toolkit 安装指南:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
  • OpenAI Python SDK README:https://github.com/openai/openai-python
  • LocalAI 项目文档:https://localai.io/