⚡ 模块八:LLM 推理优化深度(MUSA)

SGLang-MUSA 模型部署实战:9 模型族 × 3 部署模板

高级·⏱ 75分钟·📅 2026-06-06

一、本课目标:把官方文档的 9 个模型族「翻译」成可上线参数

上一课 m8-l9 我们把 SGLang-MUSA 的环境(Docker 镜像 v0.5.6.post3-ph1-4.3.5-torch2.9.0-20260605、MTT S5000、torch_musa v2.9.0)完整拉起。本课基于这套环境,对照官方模型部署指南给出的 9 个子页面,逐个梳理"哪一类模型用什么 TP/EP/PP/量化/注意力后端",并把三个最常被问到的部署模式(密集 LLM、超大 MoE、PD 分离)做成可直接复用的命令模板。

💡
官方文档对应的 9 个部署子页面:

二、从官方文档到1台机到N台机的决策路径

面对「该选哪个部署模式」,官方文档隐含一套选型心智,这里明确化:

  1. 先看模型类型是「密集 LLM / MoE / VL / Diffusion」中的哪一种,决定走本课下面的 ABC 三个模板中的哪一个。
  2. 再算「权重总显存 ÷ 每卡 80GB」,如果 ≤ 8,单机 8 卡足够;如果 > 8,必须上多机(PP 或 PD 分离)。
  3. 如果要追求低 TTFT、高吞吐,且已经上了多机,则优先考虑 PD 分离,而不是简单的 PP。
  4. 最后以本课末尾的「检查清单」逐项对表,避免启动后才发现错逻辑。

这个决策顺序对应了下面三张模板的顺序:模板 A 是「单机密集」「模板 B 是「单机 8 卡 MoE」「模板 C 是「多机 PD 分离」。

三、模型部署矩阵(速查表)

把官方 9 个子页面里"开箱即用"的推荐配置压缩成一张表,方便选型时一眼定位:

模型族典型模型量化TPEPPPAttentionMoE Backend部署模式
GLMGLM-4.6 / 4.7 / 5 / 5.1BF16 / FP84~8—1FA3—单机
KimiKimi-K2.5 / K2.6FP88—1~2FA3—单机 / PD 分离
Qwen3 DenseQwen3-8B / 14B / 32BBF16 / FP81~8—1FA3—单机
Qwen3 MoEQwen3-30B-A3B → 480B-A35BFP8881FA3DeepEP + DeepGEMM单机 / 多机
Qwen3.50.8B → 397B-A17BBF16 / FP81~80 / 81FA3DeepGEMM / DeepEP单机 / PD 分离 1P1D
Qwen2.5-VL7B / 32B / 72BBF161~8—1FA3—单机
Qwen3-VL2B → 235B-A22BBF16 / FP82~80 / 81FA3DeepEP单机 / 多机
DeepSeek V3.2 / R1671B (FP8)FP8882NSA(tilelang)DeepEP + DeepGEMMPD 分离 2P4D
DiffusionQwen-Image / Wan2.2-T2V/I2V-A14BBF161~4—1FA3—单机
⚠️
三条选型铁律:① 任何含 A?B 后缀的模型都是 MoE,必须开 --moe-a2a-backend deepep;② DeepSeek V3.2 / R1 的 NSA 注意力不能退回 FA3,必须指定 --attention-backend nsa --nsa-prefill-backend tilelang;③ 任何用 FP8 的 MoE 都强烈建议加 --moe-runner-backend deep_gemm,否则会浪费 30%+ 算力。

四、模板 A:密集 LLM 单机部署(GLM / Qwen3 Dense / Qwen3.5 小模型)

适用于 GLM-4.6/4.7、Qwen3-8B/14B/32B、Qwen3.5-0.8B/2B/4B/9B/27B 等密集模型。以 Qwen3.5-0.8B 为例(来自官方 Qwen3.5 部署页):

source ~/.virtualenvs/sglang-0.5.6/bin/activate
python3 -m sglang.launch_server \
  --model-path /models/Qwen3.5-0.8B \
  --served-model-name qwen3.5-0.8b \
  --trust-remote-code \
  --cuda-graph-bs $(seq 1 32) \
  --disable-cuda-graph-padding \
  --disable-overlap-schedule \
  --tp-size 1 --pp-size 1 \
  --mem-fraction-static 0.8 \
  --attention-backend fa3 \
  --mm-attention-backend fa3 \
  --enable-cache-report \
  --moe-runner-backend deep_gemm \
  --sampling-backend flashinfer \
  --dist-init-addr ${MASTER_IP}:5303 \
  --nnodes ${WORLD_SIZE} \
  --port 30000

