在 Proxmox VE 虚拟机 上,用AMD 官方 MXFP4 版与社区实测 INT4(AutoRound)版,vLLM 部署 Qwen3.8-27B 量化模型的选择。
-
AMD R9700 单卡部署 vLLM + Qwen3.8-27B 教程(一)
场景:在 Proxmox VE 虚拟机 102(Ubuntu 24.04 + AMD Radeon AI PRO R9700 直通)上,用 vLLM 部署 Qwen3.8-27B 量化模型,提供 OpenAI 兼容的本地大模型 API 服务。
1. 环境
项目 值 虚拟机 102(Ubuntu 24.04,kernel 7.0.0-31-generic) GPU AMD Radeon AI PRO R9700(gfx1201 / RDNA4,32GB) ROCm 10.0(宿主机已装) Docker 29.1.3 vLLM 镜像 stilldeadcode/vllm-radiance:0.9.3(vLLM 0.27.1,ROCm 7.14)模型 devan-carlin/Qwen3.8-27B-int4-AutoRound(INT4 多模态)最终显存占用 17.65 GiB
2. 方案与选型
2.1 AMD 官方方案
- AMD 官方为 R9700 主推 OpenClaw(本地 AI 智能体平台),官方 ROCm 文档推 vLLM 做推理服务。
- Qwen3.8-27B 是原生视觉语言模型(
image-text-to-text,支持图片和视频理解),AMD 提供 Day-0 支持。
2.2 为什么不用 AMD 官方 MXFP4 版?
AMD 官方发布了
amd/Qwen3.8-27B-Quark-AWQ-MXFP4量化版,但社区实测发现:- 其 MTP 头是 BF16 未量化,vLLM 加载时会报错(
asserts on a half-width parameter),需要额外脚本预处理。 - 社区实测 INT4(AutoRound)版质量反而更好,且无需预处理。
结论:单卡 32GB 场景,选用 INT4(AutoRound) 量化版更稳、质量更好。
2.3 显存计算(27B 参数 vs 32GB)
格式 权重体积 32GB 单卡 FP16/BF16 ~54GB 装不下 FP8 ~27GB+开销 极紧张 INT4 / MXFP4 ~14GB+开销≈17.7GB 轻松
3. 准备
3.1 扩容磁盘(模型 + 镜像约需 30GB+)
sudo lvextend -L +100G /dev/ubuntu-vg/ubuntu-lv sudo resize2fs /dev/ubuntu-vg/ubuntu-lv df -h / # 确认扩容3.2 安装 Docker
sudo apt-get install -y docker.io docker --version3.3 安装 huggingface_hub(用于下载模型)
sudo apt-get install -y python3-pip # 注意 --ignore-installed 解决 typing_extensions 冲突 sudo pip3 install --break-system-packages --ignore-installed typing_extensions huggingface_hub hf --version # 或 python3 -c "import huggingface_hub; print(huggingface_hub.__version__)"
4. 拉取 vLLM 镜像
先查最新标签:
wget -qO- "https://hub.docker.com/v2/repositories/stilldeadcode/vllm-radiance/tags?page_size=10" \ | python3 -c "import sys,json; [print(t['name']) for t in json.load(sys.stdin)['results']]"拉取(后台,约 13.7GB):
nohup bash -c 'echo "密码" | sudo -S -p "" docker pull stilldeadcode/vllm-radiance:0.9.3' \ > /tmp/docker-pull.log 2>&1 &说明:
stilldeadcode/vllm-radiance是社区维护、专为 R9700(gfx1201)打包的 vLLM 镜像,内置了 RDNA4 专属内核 + AITER + Triton。官方rocm/vllm对 Radeon gfx1201 支持不全。
5. 下载模型
mkdir -p ~/models # 国内可走 hf-mirror 加速 export HF_ENDPOINT=https://hf-mirror.com nohup hf download devan-carlin/Qwen3.8-27B-int4-AutoRound \ --local-dir ~/models/qwen3.8-27b-autoround > /tmp/model-download.log 2>&1 &下载完成后(约 18GB,8 个 safetensors 分片):
ls ~/models/qwen3.8-27b-autoround/*.safetensors | wc -l # 应为 8 du -sh ~/models/qwen3.8-27b-autoround # 约 18G
6. 模型 config.json 补丁(注意)
不补丁会静默出错:原 checkpoint 的
quantization_config.quant_method是auto-round,vLLM 会忽略量化、以未量化方式加载(54GB → 32GB 卡直接 OOM),且不报错。cd ~/models/qwen3.8-27b-autoround cp -n config.json config.json.autoround-orig # 备份原文件 python3 -c " import json p = 'config.json' c = json.load(open(p)) q = c['quantization_config'] q['quant_method'] = 'auto_gptq' q.setdefault('desc_act', False) q.setdefault('lm_head', False) q.setdefault('modules_in_block_to_quantize', [ 'self_attn.q_proj', 'self_attn.k_proj', 'self_attn.v_proj', 'self_attn.o_proj', 'mlp.gate_proj', 'mlp.up_proj', 'mlp.down_proj', 'linear_attn.in_proj_qkv', 'linear_attn.in_proj_z', 'linear_attn.out_proj', ]) json.dump(c, open(p, 'w'), indent=2) print('补丁已应用') "验证:
python3 -c "import json; q=json.load(open('config.json'))['quantization_config']; print(q['quant_method'], len(q.get('modules_in_block_to_quantize',[])))" # 输出: auto_gptq 10
7. 内核补丁准备
必须挂载内核补丁:GPTQ 格式的 AutoRound checkpoint 有「对称零点」问题,官方内核会崩溃(
assert zp.shape == ...)。克隆 launcher 仓库获取内核补丁文件:
cd /tmp git clone --depth 1 https://github.com/zzpanic/qwen3.6-vllm-gfx1201-launchers.git launchers ls launchers/patches/rdna_hybrid_w4a16.py # 确认文件存在
8. 启动 vLLM 服务
8.1 准备缓存目录
mkdir -p ~/.cache/vllm8.2 完整启动命令(本机为例)
cat > /tmp/run-vllm.sh << 'EOF' #!/bin/bash sudo docker run --rm --name vllm102 \ --device /dev/kfd --device /dev/dri \ --group-add 44 --group-add 992 \ --shm-size 4g --cap-add SYS_PTRACE --security-opt seccomp=unconfined \ -v /home/Magic629/models/qwen3.8-27b-autoround:/model:ro \ -v /tmp/launchers/patches/rdna_hybrid_w4a16.py:/opt/vllm/lib/python3.12/site-packages/vllm/model_executor/kernels/linear/mixed_precision/rdna_hybrid_w4a16.py:ro \ -v /home/Magic629/.cache/vllm:/cache \ -p 8000:8000 \ -e HIP_VISIBLE_DEVICES=0 \ -e VLLM_ROCM_USE_AITER=1 -e VLLM_ROCM_USE_AITER_UNIFIED_ATTENTION=1 \ -e VLLM_ROCM_USE_AITER_MHA=0 -e VLLM_ROCM_USE_AITER_MLA=0 -e VLLM_ROCM_USE_AITER_MOE=0 \ -e VLLM_ROCM_USE_AITER_LINEAR=0 -e VLLM_ROCM_USE_AITER_FP8BMM=0 -e VLLM_ROCM_USE_AITER_FP4BMM=0 -e VLLM_ROCM_USE_AITER_RMSNORM=0 \ -e RADIANCE_PRESHUFFLE=1 -e RADIANCE_ATTN_TUNE=1 -e RADIANCE_GDN_WMMA=1 \ -e RADIANCE_VIT_FLASH=1 -e RADIANCE_FUSE_RMS_QUANT=1 -e RADIANCE_DYNAMIC_DRAFT=1 \ -e RADIANCE_SKINNY_GEMM=all \ -e VLLM_CACHE_ROOT=/cache/vllm -e TORCHINDUCTOR_CACHE_DIR=/cache/inductor \ -e TRITON_CACHE_DIR=/cache/triton -e AITER_ROOT_DIR=/cache/aiter \ -e TRITON_CACHE_AUTOTUNING=1 \ stilldeadcode/vllm-radiance:0.9.3 \ /model \ --served-model-name qwen3.8-27b-int4 \ --quantization auto_gptq \ --kv-cache-dtype fp8 \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.97 \ --max-model-len 204800 \ --max-num-seqs 2 \ --max-num-batched-tokens 4854 \ --attention-backend R4D \ --enable-prefix-caching --mamba-cache-mode align \ --reasoning-parser qwen3 \ --tool-call-parser qwen3_xml --enable-auto-tool-choice \ --trust-remote-code \ --host 0.0.0.0 --port 8000 EOF chmod +x /tmp/run-vllm.sh8.3 后台启动
nohup bash -c 'echo "密码" | sudo -S -p "" bash /tmp/run-vllm.sh' > /tmp/vllm-run.log 2>&1 &8.4 关键参数说明
参数 含义 --group-add 44 99244=video 组、992=render 组(数字 GID,避免名称解析失败) --device /dev/kfd /dev/dri显卡计算接口 + 渲染节点 --quantization auto_gptq必须与 config.json 补丁后一致 --tensor-parallel-size 1单卡 --kv-cache-dtype fp8KV 缓存用 FP8 --max-model-len 204800上下文长度 200K --attention-backend R4DRDNA4 专用注意力内核
9. 验证推理
9.1 确认启动成功(日志)
tail -20 /tmp/vllm-run.log # 关键日志: # "Model loading took 17.65 GiB memory" ← INT4 正确加载 # "Application startup complete." ← 服务就绪9.2 发送测试请求
python3 - << 'PYEOF' import urllib.request, json, time data = { "model": "qwen3.8-27b-int4", "messages": [{"role": "user", "content": "用一句话介绍你自己"}], "max_tokens": 200, "temperature": 0.6 } req = urllib.request.Request("http://127.0.0.1:8000/v1/chat/completions", data=json.dumps(data).encode(), headers={"Content-Type": "application/json"}) t0 = time.time() r = json.loads(urllib.request.urlopen(req, timeout=180).read().decode()) print(r["choices"][0]["message"]["content"]) print("速度 %.1f tok/s" % (r["usage"]["completion_tokens"] / (time.time()-t0))) PYEOF9.3 实测结果
- 显存占用:17.65 GiB
- 推理速度:26.3 tok/s(基线,未开投机解码)
- API:
http://192.168.67.202:8000/v1(Ubuntu24.04推理机IP)
10. 常见问题
坑 现象 解决 config.json 未补丁 静默以未量化加载 → OOM 改 quant_method=auto_gptq+ 量化模块列表内核补丁未挂载 GPTQ 对称零点 assert崩溃挂载 rdna_hybrid_w4a16.py--group-add render报错"Unable to find group render" 用数字 GID: --group-add 44 --group-add 992huggingface_hub 装不上 typing_extensions RECORD 错误 pip install --ignore-installed首次启动 OOM torch.compile 冷启动 +2.28GiB 重跑一次即可(缓存已生成) huggingface.co 不通 国内网络 加 HF_ENDPOINT=https://hf-mirror.com**后续可选优化**: 1. 开启投机解码(DFlash2 草稿模型),速度可再提升 1.5~2 倍 2. 测试多模态(图片输入) 3. 接入 OpenClaw / Ollama 作为后端