目录

  1. 硬件与软件要求
  2. 环境准备
  3. 模型下载与准备
  4. Docker 容器配置
  5. vLLM 服务启动
  6. 验证部署
  7. 性能调优建议
  8. 常见问题排查

1. 硬件与软件要求

1.1 硬件要求

组件 要求 说明
GPU NVIDIA GPU (≥80GB 显存) 支持 FP8 的 GPU (A100/H100/L40S/RTX 4090 等)
内存 ≥64GB 建议 128GB 以上以获得更好性能
存储 ≥100GB 可用空间 模型权重约 23GB (NVFP4)
网络 可选 如需下载模型需要网络连接

1.2 软件要求

组件 版本要求 说明
NVIDIA Driver ≥535.x 支持 CUDA 12.x
Docker ≥20.10 NVIDIA Container Toolkit
CUDA 12.4+ 推荐 CUDA 12.8+
vLLM ≥0.19.1 推荐 nvcr.io/nvidia/vllm:26.06-py3 或更新版本

2. 环境准备

2.1 配置 Docker 权限

# 将当前用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
newgrp docker

# 验证 Docker 可访问
docker ps

2.2 安装 NVIDIA Container Toolkit

# 添加 NVIDIA Docker 仓库
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 安装
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# 重启 Docker
sudo systemctl restart docker

2.3 拉取 vLLM 镜像

⚠️ 关键:使用 NVIDIA 官方 NGC 镜像以获得最佳性能

# 拉取 vLLM 镜像 (推荐)
docker pull nvcr.io/nvidia/vllm:26.06-py3

# 或者使用 vLLM 官方镜像
docker pull vllm/vllm-openai:latest

3. 模型下载与准备

3.1 下载模型权重

方式一:通过 HuggingFace (需要 Token)
# 安装 huggingface-cli
pip install -U huggingface_hub

# 设置 Token (从 https://huggingface.co/settings/tokens 获取)
export HF_TOKEN="your_huggingface_token"

# 下载官方 NVFP4 模型
huggingface-cli download nvidia/Qwen3.6-35B-A3B-NVFP4 \
  --local-dir /home/bob/project/models/qwen36b_nvfp4

# 或者下载 RedHatAI 版本
huggingface-cli download RedHatAI/Qwen3.6-35B-A3B-NVFP4 \
  --local-dir /home/bob/project/models/qwen36b_nvfp4
方式二:通过 ModelScope (中国大陆推荐)
pip install modelscope

python -c "
from modelscope import snapshot_download
snapshot_download('vllm-ascend/Qwen3.6-35B-A3B', 
                  cache_dir='/home/bob/project/models')
"
方式三:通过 Unsloth 优化版本
huggingface-cli download unsloth/Qwen3.6-35B-A3B-NVFP4 \
  --local-dir /home/bob/project/models/qwen36b_nvfp4_unsloth

3.2 验证模型文件

# 检查模型目录结构
ls -la /home/bob/project/models/qwen36b_nvfp4/

# 预期文件列表:
# - config.json
# - model.safetensors (或分片文件)
# - model.safetensors.index.json
# - tokenizer.json
# - tokenizer_config.json
# - chat_template.jinja (可选)

4. Docker 容器配置

4.1 创建启动脚本

创建文件 start_vllm_qwen36b.sh

#!/bin/bash
# ============================================================
# vLLM Qwen3.6-35B-A3B-NVFP4 启动脚本
# ============================================================

set -e

# ========== 配置 ==========
MODEL_DIR="/home/bob/project/models/qwen36b_nvfp4"
PORT=8040
CONTAINER_NAME="vllm_qwen36b"
IMAGE="nvcr.io/nvidia/vllm:26.06-py3"

# ========== 检查 ==========
if [ ! -d "$MODEL_DIR" ]; then
    echo "❌ 模型目录不存在: $MODEL_DIR"
    echo "请先下载模型到该目录"
    exit 1
fi

# 检查容器是否已在运行
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "⚠️ 容器 '$CONTAINER_NAME' 已在运行中"
    echo "查看日志: docker logs -f $CONTAINER_NAME"
    echo "停止容器: docker stop $CONTAINER_NAME"
    exit 0
fi

# ========== 启动容器 ==========
echo "🚀 启动 vLLM Qwen3.6-35B-A3B-NVFP4 服务..."
echo "   模型路径: $MODEL_DIR"
echo "   端口: $PORT"
echo "   容器名: $CONTAINER_NAME"

docker run -d --rm --gpus all \
  --ipc=host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  --name ${CONTAINER_NAME} \
  -p ${PORT}:${PORT} \
  -v "$MODEL_DIR:/model:ro" \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --entrypoint vllm \
  ${IMAGE} \
  serve /model \
  --host 0.0.0.0 \
  --port ${PORT} \
  --served-model-name RedHatAI/Qwen3.6-35B-A3B-NVFP4 \
  --tensor-parallel-size 1 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --attention-backend flashinfer \
  --moe-backend marlin \
  --gpu-memory-utilization 0.4 \
  --max-model-len 262144 \
  --max-num-seqs 4 \
  --max-num-batched-tokens 8192 \
  --enable-chunked-prefill \
  --async-scheduling \
  --enable-prefix-caching \
  --load-format fastsafetensors \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder \
  --enable-auto-tool-choice

