💡 本文介绍如何在 NVIDIA DGX Spark 上部署基于英特尔 AutoRound 量化的 INT4 模型。 AutoRound 是一种自动舍入量化技术,相比传统 PTQ 方法精度损失更小,适合对精度敏感的场景。
1. 环境准备
- 硬件:NVIDIA DGX Spark / Jetson Orin(GB10 架构)
- 系统:Ubuntu 22.04+(aarch64)
- 前置软件:Docker、NVIDIA Container Toolkit
确认 Docker 已正确识别 GPU:
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
2. 构建优化镜像
使用专为 GB10 架构优化的 vLLDocker 源码构建:
# 克隆源码
git clone https://github.com/eugr/spark-vllm-docker.git
cd spark-vllm-docker
# 构建镜像(约 15-20 分钟)
docker build -t vllm-node-tf5:latest .
该镜像包含了针对 ARM 架构和 Tensor 核心的底层优化。
3. 下载 INT4 量化模型
下载 Intel/Qwen3.6-35B-A3B-int4-AutoRound 模型(约 21 GB):
mkdir -p ~/models/qwen36-35b-int4-autoround
huggingface-cli download Intel/Qwen3.6-35B-A3B-int4-AutoRound \
--local-dir ~/models/qwen36-35b-int4-autoround
4. 启动容器
这是最关键的一步。注意路径映射和显存限制:
docker run -d \
--name vllm-qwen36 \
--restart unless-stopped \
--gpus all \
-p 8000:8000 \
-v ~/models/qwen36-35b-int4-autoround:/model/model_int4:rw \
-e VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \
-e TORCH_MATMUL_PRECISION=high \
-e VLLM_MARLIN_USE_ATOMIC_ADD=1 \
vllm-node-tf5:latest \
vllm serve \
/model/model_int4 \
--host 0.0.0.0 \
--port 8000 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.35 \
--load-format instanttensor \
--trust-remote-code \
--enable-auto-tool-choice \
--tool-call-parser qwen3_xml \
--reasoning-parser qwen3 \
--enable-chunked-prefill \
--enable-prefix-caching \
--served-model-name qwen3-35b
⚠️ 显存限制
GB10 采用统一内存架构,模型与系统共用内存。务必设置
GB10 采用统一内存架构,模型与系统共用内存。务必设置
--gpu-memory-utilization 0.35(约 35%),避免 OOM 导致系统死机。如需更高性能可调至 0.5~0.7,但需预留足够系统内存。
关键参数解读
| 参数 | 值 | 说明 |
|---|---|---|
--gpu-memory-utilization | 0.35 | 限制显存使用比例,防止与系统争抢内存 |
--load-format | instanttensor | 使用快速加载器,缩短冷启动时间 |
--dtype | bfloat16 | 计算精度 |
--max-model-len | 32768 | 最大上下文长度 |
--tool-call-parser | qwen3_xml | 解析 Qwen3 格式的 XML 工具调用 |
5. 性能实测数据
在 NVIDIA DGX Spark(GB10 架构,128GB 统一内存)上实测结果:
短文本生成(50 Tokens)
Prompt:"写一首关于春天的七言绝句"
| 轮次 | Tokens | 耗时 | 速度 |
|---|---|---|---|
| 1 | 50 | 0.92s | 54.3 tok/s |
| 2 | 50 | 0.91s | 54.9 tok/s |
| 3 | 50 | 0.93s | 53.8 tok/s |
| 4 | 50 | 0.91s | 54.9 tok/s |
| 5 | 50 | 0.92s | 54.3 tok/s |
稳定在 54~55 tok/s,短文本响应约 0.9 秒。
长文本生成(512 Tokens)
Prompt:"详细分析 AI 对未来十年软件开发行业的影响"
| 轮次 | Tokens | 耗时 | 速度 |
|---|---|---|---|
| 1 | 512 | 7.53s | 68.0 tok/s |
| 2 | 512 | 7.33s | 69.9 tok/s |
| 3 | 512 | 7.55s | 67.8 tok/s |
| 4 | 512 | 7.33s | 69.9 tok/s |
| 5 | 512 | 7.53s | 68.0 tok/s |
得益于 chunked prefill 优化,长文本速度提升至 68~70 tok/s,512 字输出仅需约 7.5 秒。
资源占用
| 指标 | 数值 |
|---|---|
| 模型体积 | ~21 GB(INT4 量化版) |
| 运行时内存占用 | ~50 GB(含模型权重 + KV Cache) |
| 显存限制 | 0.35(约 45 GB 可用) |
| 并发能力 | 支持多用户同时调用,KV Cache 自动管理 |
6. 设置开机自启
创建 Systemd 服务文件 /etc/systemd/system/vllm-qwen36.service:
[Unit]
Description=vLLM Service for Qwen3.6-35B
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/docker start vllm-qwen36
ExecStop=/usr/bin/docker stop -t 10 vllm-qwen36
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable vllm-qwen36
sudo systemctl start vllm-qwen36
7. 常见问题
启动后日志报 "Model not found"
检查 Docker 路径映射是否正确。容器内路径 /model/model_int4 必须与 vllm serve 后的路径完全一致。
显存不足 (OOM)
降低 --gpu-memory-utilization 至 0.30,或关闭其他占用内存的服务。
启动速度太慢
确保 --load-format instanttensor 参数生效,该参数可大幅缩短冷启动时间。
推理速度低于预期
检查是否有其他进程争抢 GPU 资源。可通过 nvidia-smi 查看实时显存占用。