把 --model-path / --tp-size 改一下即可适配同档密集模型:32B 推荐 TP=4,最大上下文 32k 时 --mem-fraction-static 可以降到 0.75。

五、模板 B:超大 MoE 单机 8 卡部署(Qwen3-Coder-480B-A35B-FP8)

对应官方 Qwen3 MoE 部署页。这是单台 8× MTT S5000 能跑的最大密度场景之一,全部参数都要明确指定:

/root/.virtualenvs/sglang-0.5.6/bin/python3 -m sglang.launch_server \
  --model /models/Qwen3-Coder-480B-A35B-Instruct-FP8 \
  --served-model-name qwen3-coder-480b-a35b-instruct-fp8 \
  --trust-remote-code \
  --disable-cuda-graph \
  --disable-overlap-schedule \
  --tp-size 8 \
  --ep-size 8 \
  --dp-size 8 \
  --pp-size 1 \
  --enable-dp-lm-head \
  --enable-dp-attention \
  --moe-dense-tp-size 1 \
  --moe-a2a-backend deepep \
  --moe-runner-backend deep_gemm \
  --deepep-mode normal \
  --mem-fraction-static 0.90 \
  --attention-backend fa3 \
  --mm-attention-backend fa3 \
  --sampling-backend flashinfer \
  --port 30000

关键点:

  • TP=EP=DP=8:3D 切分,把"序列维 + 专家维 + 张量维"全部铺到 8 卡上,PH100 的 1.6 TB/s HBM 带宽和 784 GB/s 互联是这个配置能起来的硬件基础
  • --moe-runner-backend deep_gemm:调用 MATE 里 DeepGEMM 兼容路径,比默认 GEMM 在 FP8 下吞吐高约 30%
  • --mem-fraction-static 0.90:MoE 权重大,必须吃满显存,留 10% 给 KV cache 和激活
  • --disable-cuda-graph:480B 这一档当前还有少量算子未进 graph,先关掉,等后续 PR 合入再打开

六、模板 C:PD 分离多机部署(DeepSeek V3.2 / R1 2P4D)

对应官方 DeepSeek 部署页。671B FP8、含 NSA 稀疏注意力 + DeepEP MoE,官方推荐 2 台 Prefill + 4 台 Decode(共 6 台 8 卡 S5000,48 张卡),通过 Mooncake 完成跨节点 KV Transfer。Prefill 节点启动命令(每个节点都跑相同命令,NODE_RANK 不同):

nohup python3 -m sglang.launch_server \
  --model-path /models/DeepSeek-V3.2 \
  --served-model-name deepseek-v3.2 \
  --trust-remote-code \
  --disable-cuda-graph \
  --disable-overlap-schedule \
  --host 0.0.0.0 --port 20133 \
  --attention-backend nsa \
  --nsa-prefill-backend tilelang \
  --nsa-decode-backend tilelang \
  --sampling-backend flashinfer \
  --disaggregation-mode prefill \
  --dist-init-addr ${PREFILL_MASTER_IP}:5303 \
  --chunked-prefill-size -1 \
  --max-prefill-tokens 4096 \
  --nnodes 2 --node-rank ${NODE_RANK} \
  --tensor-parallel-size 8 \
  --ep-size 8 \
  --dp-size 8 \
  --context-length 6000 \
  --pp-size 2 \
  --moe-a2a-backend deepep \
  --deepep-mode normal \
  --moe-dense-tp-size 1 \
  --enable-dp-attention \
  --enable-dp-lm-head \
  --load-balance-method round_robin \
  --deepep-config ${DEEP_EP_CONFIG} \
  --max-running-requests 64 \
  --mem-fraction-static 0.8 \
  > /var/log/sglang-prefill.log 2>&1 &

Decode 节点只需把 --disaggregation-mode prefill 改成 decode,并指向 4 节点集群。最小可用版本是 2 机混布 TP8 PP2,跑通后再扩到 2P4D。

💡
为什么 DeepSeek 必须用 NSA + tilelang? DeepSeek V3.2 把注意力换成了 Native Sparse Attention(NSA),稀疏 pattern 与 FA3 不兼容;官方在 tilelang_musa 主线里给出了 NSA prefill / decode 的两个 TileKernel,这是目前唯一在 MUSA 上跑 DeepSeek V3.2 全精度的合规路径。这也呼应了上一周 m6-l4《TileLang-MUSA 算子开发》里"DeepSeek-V4 TileKernels Day-0 复用"的进展。

七、三个模板背后的参数选型逻辑

