Zing 论坛

正文

自托管 vLLM 推理栈实战:基于 Qwen3-14B 的全套 OpenAI 兼容 API 部署方案

详解如何基于 vLLM 构建生产级自托管 LLM 推理服务,涵盖 Qwen3-14B 大模型、bge-m3 嵌入模型、重排序模型的统一部署,以及通过 Cloudflare Tunnel 实现安全公网访问的完整方案。

vLLMQwen3-14B自托管LLMOpenAI兼容APIbge-m3嵌入模型Cloudflare Tunnel私有化部署推理优化RAG基础设施
发布时间 2026/05/20 08:43最近活动 2026/05/20 08:53预计阅读 19 分钟
自托管 vLLM 推理栈实战:基于 Qwen3-14B 的全套 OpenAI 兼容 API 部署方案
1

章节 01

导读 / 主楼:自托管 vLLM 推理栈实战:基于 Qwen3-14B 的全套 OpenAI 兼容 API 部署方案

详解如何基于 vLLM 构建生产级自托管 LLM 推理服务,涵盖 Qwen3-14B 大模型、bge-m3 嵌入模型、重排序模型的统一部署,以及通过 Cloudflare Tunnel 实现安全公网访问的完整方案。

2

章节 02

背景

自托管 vLLM 推理栈实战:基于 Qwen3-14B 的全套 OpenAI 兼容 API 部署方案\n\n## 引言:私有化 LLM 推理的需求与挑战\n\n随着大语言模型在企业场景中的广泛应用,越来越多的组织开始关注私有化部署方案。公有云 API 虽然便捷,但在数据隐私、成本控制、定制化需求等方面存在局限。vLLM 作为开源的高性能推理引擎,为自托管 LLM 服务提供了技术基础。本文将深入解析一套完整的自托管推理栈方案,展示如何通过 vLLM 构建生产级的 OpenAI 兼容 API 服务。\n\n## 方案架构概览\n\n这套推理栈采用多服务协同的架构设计,在同一基础设施上同时运行三种不同类型的模型服务:\n\n| 服务 | 模型 | 内部端口 | 公网端点 |\n|------|------|----------|----------|\n| vllm-qwen | Qwen/Qwen3-14B (BF16, 支持推理) | 8000 → 主机 8005 | https://llm.aiclab.dev |\n| vllm-embedding | BAAI/bge-m3 | 8000 → 主机 8006 | https://embed.aiclab.dev |\n| vllm-reranker | BAAI/bge-reranker-v2-m3 | 8000 → 主机 8007 | https://rerank.aiclab.dev |\n\n所有服务均提供 OpenAI 兼容的 REST API(/v1/chat/completions、/v1/embeddings、/v1/rerank、/v1/models),这种设计使得开发者可以无缝迁移现有基于 OpenAI API 的应用。\n\n## 核心组件技术解析\n\n### Qwen3-14B:推理能力增强的大语言模型\n\n方案选用阿里巴巴通义千问的 Qwen3-14B 作为主力 LLM。该模型采用 BF16 精度,默认启用推理模式(reasoning enabled),在复杂任务上表现出色。值得注意的是,Qwen3 的响应会在最终答案前包含一个 <think>…</think> 思维块,开发者可以选择保留并解析该块,或通过设置 chat_template_kwargs: {enable_thinking: false} 禁用推理模式以获得更快的响应。\n\n### bge-m3:多语言嵌入模型\n\nBAAI 的 bge-m3 是当前开源社区表现优异的文本嵌入模型,支持超过 100 种语言,在检索任务上具有出色的性能。通过 vLLM 的嵌入服务部署,可以提供低延迟、高并发的向量化能力,支撑 RAG(检索增强生成)应用的构建。\n\n### bge-reranker-v2-m3:精排模型\n\n重排序(Reranking)是提升检索质量的关键环节。bge-reranker-v2-m3 专门用于对初步检索结果进行精排,通过计算查询与候选文档的相关性分数,将最相关的内容排在前面,显著提升最终生成质量。\n\n## 部署架构与网络设计\n\n### 容器化部署策略\n\n方案采用 Docker Compose 进行服务编排,核心设计原则是将隧道服务与模型服务分离:\n\n\n.\n├── docker-compose.yml # 3 个 vLLM 服务(Qwen + bge-m3 + bge-reranker-v2-m3)\n├── tunnel-compose.yml # Cloudflare 隧道(独立项目:aiclab-tunnel)\n├── .env.example # 运行时所需的 3 个密钥模板\n├── .gitignore # 排除 .env(绝不要提交密钥)\n└── README.md\n\n\n这种分离架构的优势在于:隧道服务可以持续运行,而模型服务可以根据需要重启或调优,两者互不影响。\n\n### 安全访问机制\n\n方案通过 Cloudflare Tunnel 实现安全的公网暴露,无需在主机上管理 TLS 证书。在 Cloudflare Zero Trust 控制台中,需要为每个服务配置公共主机名路由:\n\n| 子域名 | 服务 URL |\n|--------|----------|\n| llm | http://vllm-qwen:8000 |\n| embed | http://vllm-embedding:8000 |\n| rerank | http://vllm-reranker:8000 |\n\n所有端点均要求 Authorization: Bearer $VLLM_API_KEY 认证,API 密钥是保护公网 GPU 计算资源的唯一屏障,建议使用长随机字符串并定期轮换。\n\n## 资源管理与性能调优\n\n### GPU 内存分配策略\n\n考虑到主机 GPU 可能被多个租户共享,方案对 GPU 内存使用进行了精细化控制:\n\n| 服务 | GPU 内存利用率 | 说明 |\n|------|----------------|------|\n| Qwen | 0.30 | 主力模型,占用主要资源 |\n| Embedding | 0.05 | 轻量级服务 |\n| Reranker | 0.05 | 轻量级服务 |\n\n总计约 56GB GPU 内存,确保在邻居租户负载波动时仍能稳定运行,避免重启时的内存不足崩溃。\n\n### 并发与上下文窗口配置\n\n- Qwen: --max-num-seqs 4 限制并发数以保持 KV Cache 需求可预测;--max-model-len 32768 保留完整 32K 上下文窗口\n- Embedding/Reranker: 使用 8K 上下文窗口,满足大多数文档处理需求\n\n如果 GPU 为独占使用,可适当提高 --gpu-memory-utilization(如 0.6-0.8)和 --max-num-seqs 以获得更高吞吐量。\n\n## 快速启动流程\n\n### 前置条件\n\n- Linux 主机 + NVIDIA GPU + 较新驱动\n- Docker + Docker Compose v2 + NVIDIA Container Toolkit\n- Cloudflare 账户及已添加的域名\n- Hugging Face 账户/Token(用于下载受控模型)\n\n### 环境配置\n\nbash\ncp .env.example .env\n$EDITOR .env\n\n\n需要配置的三个核心变量:\n\n- VLLM_API_KEY: 长随机字符串,客户端需通过 Authorization: Bearer <key> 发送\n- HF_TOKEN: Hugging Face Token,只读权限即可\n- CLOUDFLARE_TUNNEL_TOKEN: Cloudflare Tunnel 的连接器令牌\n\n### 模型预下载(可选但推荐)\n\n为避免容器首次启动时的多 GB 下载阻塞,建议预先下载模型权重:\n\nbash\npython3 -m venv ~/.hf-venv\n~/.hf-venv/bin/pip install huggingface_hub\n~/.hf-venv/bin/hf auth login --token \"$HF_TOKEN\"\n~/.hf-venv/bin/hf download Qwen/Qwen3-14B\n~/.hf-venv/bin/hf download BAAI/bge-m3\n~/.hf-venv/bin/hf download BAAI/bge-reranker-v2-m3\n\n\n权重缓存至 ~/.cache/huggingface,通过卷挂载共享给所有容器。\n\n### 服务启动\n\nbash\n# 启动 3 个 vLLM 服务(创建 aic-lab_default 网络)\ndocker compose up -d\n\n# 启动 Cloudflare 隧道(加入该网络)\ndocker compose -f tunnel-compose.yml up -d\n\n\n观察 LLM 加载日志(Qwen3-14B 加载权重需要几分钟),当日志显示 Uvicorn running on http://0.0.0.0:8000 且隧道显示已注册连接时,服务即就绪。\n\n## API 调用示例\n\n### 聊天补全\n\nbash\ncurl https://llm.aiclab.dev/v1/chat/completions \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"qwen3-14b\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n\n### 文本嵌入\n\nbash\ncurl https://embed.aiclab.dev/v1/embeddings \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"model\": \"bge-m3\", \"input\": \"hello world\"}'\n\n\n### 重排序\n\nbash\ncurl https://rerank.aiclab.dev/v1/rerank \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"bge-reranker-v2-m3\",\n \"query\": \"what is AI\",\n \"documents\": [\"AI is artificial intelligence\", \"bananas are yellow\"]\n }'\n\n\n### Python SDK 调用\n\npython\nfrom openai import OpenAI\nclient = OpenAI(base_url=\"https://llm.aiclab.dev/v1\", api_key=os.environ[\"VLLM_API_KEY\"])\nresp = client.chat.completions.create(\n model=\"qwen3-14b\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)\n\n\n## 运维与监控\n\n### 常用运维命令\n\nbash\n# 查看状态\ndocker compose ps\ndocker compose -f tunnel-compose.yml ps\n\n# 查看日志\ndocker compose logs -f vllm-qwen\ndocker compose -f tunnel-compose.yml logs -f cloudflared\n\n# 仅重启 LLM(隧道不受影响)\ndocker compose restart vllm-qwen\n\n# 仅重启隧道(模型不受影响)\ndocker compose -f tunnel-compose.yml restart\n\n# 完全停止\ndocker compose down\ndocker compose -f tunnel-compose.yml down\n\n\n### 安全加固建议\n\n1. 密钥管理: 永远不要提交 .env 文件,使用只读 Hugging Face Token\n2. API 密钥: 使用长随机值并定期轮换\n3. 深度防御: 在 Cloudflare Access(Zero Trust → Access → Applications)中配置身份验证,仅允许授权用户/Token 访问\n\n## 技术价值与适用场景\n\n这套方案的核心价值在于提供了一套完整的私有化 LLM 基础设施:\n\n- 数据主权: 敏感数据不出境,满足合规要求\n- 成本可控: 相比公有云 API 调用,长期使用成本更低\n- 灵活定制: 可自由选择模型、调整参数、扩展功能\n- 无缝迁移: OpenAI 兼容 API 使得现有应用几乎零改动即可切换\n\n适用场景包括:企业内部知识库问答、涉密文档处理、定制化客服系统、RAG 应用后端等。\n\n## 结语:私有化 LLM 的未来趋势\n\n随着开源模型能力的持续提升和推理优化技术的进步,私有化部署正在从"不得已的选择"转变为"主动的战略决策"。vLLM 等高性能推理引擎的出现,使得单卡 GPU 即可支撑生产级服务。这套方案展示了一种务实的工程实践:通过合理的架构设计和资源管理,在共享硬件上稳定运行多模型服务,同时保持运维的简洁性。对于希望构建自主可控 AI 基础设施的团队而言,这是一份值得参考的蓝图。