echo "✅ 容器已启动: $CONTAINER_NAME"
echo ""
echo "📋 常用命令:"
echo "  查看日志: docker logs -f $CONTAINER_NAME"
echo "  停止服务: docker stop $CONTAINER_NAME"
echo "  健康检查: curl http://localhost:${PORT}/health"
echo "  模型列表: curl http://localhost:${PORT}/v1/models"

4.2 赋予执行权限

chmod +x start_vllm_qwen36b.sh

5. vLLM 服务启动

5.1 启动服务

# 启动 vLLM 服务 (后台运行)
bash start_vllm_qwen36b.sh

# 实时查看日志 (观察模型加载进度)
docker logs -f vllm_qwen36b

5.2 预期启动日志

(APIServer pid=1) INFO 07-17 07:07:45 [utils.py:344] vLLM version 0.22.1+7b9cb5b7.dev
(APIServer pid=1) INFO 07-17 07:08:07 [model.py:617] Resolved architecture: Qwen3_5MoeForConditionalGeneration
(APIServer pid=1) INFO 07-17 07:08:08 [cache.py:261] Using fp8 data type to store kv cache.
(APIServer pid=1) INFO 07-17 07:08:22 [model.py:617] Resolved architecture: Qwen3_5MoeMTP
(APIServer pid=1) INFO 07-17 07:08:22 [scheduler.py:239] Chunked prefill is enabled with max_num_batched_tokens=8192.
(APIServer pid=1) INFO 07-17 07:08:22 [vllm.py:986] Asynchronous scheduling is enabled.
(APIServer pid=1) INFO 07-17 07:28:55 [api_server.py:592] Supported tasks: ['generate']
(APIServer pid=1) INFO 07-17 07:29:23 [api_server.py:596] Starting vLLM server on http://0.0.0.0:8040

6. 验证部署

6.1 基础健康检查

# 健康检查
curl http://localhost:8040/v1/models | jq .

# 预期输出
{
  "object": "list",
  "data": [
    {
      "id": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
      "object": "model",
      "created": 1719500000,
      "owned_by": "vllm",
      "root": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
      "parent": null,
      "permission": [...]
    }
  ]
}

6.2 基础聊天测试

# 简单数学测试
curl http://localhost:8040/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
    "messages": [{"role": "user", "content": "12*17"}],
    "max_tokens": 500
  }' | jq .

6.3 中文对话测试

curl http://localhost:8040/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
    "messages": [
      {"role": "system", "content": "你是一个有帮助的AI助手。"},
      {"role": "user", "content": "请用简短的语言介绍什么是大语言模型?"}
    ],
    "max_tokens": 1024,
    "temperature": 0.7
  }' | jq .

6.4 Thinking 模式测试

curl http://localhost:8040/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
    "messages": [
      {"role": "user", "content": "一个水池有两个水管,单开甲管6小时能注满,单开乙管8小时能注满。如果同时打开两个水管,几小时能注满?请详细思考。"}
    ],
    "max_tokens": 2048,
    "temperature": 0.6,
    "chat_template_kwargs": {"enable_thinking": true}
  }' | jq .

6.5 工具调用测试

curl http://localhost:8040/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "RedHatAI/Qwen3.6-35B-A3B-NVFP4",
    "messages": [
      {"role": "user", "content": "北京现在的天气怎么样?"}
    ],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取指定城市的天气信息",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名称"
            }
          },
          "required": ["city"]
        }
      }
    }],
    "tool_choice": "auto",
    "max_tokens": 1024
  }' | jq .

7. 性能调优建议

7.1 内存配置参考

参数 推荐值 说明
--gpu-memory-utilization 0.4-0.7 根据显存大小调整,单卡 80GB 建议 0.4-0.5
--max-model-len 262144 最大上下文长度 (256K)
--max-num-seqs 4-8 并发请求数,根据显存调整
--max-num-batched-tokens 8192 批处理 token 数

7.2 关键参数说明

推荐使用的参数
# KV Cache 配置 (必须)
--kv-cache-dtype fp8 \              # FP8 KV Cache 减少内存占用

# MoE 后端配置 (推荐)
--moe-backend marlin \               # NVFP4 MoE 后端,性能最优

# 注意力后端 (推荐)
--attention-backend flashinfer \     # FlashInfer 注意力优化

# 性能优化参数 (推荐)
--enable-prefix-caching \           # 相同前缀请求加速
--enable-chunked-prefill \          # 长上下文优化
--async-scheduling \                # 异步调度提升吞吐
--load-format fastsafetensors \     # 快速加载模型

# 工具调用解析器 (Qwen3.6 必需)
--tool-call-parser qwen3_coder \     # Qwen3.6 专用解析器