读完上面 ABC 三个模板,你会发现几个参数反复出现但取值不一样,这里集中解释下决策逻辑,避免后续拼参数时吓到。

  • --tp-size 的选型准则:密集模型看显存需求 ÷ 单卡 80GB,向上取 2 的幂次;MoE 默认 TP=8,因为专家路由要求同节点 8 卡均衡划分。
  • --ep-size 与 --tp-size 的关系:SGLang-MUSA 官方推荐 EP=TP(同节点内专家并行),跨节点 EP 目前在等 mt-mooncake 后续版本,不推荐手工启。
  • --pp-size:仅在多机、且权重超过单机总显存时才开;DeepSeek 671B FP8 在 2 台 8 卡上包不下,所以官方推荐 PP=2。
  • --mem-fraction-static:密集 LLM 0.8;MoE 0.90;Diffusion 0.7(留给 UNet 中间激活)。
  • --attention-backend:默认 fa3;DeepSeek V3.2 / R1 必须 nsa + --nsa-prefill-backend tilelang;带视觉 token 的 VL 要额外加 --mm-attention-backend fa3。
  • --moe-runner-backend:MoE 一律上 deep_gemm;密集不需要但加了不报错。
  • --sampling-backend:统一用 flashinfer,vllm-musa 和 SGLang-MUSA 都默认走这条路径。
  • --disable-cuda-graph / --disable-overlap-schedule:当前所有 MoE 部署页都明确写了这两个开关,是为了避免个别算子还未进 graph 导致的精度问题,后续 PR 合入后会在《版本发布信息》明确公告。

八、视觉与扩散模型(VL / Diffusion)

Qwen2.5-VL / Qwen3-VL(参考官方 VL 部署页):相比纯文 LLM,VL 多了 --mm-attention-backend fa3 这个开关,让视觉 token 也走 FA3 路径;中等参数(7B/32B)TP=2~4 即可;235B-A22B FP8 走和 Qwen3 MoE 一样的 TP=EP=DP=8 + DeepEP。

Diffusion(参考官方 Diffusion 部署页):Qwen-Image / Wan2.2-T2V-A14B / Wan2.2-I2V-A14B 当前仅 BF16,单卡或 TP=4,注意必须显式 --task generate-image(或 generate-video),并把 --mem-fraction-static 降到 0.7 给 UNet/Transformer 中间激活留显存。

九、上线前检查清单(多机版)

项命令 / 期望不通过的后果
每节点 HBM 空闲mthreads-smi 每卡 ≥ 75GB权重加载失败
节点间 RDMA 带宽ib_write_bw -d mlx5_0 ≥ 80 GbpsPD KV Transfer 慢、TTFT 抖动
MCCL/peermemlsmod | grep peermem跨卡 TP/EP 通信报错
NTP 时间同步节点间偏差 < 50ms调度日志混乱、PD 路由失败
模型路径一致所有节点 /models/<name> 同一份启动 hang 在 weight load
DeepEP 配置文件${DEEP_EP_CONFIG} 存在且节点一致专家路由不收敛
端口连通性20133 / 5303 节点间 telnet OKdist-init 超时
FAQ 已读对照官方 FAQ 排查常见报错同一坑重复踩
✅
本课小结:你现在已经能基于官方文档的 9 个模型族,把 SGLang-MUSA 从"单卡密集 LLM"扩展到"8 卡 MoE"再到"2P4D 多机 PD 分离"。后续摩尔线程文档站的任何模型新增 / 版本更新 / 参数调整,本站点的每周雷达会自动追踪 sglang-musa 文档站全部 9 个部署子页面,第一时间反映到这两节课。

十、雷达已启动:sglang-musa 文档站被本站点每周追踪

从本周起,本站点的摩尔线程雷达正式加入 SGLang-MUSA 官方文档站的 16 个页面作为独立源:主要覆盖三类变动 — 一是《版本发布信息》页面上的镜像 tag 变化(包含 SGLang 版本、MUSA SDK 子版本、torch_musa 版本、构建日期);二是《支持模型及平台》页面上的新增模型、新增量化格式、或者 GPU 平台扩展(比如 PH200 / S6000 上架);三是 9 个模型部署子页上的部署参数调整,包括 TP/EP/DP/PP 路线改动、--moe-runner-backend 后端切换、NSA 后端从 tilelang 迁到别的实现等。这些变动会被雷达每周一 UTC 01:00(HKT 09:00)自动扫描,加入到周报 P0/P1 评级起雾,足够重要的会直接反馈到本课和 m8-l9 的“版本栈”章节。

十一、参考链接