3

章节 03

补充观点 1

自托管 vLLM 推理栈实战:基于 Qwen3-14B 的全套 OpenAI 兼容 API 部署方案\n\n引言:私有化 LLM 推理的需求与挑战\n\n随着大语言模型在企业场景中的广泛应用,越来越多的组织开始关注私有化部署方案。公有云 API 虽然便捷,但在数据隐私、成本控制、定制化需求等方面存在局限。vLLM 作为开源的高性能推理引擎,为自托管 LLM 服务提供了技术基础。本文将深入解析一套完整的自托管推理栈方案,展示如何通过 vLLM 构建生产级的 OpenAI 兼容 API 服务。\n\n方案架构概览\n\n这套推理栈采用多服务协同的架构设计,在同一基础设施上同时运行三种不同类型的模型服务:\n\n| 服务 | 模型 | 内部端口 | 公网端点 |\n|------|------|----------|----------|\n| vllm-qwen | Qwen/Qwen3-14B (BF16, 支持推理) | 8000 → 主机 8005 | https://llm.aiclab.dev |\n| vllm-embedding | BAAI/bge-m3 | 8000 → 主机 8006 | https://embed.aiclab.dev |\n| vllm-reranker | BAAI/bge-reranker-v2-m3 | 8000 → 主机 8007 | https://rerank.aiclab.dev |\n\n所有服务均提供 OpenAI 兼容的 REST API(/v1/chat/completions、/v1/embeddings、/v1/rerank、/v1/models),这种设计使得开发者可以无缝迁移现有基于 OpenAI API 的应用。\n\n核心组件技术解析\n\nQwen3-14B:推理能力增强的大语言模型\n\n方案选用阿里巴巴通义千问的 Qwen3-14B 作为主力 LLM。该模型采用 BF16 精度,默认启用推理模式(reasoning enabled),在复杂任务上表现出色。值得注意的是,Qwen3 的响应会在最终答案前包含一个 <think>…</think> 思维块,开发者可以选择保留并解析该块,或通过设置 chat_template_kwargs: {enable_thinking: false} 禁用推理模式以获得更快的响应。\n\nbge-m3:多语言嵌入模型\n\nBAAI 的 bge-m3 是当前开源社区表现优异的文本嵌入模型,支持超过 100 种语言,在检索任务上具有出色的性能。通过 vLLM 的嵌入服务部署,可以提供低延迟、高并发的向量化能力,支撑 RAG(检索增强生成)应用的构建。\n\nbge-reranker-v2-m3:精排模型\n\n重排序(Reranking)是提升检索质量的关键环节。bge-reranker-v2-m3 专门用于对初步检索结果进行精排,通过计算查询与候选文档的相关性分数,将最相关的内容排在前面,显著提升最终生成质量。\n\n部署架构与网络设计\n\n容器化部署策略\n\n方案采用 Docker Compose 进行服务编排,核心设计原则是将隧道服务与模型服务分离:\n\n\n.\n├── docker-compose.yml 3 个 vLLM 服务(Qwen + bge-m3 + bge-reranker-v2-m3)\n├── tunnel-compose.yml Cloudflare 隧道(独立项目:aiclab-tunnel)\n├── .env.example 运行时所需的 3 个密钥模板\n├── .gitignore 排除 .env(绝不要提交密钥)\n└── README.md\n\n\n这种分离架构的优势在于:隧道服务可以持续运行,而模型服务可以根据需要重启或调优,两者互不影响。\n\n安全访问机制\n\n方案通过 Cloudflare Tunnel 实现安全的公网暴露,无需在主机上管理 TLS 证书。在 Cloudflare Zero Trust 控制台中,需要为每个服务配置公共主机名路由:\n\n| 子域名 | 服务 URL |\n|--------|----------|\n| llm | http://vllm-qwen:8000 |\n| embed | http://vllm-embedding:8000 |\n| rerank | http://vllm-reranker:8000 |\n\n所有端点均要求 Authorization: Bearer $VLLM_API_KEY 认证,API 密钥是保护公网 GPU 计算资源的唯一屏障,建议使用长随机字符串并定期轮换。\n\n资源管理与性能调优\n\nGPU 内存分配策略\n\n考虑到主机 GPU 可能被多个租户共享,方案对 GPU 内存使用进行了精细化控制:\n\n| 服务 | GPU 内存利用率 | 说明 |\n|------|----------------|------|\n| Qwen | 0.30 | 主力模型,占用主要资源 |\n| Embedding | 0.05 | 轻量级服务 |\n| Reranker | 0.05 | 轻量级服务 |\n\n总计约 56GB GPU 内存,确保在邻居租户负载波动时仍能稳定运行,避免重启时的内存不足崩溃。\n\n并发与上下文窗口配置\n\n- Qwen: --max-num-seqs 4 限制并发数以保持 KV Cache 需求可预测;--max-model-len 32768 保留完整 32K 上下文窗口\n- Embedding/Reranker: 使用 8K 上下文窗口,满足大多数文档处理需求\n\n如果 GPU 为独占使用,可适当提高 --gpu-memory-utilization(如 0.6-0.8)和 --max-num-seqs 以获得更高吞吐量。\n\n快速启动流程\n\n前置条件\n\n- Linux 主机 + NVIDIA GPU + 较新驱动\n- Docker + Docker Compose v2 + NVIDIA Container Toolkit\n- Cloudflare 账户及已添加的域名\n- Hugging Face 账户/Token(用于下载受控模型)\n\n环境配置\n\nbash\ncp .env.example .env\n$EDITOR .env\n\n\n需要配置的三个核心变量:\n\n- VLLM_API_KEY: 长随机字符串,客户端需通过 Authorization: Bearer <key> 发送\n- HF_TOKEN: Hugging Face Token,只读权限即可\n- CLOUDFLARE_TUNNEL_TOKEN: Cloudflare Tunnel 的连接器令牌\n\n模型预下载(可选但推荐)\n\n为避免容器首次启动时的多 GB 下载阻塞,建议预先下载模型权重:\n\nbash\npython3 -m venv ~/.hf-venv\n~/.hf-venv/bin/pip install huggingface_hub\n~/.hf-venv/bin/hf auth login --token \"$HF_TOKEN\"\n~/.hf-venv/bin/hf download Qwen/Qwen3-14B\n~/.hf-venv/bin/hf download BAAI/bge-m3\n~/.hf-venv/bin/hf download BAAI/bge-reranker-v2-m3\n\n\n权重缓存至 ~/.cache/huggingface,通过卷挂载共享给所有容器。\n\n服务启动\n\nbash\n启动 3 个 vLLM 服务(创建 aic-lab_default 网络)\ndocker compose up -d\n\n启动 Cloudflare 隧道(加入该网络)\ndocker compose -f tunnel-compose.yml up -d\n\n\n观察 LLM 加载日志(Qwen3-14B 加载权重需要几分钟),当日志显示 Uvicorn running on http://0.0.0.0:8000 且隧道显示已注册连接时,服务即就绪。\n\nAPI 调用示例\n\n聊天补全\n\nbash\ncurl https://llm.aiclab.dev/v1/chat/completions \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"qwen3-14b\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n }'\n\n\n文本嵌入\n\nbash\ncurl https://embed.aiclab.dev/v1/embeddings \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"model\": \"bge-m3\", \"input\": \"hello world\"}'\n\n\n重排序\n\nbash\ncurl https://rerank.aiclab.dev/v1/rerank \\\n -H \"Authorization: Bearer $VLLM_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"bge-reranker-v2-m3\",\n \"query\": \"what is AI\",\n \"documents\": [\"AI is artificial intelligence\", \"bananas are yellow\"]\n }'\n\n\nPython SDK 调用\n\npython\nfrom openai import OpenAI\nclient = OpenAI(base_url=\"https://llm.aiclab.dev/v1\", api_key=os.environ[\"VLLM_API_KEY\"])\nresp = client.chat.completions.create(\n model=\"qwen3-14b\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)\n\n\n运维与监控\n\n常用运维命令\n\nbash\n查看状态\ndocker compose ps\ndocker compose -f tunnel-compose.yml ps\n\n查看日志\ndocker compose logs -f vllm-qwen\ndocker compose -f tunnel-compose.yml logs -f cloudflared\n\n仅重启 LLM(隧道不受影响)\ndocker compose restart vllm-qwen\n\n仅重启隧道(模型不受影响)\ndocker compose -f tunnel-compose.yml restart\n\n完全停止\ndocker compose down\ndocker compose -f tunnel-compose.yml down\n\n\n安全加固建议\n\n1. 密钥管理: 永远不要提交 .env 文件,使用只读 Hugging Face Token\n2. API 密钥: 使用长随机值并定期轮换\n3. 深度防御: 在 Cloudflare Access(Zero Trust → Access → Applications)中配置身份验证,仅允许授权用户/Token 访问\n\n技术价值与适用场景\n\n这套方案的核心价值在于提供了一套完整的私有化 LLM 基础设施:\n\n- 数据主权: 敏感数据不出境,满足合规要求\n- 成本可控: 相比公有云 API 调用,长期使用成本更低\n- 灵活定制: 可自由选择模型、调整参数、扩展功能\n- 无缝迁移: OpenAI 兼容 API 使得现有应用几乎零改动即可切换\n\n适用场景包括:企业内部知识库问答、涉密文档处理、定制化客服系统、RAG 应用后端等。\n\n结语:私有化 LLM 的未来趋势\n\n随着开源模型能力的持续提升和推理优化技术的进步,私有化部署正在从"不得已的选择"转变为"主动的战略决策"。vLLM 等高性能推理引擎的出现,使得单卡 GPU 即可支撑生产级服务。这套方案展示了一种务实的工程实践:通过合理的架构设计和资源管理,在共享硬件上稳定运行多模型服务,同时保持运维的简洁性。对于希望构建自主可控 AI 基础设施的团队而言,这是一份值得参考的蓝图。