一台百度云百舸开发机,8 × A800-SXM4-80GB,驱动 535,没有 Docker,访问不了 HuggingFace。两天时间把 GLM-5.3-Flash(官方 FP8)、Qwen3.6-35B-A3B、Qwen3.8-27B 部署上线并完成评测。这里记录每一步的判断、踩的坑和解法,脚本都在仓库里。
| 项目 | 实测 | 影响 |
|---|---|---|
| GPU | 8 × A800-SXM4-80GB,NVLink 全互联 400 GB/s,sm_80 | Ampere 没有 FP8 / FP4 张量核,新一代 MoE 模型的原生内核都是 Hopper 专用 |
| 驱动 | 535.261.03,CUDA 12.2,容器内无法升级 | CUDA 12.9 / 13 编译的程序必须走前向兼容库 |
| CPU / 内存 | 容器配额 64 核、512 GB,共享内存 256 GB | 够用;64 核让 vLLM 扩展编译只用 12 分钟 |
| 系统盘 | CFS 300 GB,重启保留 | 放环境和解包的镜像 |
| 共享盘 | PFS 并行文件系统 401 TB,单流写 288 MB/s,8 卡并行读 3 GB/s 以上 | 模型权重全放这里 |
| 一块 3.5 TB NVMe | 只读挂载 | 是平台自己的 nix store,不是数据盘,不用管 |
| 公网 | EIP 200 Mbps 按流量计费,所有入站共享约 25 MB/s | 328 GB 的权重要下 4 小时;HuggingFace 直连被封,ModelScope 可用 |
| 软件 | Ubuntu 22.04,miniforge Python 3.12,没有 gcc、nvcc、docker | 只能 pip / conda 装环境,镜像要用 chroot 跑 |
| 模型 | 规模 | 官方权重 | 8 × A800 能否运行 |
|---|---|---|---|
| DeepSeek-V4.1-Flash | 552B,另有 203 GB Engram 表 | FP8 / MXFP8 约 510 GB | 不能,上游 vLLM 无 sm80 路径 |
| DeepSeek-V4-Flash-0731 | 284B,激活 13B | FP4 + FP8 约 291 GB | 原版不能,只有社区剪枝 W4A16 版配 fork 能跑 |
| GLM-5.3 / 5.2 | 753B | FP8 约 744 GB | 放不下 |
| GLM-5.3-Flash | 320B,激活 18B,多模态,MIT | FP8 约 306 GB | 能,需要 Ampere 补丁,本项目最终跑通 |
| Qwen3.6-35B-A3B / Qwen3.8-27B | MoE 3B 激活 / 稠密 27B | BF16 | 原版 vLLM 直接跑 |
| Wan2.2-T2V-A14B | 14B 视频生成 | BF16 | 直接跑;Wan2.5 以后不开源 |
核心判断:Ampere 没有 FP8,但 FP8 权重可以用 Marlin 内核以 W8A16 方式执行(权重 8 位存储、计算时解到 16 位),所以 GLM-5.3-Flash 的官方 FP8 权重是可行的;真正缺的是稀疏注意力和 KPool 索引这些 Hopper 专用内核,社区用 Triton 重写了它们。
第一个方案是 stozpark 的补丁链:以 vLLM 官方的 vllm/vllm-openai:glm53-flash-cu129 镜像为基底,用八个 Python 脚本做精确字符串替换,把 Hopper 专用路径换成 Triton 实现。作者 9 月 1 日在 8 × A100 上验证通过。
第二个方案是 Mrzhiyao 的 glm53-a800-vllm 项目:锁定 wtdcode/vllm-backport 的源码 commit,打一个 3 万行的集成补丁,再覆盖几个在 8 × A800 上线验证过的 Triton 文件,只为 SM80 编译 vLLM 扩展。作者在和我们完全相同的硬件上验证过,单流 46.8 tok/s、1M 上下文。
lazymio/vllm-backport:v0.11.1-sm80(8.4 GB,CUDA 13.0,Ubuntu 24.04)同样走"本机拉、rsync、解包、chroot"。它自带 nvcc。VLLM_CUTLASS_SRC_DIR 等 9 个环境变量指给 CMake。编译 12 分钟完成,wheel 251 MB。容器里没有 Docker,但有 CAP_SYS_ADMIN 和 mount 权限。把镜像层解压成目录后,绑定挂载 /proc、/sys、/dev、共享盘和缓存目录,拷入宿主机的 NVIDIA 用户态库(libcuda、libnvidia-ml 等),再用镜像自己的环境变量 chroot 进去执行 vllm serve,效果等同于 docker run --gpus all。脚本见 deploy/glm53_chroot.sh。
驱动 535 只认 CUDA 12.2。CUDA 12.9 编译的 PyTorch 靠"小版本兼容"能跑,但第一次启动 Qwen 时在采样内核报 device kernel image is invalid:驱动自带的 JIT 编译器认不出新工具链生成的 PTX。解法是 NVIDIA 的前向兼容包 cuda-compat,它提供一个新版 libcuda 用户态库,和老内核模块配合工作,数据中心卡支持。镜像里都自带(/usr/local/cuda-12.9/compat),conda 环境里跑 CUDA 13 的 PyTorch 则从 NVIDIA 仓库下载 cuda-compat-13-1 解开用。
ModelScope 命令行工具在 CDN 读超时后会跳过分片并返回成功,Qwen3.6 "下载完成"时实际有 15 个分片残缺,GLM 有 44 个。必须按远端文件清单逐个核对大小(deploy/verify_model.py)。残缺分片用 aria2c 多连接续传(-c -x 8 -s 8)比官方工具稳得多。注意 aria2 写的是稀疏文件,用 du 看不出进度,看它自己的速率日志。
conda 环境里 vllm bench serve 一跑就报 libstdc++ 的 CXXABI 版本错误,因为 LD_LIBRARY_PATH 里先找到了系统的旧库,把 $CONDA_PREFIX/lib 加到前面即可。新版 vLLM 把参数分组隐藏,--help=all 才列全。
Qwen3.8 工具调用首轮 0 分,查记录发现模型输出的是 <tool_call><function=...> 的 XML 格式,而服务配的是 hermes(JSON)解析器。换成 --tool-call-parser qwen3_xml 后 90%。思考模型做 JSON 抽取时,512 token 的预算会被思考占满,要给到 2048。
| 文件 | 用途 |
|---|---|
deploy/pull_image.py | 不用 Docker 从 Registry 拉镜像层并解压成 rootfs,处理 whiteout |
deploy/upload_layers.sh | 边下载边 rsync 镜像层到服务器 |
deploy/glm53_chroot.sh | 进入 rootfs:挂载、注入驱动库、选择兼容库、带镜像环境变量执行命令 |
deploy/glm53_build.sh | 在 chroot 里用本地依赖编译 SM80 vLLM 扩展并安装 |
deploy/serve_glm53.sh / serve_qwen36.sh | 启动服务的参数集 |
deploy/verify_model.py / download_models_v2.sh | 按远端清单校验权重完整性,带校验的下载队列 |
deploy/glm53_launch_when_ready.sh | 下载完成后自动校验、切换服务的编排 |
bench/ | 评测套件,见指标解读 |
服务器地址在公开脚本里已替换为占位符。