使用 vLLM 部署 Qwen3 通用推理服务
本文介绍如何使用自定义 vLLM 镜像部署 Qwen3 通用推理服务。该方案适合通用问答、文本摘要、轻量代码生成和功能验证。
信息
本文以 Qwen3-8B 为示例。若改用 Qwen3-14B、Qwen3-32B 或其他 Qwen3 模型,请同步调整 GPU 规格、模型路径、上下文长度和并发参数。若您需要 SGLang 的特定能力,可参考使用 SGLang 部署推理服务。
推荐配置
| 配置项 | 建议 |
|---|---|
| 推理类型 | 推理服务 |
| 资源类型 | 包年包月资源或 Spot 资源 |
| GPU 起步配置 | RTX 4090 可用于功能验证;A100、H100、H800、H200 更适合较长上下文或更高并发 |
| 推理引擎 | vLLM。若需要 SGLang 特定能力,例如高吞吐、长上下文优化或 DFlash 推理调优,可改用 SGLang |
| 镜像 | 使用自定义 vLLM 镜像 |
| 模型文件 | /infini-data/Qwen3-8B 或共享高性能存储中的 Qwen3-8B 模型目录 |
| 监听端口 | 8000 |
| 监控端口 | 8000 |
警告
公共数据仅在部分可用区提供,且为只读挂载。如果当前可用区没有公共数据,或公共数据中没有目标模型,请先将模型文件准备到共享高性能存储,并在创建推理服务时挂载到容器内路径,例如 /mnt/models。
准备自定义镜像
如果平台预置镜像中的 vLLM 版本不能满足要求,建议使用镜像中心构建自定义镜像。
打开镜像中心。
参考使用 uv 的 vLLM Dockerfile构建镜像。
构建完成后,在创建推理服务时选择该自定义镜像。
警告
请勿在推理服务启动命令中临时安装 vLLM 或下载大型依赖。应在镜像中固定推理框架版本。
准备模型路径
本文启动命令默认读取:
/infini-data/Qwen3-8B/infini-data/ 是平台公共数据的容器内挂载路径,用于只读访问平台维护的公共模型和数据集。公共数据仅在部分可用区提供;创建推理服务时,还需要在存储配置中勾选挂载公共数据,容器内才会出现该路径。
如果当前可用区没有公共数据,或公共数据中没有目标模型,请将模型放在共享高性能存储中,并在创建推理服务时挂载到容器内路径。例如:
/mnt/models/Qwen3-8B随后在启动命令中把 MODEL_PATH 改为实际路径。
创建推理服务
进入推理服务创建页。
按以下方式填写关键配置:
- 推理类型:选择推理服务。
- 资源类型:选择包年包月资源或 Spot 资源。使用 Spot 资源时,请确认业务能接受资源回收导致的短暂不可用。
- 实例规格:Qwen3-8B 功能验证可从单卡规格开始。若使用更长上下文、更高并发或更大 Qwen3 模型,请选择更大显存或更多 GPU 的规格。
- 镜像:选择已构建的 vLLM 自定义镜像。
- 存储:挂载公共数据或包含模型文件的共享高性能存储。
- 内网配置:监听端口填写
8000。如需 LLM 场景业务监控,监控端口也填写8000。
启动命令
以下命令会启动 OpenAI 兼容的 vLLM 服务。若模型路径不同,请修改 MODEL_PATH。
#!/bin/bash
set -euo pipefail
export PYTHONUNBUFFERED=1
export MODEL_PATH="${MODEL_PATH:-/infini-data/Qwen3-8B}"
export SERVED_MODEL_NAME="${SERVED_MODEL_NAME:-Qwen3-8B}"
exec vllm serve "${MODEL_PATH}" \
--host 0.0.0.0 \
--port 8000 \
--dtype bfloat16 \
--tensor-parallel-size 1 \
--served-model-name "${SERVED_MODEL_NAME}" \
--max-model-len 8192 \
--gpu-memory-utilization 0.85 \
--max-num-seqs 32 \
--shutdown-timeout 60信息
--max-model-len 8192 更适合第一次验证服务是否能稳定启动。确认可用后,可根据 GPU 显存和业务需要逐步调高到 16384 或 32768。
调用验证
推理服务运行后,按以下顺序验证服务。
Step 1 获取调用地址和认证方式
- 进入推理服务详情页。
- 点击调用,复制推理服务调用地址。
- 如果使用外网访问,请准备 API Key。默认情况下,请求需要使用
Authorization: Bearer <API Key>。 - 如果创建服务时将 Auth Header 配置为
X-Infini-Auth,请把下面示例中的AuthorizationHeader 改为X-Infini-Auth。
将地址和 API Key 写入环境变量:
export BASE_URL="<推理服务调用地址>"
export API_KEY="<API Key>"信息
如果调用地址末尾已经包含 /,下面命令中的路径拼接可能出现双斜线。通常不影响 HTTP 调用,但建议把 BASE_URL 末尾的 / 去掉。
Step 2 检查 OpenAI 兼容接口是否可用
先调用 /v1/models。这一步用于确认地址、认证和服务进程是否可用。
curl -X GET "${BASE_URL}/v1/models" \
-H "Authorization: Bearer ${API_KEY}"如果返回中能看到 Qwen3-8B,说明服务已经暴露 OpenAI 兼容接口。如果返回 401 或 403,请检查 API Key 和 Auth Header。如果连接失败,请确认服务状态、外网访问开关和监听端口。
Step 3 发送短文本摘要请求
使用较短的 max_tokens 做第一次文本生成验证。
curl -X POST "${BASE_URL}/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
--data '{
"model": "Qwen3-8B",
"messages": [
{
"role": "user",
"content": "请用三句话总结:大模型推理服务上线前,需要确认模型文件、镜像版本、GPU 显存、监听端口和服务监控。"
}
],
"temperature": 0.2,
"max_tokens": 512
}'如果返回中包含 choices[0].message.content,说明模型已能正常生成文本。
Step 4 发送代码生成请求
再发送一条稍复杂的代码生成请求,确认模型能处理目标场景。
curl -X POST "${BASE_URL}/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
--data '{
"model": "Qwen3-8B",
"messages": [
{
"role": "user",
"content": "写一个 Python 函数,输入字符串列表,返回出现次数最多的前 3 个字符串。"
}
],
"temperature": 0,
"max_tokens": 1024
}'Step 5 排查常见调用问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
401 或 403 | API Key 错误,或 Header 名称与服务配置不一致 | 检查 API Key;确认使用 Authorization 还是 X-Infini-Auth |
| 连接超时或连接失败 | 服务未运行、外网访问未开启、地址复制错误 | 查看服务状态和调用地址;确认监听端口为 8000 |
返回 model not found | 请求中的 model 与 --served-model-name 不一致 | 确认启动命令中的 SERVED_MODEL_NAME,或把请求中的 model 改为实际名称 |
| 服务异常或重启 | 模型路径错误、显存不足、镜像版本不匹配 | 查看实例日志;先降低 --max-model-len 或换更大显存规格 |
常见调整
- 需要更长上下文:逐步调大
--max-model-len,同时观察显存使用率和请求延迟。 - 需要更高并发:先确认单请求稳定,再通过实例数、GPU 规格和 vLLM 参数逐步扩展。
- 需要监控指标:创建服务时配置监控端口。详见LLM 场景业务监控。
- 服务停止或升级时请求被切断:确认启动命令使用
exec,并阅读优化推理服务启动命令。