# 推理解析器 (支持 thinking 模式)
--reasoning-parser qwen3 \
可选的高级参数
# 推测解码 (MTP) - 可提升生成速度 1.5-2x
--speculative-config '{"method":"mtp","num_speculative_tokens":3,"moe_backend":"triton"}'

# 注意: MTP 推测解码在某些场景下可能影响工具调用稳定性
# 如果遇到工具调用问题,建议移除该参数

7.3 不推荐使用的参数

参数 原因
--distributed-executor-backend ray 单卡不需要
--enforce-eager 除非出现内存尖峰,否则影响性能

7.4 性能参考指标

指标 预期值
模型加载时间 5-10 分钟 (含编译)
内存占用 ~23GB (模型) + ~30-50GB (KV Cache)
TTFT (首 Token 延迟) 50-200ms
生成吞吐量 20-50 tokens/s
最大并发请求 4-8

8. 常见问题排查

8.1 工具调用 XML 解析错误

问题现象

WARNING [qwen3xml_tool_parser.py:303] Error when parsing XML elements: not well-formed (invalid token)

原因:使用了错误的 tool-call-parser

解决方案

# ❌ 错误
--tool-call-parser qwen3_xml

# ✅ 正确 (Qwen3.6 专用)
--tool-call-parser qwen3_coder

8.2 容器启动后立即退出

问题现象docker ps 看不到运行中的容器

排查步骤

# 查看容器日志
docker logs vllm_qwen36b

# 常见原因:
# 1. 模型路径不存在
# 2. 端口被占用
# 3. GPU 驱动问题

解决方案

# 检查端口占用
netstat -tlnp | grep 8040

# 检查 GPU 可用性
nvidia-smi

# 检查模型目录
ls -la /home/bob/project/models/qwen36b_nvfp4/

8.3 内存不足 (OOM)

问题现象

torch.cuda.OutOfMemoryError: CUDA out of memory

解决方案

# 降低 GPU 内存利用率
--gpu-memory-utilization 0.3

# 减少并发请求数
--max-num-seqs 2

# 减少批处理 token 数
--max-num-batched-tokens 4096

# 缩短最大上下文长度
--max-model-len 131072

8.4 FlashInfer 相关错误

问题现象

FlashInfer ... not available

解决方案

# 使用正确的镜像
docker pull nvcr.io/nvidia/vllm:26.06-py3

# 或设置环境变量 (DGX Spark 必需)
-e VLLM_USE_FLASHINFER_MOE_FP4=0 \
-e VLLM_FP8_MOE_BACKEND=flashinfer_cutlass \
-e FLASHINFER_DISABLE_VERSION_CHECK=1 \

8.5 推理速度慢

排查步骤

# 检查 GPU 利用率
nvidia-smi dmon -s u -d 1

# 查看 vLLM 日志中的吞吐量指标
docker logs vllm_qwen36b | grep "throughput"

优化建议

  • 确保使用 --kv-cache-dtype fp8
  • 确保使用 --moe-backend marlin
  • 适当增加 --max-num-seqs 提高并发
  • 启用 --async-scheduling 提升吞吐

附录

A. 完整启动脚本

#!/bin/bash
# save as: start_vllm_qwen36b.sh

set -e

MODEL_DIR="/home/bob/project/models/qwen36b_nvfp4"
PORT=8040
CONTAINER_NAME="vllm_qwen36b"
IMAGE="nvcr.io/nvidia/vllm:26.06-py3"

if [ ! -d "$MODEL_DIR" ]; then
    echo "❌ 模型目录不存在: $MODEL_DIR"
    exit 1
fi

if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "⚠️ 容器 '$CONTAINER_NAME' 已在运行中"
    exit 0
fi

docker run -d --rm --gpus all \
  --ipc=host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  --name ${CONTAINER_NAME} \
  -p ${PORT}:${PORT} \
  -v "$MODEL_DIR:/model:ro" \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --entrypoint vllm \
  ${IMAGE} \
  serve /model \
  --host 0.0.0.0 \
  --port ${PORT} \
  --served-model-name RedHatAI/Qwen3.6-35B-A3B-NVFP4 \
  --tensor-parallel-size 1 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --attention-backend flashinfer \
  --moe-backend marlin \
  --gpu-memory-utilization 0.4 \
  --max-model-len 262144 \
  --max-num-seqs 4 \
  --max-num-batched-tokens 8192 \
  --enable-chunked-prefill \
  --async-scheduling \
  --enable-prefix-caching \
  --load-format fastsafetensors \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder \
  --enable-auto-tool-choice

echo "✅ vLLM Qwen3.6-35B 服务已启动"
echo "📋 API 端点: http://localhost:${PORT}/v1/chat/completions"

B. 常用管理命令

# 查看日志
docker logs -f vllm_qwen36b

# 停止服务
docker stop vllm_qwen36b

# 重启服务
docker restart vllm_qwen36b

# 进入容器 (调试用)
docker exec -it vllm_qwen36b bash

# 查看资源使用
docker stats vllm_qwen36b

C. 参考链接

更多推荐