slime 框架 64xH100 大规模训练 GLM-4.7-355B-A32B:MoE 并行、MTP 投机解码与 FP8 Rollout 全指南
slime 框架 64xH100 大规模训练 GLM-4.7-355B-A32BMoE 并行、MTP 投机解码与 FP8 Rollout 全指南【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slimeslime 是一个面向 RL Scaling 的 LLM 后训练框架。本文档以 slime 仓库中的 64xH100 训练 GLM-4.7-355B-A32B 示例为核心完整讲解从环境准备、checkpoint 转换、多机训练到 MTP 投机解码/联合训练、FP8 rollout 的端到端实战方案。读完本文你将掌握在 64 张 H100 上以 TP8/PP4/EP16/CP2 并行度运行 GLM-4.7 强化学习训练的参数配置要点以及如何利用模型自带 MTP 层加速 rollout、如何把开源 per-channel FP8 权重转换为可启用 DeepEP 的 per-block 格式。环境准备前置条件GLM-4.7 的训练与 Qwen3-4B 使用相同的 slime 标准 Docker 环境环境搭建与数据集的下载方式可以参考 示例Qwen3-4B将其中 Qwen3-4B 的部分替换为 GLM-4.7 即可。主要步骤为拉取slimerl/slime:latest镜像后初始化环境cd /root/ git clone https://github.com/THUDM/slime.git cd slime/ pip install -e . --no-deps训练数据zhuzilin/dapo-math-17k与评测数据zhuzilin/aime-2024同样通过hf download --repo-type dataset获取。本示例为多机训练启动前需要满足以下条件共享存储所有节点都能访问同一个$BASE_DIR路径模型权重、数据集、输出目录都放在其中取消代理在启动 Ray worker 之前先取消代理变量否则多机通信可能被代理拦截unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY下载模型使用 Hugging Face CLI 将 GLM-4.7 权重下载到共享路径hf download zai-org/GLM-4.7 --local-dir $BASE_DIR/GLM-4.7-355B-A32B转换 CheckpointMegatron 训练无法直接从 Hugging Face checkpoint 读取模型结构需要先把 HF 权重转换为 Megatron 可加载的 torch_dist 格式。该步骤在 2 机 x 8 卡上执行cd /root/slime pip install -e . --no-deps source scripts/models/glm4.5-355B-A32B.sh PYTHONPATH/root/Megatron-LM/ torchrun \ --nproc-per-node 8 \ --master-addr ${MASTER_ADDR} --master-port 12345 \ --nnodes2 --node-rank ${NODE_RANK} \ tools/convert_hf_to_torch_dist.py \ ${MODEL_ARGS[]} \ --hf-checkpoint $BASE_DIR/GLM-4.7-355B-A32B/ \ --save $BASE_DIR/GLM-4.7-355B-A32B_torch_dist/其中MASTER_ADDR是 node0 的 IPNODE_RANK表示当前机器的编号配置方式与普通多机torchrun一致。注意这里 source 的模型配置脚本名为glm4.5-355B-A32B.sh是因为 GLM-4.7-355B-A32B 与 GLM-4.5-355B-A32B 架构一致可直接复用其模型参数定义见下文“模型架构与 MODEL_ARGS”。模型架构与 MODEL_ARGSscripts/models/glm4.5-355B-A32B.sh 定义了 GLM-4.7 的完整 Megatron 模型配置。GLM-4.7 是一个 MoE混合专家模型包含160 个路由专家top-8 激活和共享专家共92 层3 层 dense 89 层 MoE。核心配置如下N_DENSE_LAYERS3 N_MOE_LAYERS89 MODEL_ARGS( --disable-bias-linear --qk-layernorm --group-query-attention --num-attention-heads 96 --num-query-groups 8 --kv-channels 128 --num-layers $((N_DENSE_LAYERS N_MOE_LAYERS)) # 92 --hidden-size 5120 --ffn-hidden-size 12288 --add-qkv-bias --normalization RMSNorm --position-embedding-type rope --rotary-percent 0.5 --rotary-base 1000000 --swiglu --untie-embeddings-and-output-weights --vocab-size 151552 # MoE 相关 --moe-ffn-hidden-size 1536 --moe-shared-expert-intermediate-size 1536 --moe-router-pre-softmax --moe-router-score-function sigmoid --moe-router-enable-expert-bias --moe-router-bias-update-rate 0 --moe-router-load-balancing-type seq_aux_loss --moe-token-dispatcher-type alltoall --moe-router-topk 8 --moe-router-topk-scaling-factor 2.5 --moe-layer-freq [0]*$N_DENSE_LAYERS[1]*$N_MOE_LAYERS --num-experts 160 --moe-grouped-gemm --moe-router-dtype fp32 --moe-permute-fusion --moe-aux-loss-coeff 0 )要点解读注意力为 GQA 结构96 个 attention head、8 个 query group、KV 通道数为 128位置编码使用 RoPE--rotary-base 1000000等超参必须与模型原始设定一致不同模型即使架构相同也可能使用不同取值如有需要可在加载模型权重后覆盖MoE 部分router 采用 sigmoid 打分、pre-softmax、expert bias 等 GLM 系列特性top-8 激活、160 专家、topk scaling factor 2.5并通过--moe-layer-freq用 Python 表达式精确控制 dense/MoE 层分布。执行训练从 node0 执行训练脚本scripts/run-glm4.7-355B-A32B.shcd /root/slime export BASE_DIR/shared/path # 所有节点都能访问的共享路径 bash scripts/run-glm4.7-355B-A32B.sh该脚本会先清理残留的 sglang/ray 进程设置PYTHONUNBUFFERED1与取消代理然后探测 NVLink 拓扑nvidia-smi topo -m决定是否启用 NCCL NVLS最后以 Ray 集群方式提交训练任务--colocate表示训练与推理共享同一批 GPU。CKPT_ARGSCKPT_ARGS( --hf-checkpoint $BASE_DIR/GLM-4.7-355B-A32B --ref-load $BASE_DIR/GLM-4.7-355B-A32B_torch_dist/ )--hf-checkpoint是 SGLang 推理所需的 HF 格式权重同时提供 tokenizer--ref-load是参考模型reference model加载的 torch_dist 权重路径。ROLLOUT_ARGSROLLOUT_ARGS( --prompt-data $BASE_DIR/dapo-math-17k/dapo-math-17k.jsonl --input-key prompt --label-key label --apply-chat-template --rollout-shuffle --rm-type deepscaler --num-rollout 3000 --rollout-batch-size 128 --n-samples-per-prompt 8 --rollout-max-response-len 32768 --rollout-temperature 1 --over-sampling-batch-size 256 --dynamic-sampling-filter-path slime.rollout.filter_hub.dynamic_sampling_filters.check_reward_nonzero_std --num-steps-per-rollout 4 --balance-data --rollout-stop-token-ids 151329 151336 151338 )--apply-chat-template当 prompt 的input_key含 OpenAI 风格消息时执行tokenizer.apply_chat_template(...)--rm-type deepscaler奖励模型类型slime 内置多种 RM并支持--custom-rm-path自定义--over-sampling-batch-size 256大于--rollout-batch-size 128配合--dynamic-sampling-filter-path启用 DAPO 式动态采样先超采样 256 个 prompt每 prompt 采样 8 条收到回答后用check_reward_nonzero_std过滤奖励全部相同全对或全错的样本--rollout-stop-token-ids指定停止 token 集合控制生成结束条件。EVAL_ARGSEVAL_ARGS( --eval-interval 20 --eval-prompt-data aime $BASE_DIR/rl_data/aime-2024.jsonl --n-samples-per-eval-prompt 8 --eval-max-response-len 32768 --eval-top-p 1 )评测时继承大部分 rollout 参数但可通过独立的--eval-*参数覆盖采样策略如--eval-top-p使训练与评测采用不同采样方式。GRPO_ARGSGRPO_ARGS( --advantage-estimator gspo #--use-kl-loss --kl-loss-coef 0.00 --kl-loss-type low_var_kl --kl-coef 0.00 --entropy-coef 0.00 --eps-clip 1e-4 --eps-clip-high 2e-4 --use-tis )GLM-4.7 示例使用GSPO优势估计器而非经典 GRPO并启用--use-tisToken-level Importance Sampling等技巧KL 与熵正则项均关闭。MISC_ARGSMISC_ARGS( --attention-dropout 0.0 --hidden-dropout 0.0 --accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 --attention-backend flash --moe-token-dispatcher-type flex --moe-enable-deepep )关闭 dropoutMegatron 默认 0.1保证 RL 训练确定性梯度 allreduce 与 attention softmax 均在 fp32 下累积提升数值稳定性--moe-token-dispatcher-type flex与--moe-enable-deepep启用 DeepEP 的灵活 token 分发。WANDB_ARGS默认注释掉 wandb 相关参数需要时可打开WANDB_ARGS( # --use-wandb # --wandb-project slime-dev # --wandb-group glm4.7-355B )MoE 配置64xH100 上的三方并行协同GLM-4.7-355B-A32B 是 355B 参数级别的巨型 MoE64 张 H100 上必须同时在训练Megatron与推理SGLang两端做显存与通信优化。1. 训练端CPU Adam 释放显存为了在 64xH100 上装下 355B 模型开启 Megatron 的 CPU Adam把优化器状态卸载到 CPU 内存以节省 GPU 显存OPTIMIZER_ARGS( --optimizer adam --lr 1e-6 --lr-decay-style constant --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 --optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer )--optimizer-cpu-offload优化器状态驻留 CPU--overlap-cpu-optimizer-d2h-h2d将 D2H/H2D 拷贝与计算重叠隐藏 CPU offload 的通信开销--use-precision-aware-optimizer按精度感知方式管理优化器状态进一步压降显存。训练超参方面采用恒定的lr1e-6与较大的weight-decay0.1适合 RL 后训练阶段的稳定微调。2. 训练端Megatron 的 MoE 并行当前 64xH100 示例使用TP8、PP4、CP2、EP16PERF_ARGS( --tensor-model-parallel-size 8 --sequence-parallel --pipeline-model-parallel-size 4 --context-parallel-size 2 --expert-model-parallel-size 16 --expert-tensor-parallel-size 1 --recompute-granularity full --recompute-method uniform --recompute-num-layers 1 --use-dynamic-batch-size --max-tokens-per-gpu 16384 )张量并行 TP8 配合--sequence-parallel切分 attention/FFN 权重并减少通信量专家并行 EP16 把 160 个专家分散到不同 GPU 上--expert-tensor-parallel-size 1表示专家不再额外做张量切分流水线并行 PP4 与上下文并行 CP2 进一步分摊层与序列维度并行度需要成套调整不能只改其中一个--recompute-*开启选择性重计算换取显存每 1 层重算一次--use-dynamic-batch-size与--max-tokens-per-gpu 16384slime 自研的动态 batch 机制按“每个 GPU 最多处理 16384 token”的标准把不同长度的样本打包成动态 micro-batch。当开启 CP 时CP 组内 GPU 共享CP * max_tokens_per_gpu的 token 容量开启后传统--micro-batch-size被忽略。slime 始终以数据打包方式训练并严格保证 per-sample/per-token loss因此动态 batch 不影响 loss 计算建议开启。3. 推理端SGLang 的 DP attention MoE 优化rollout 侧以 32 卡为一个 SGLang engine并开启带 DP attention 的 MoE 优化SGLANG_ARGS( --rollout-num-gpus-per-engine 32 --sglang-mem-fraction-static 0.7 --sglang-enable-dp-attention --sglang-dp-size 4 --sglang-ep-size 32 --sglang-enable-dp-lm-head --sglang-moe-dense-tp-size 1 ... )--rollout-num-gpus-per-engine 32每个 SGLang server 使用 32 卡对应 sglang 的 tp 规模--sglang-mem-fraction-static 0.7静态 KV cache 显存占比其余留给权重与计算--sglang-enable-dp-attention与--sglang-dp-size 4在 32 卡内启用 DP attention把不同请求及对应 attention 计算分发到 4 个 DP 组配合--sglang-ep-size 32专家分布在全部 32 卡实现 attention 与 MoE 的分离并行显著降低长序列场景下的通信压力--sglang-enable-dp-lm-headLM head 输出也按 DP 方式计算避免最后一层成为瓶颈--sglang-moe-dense-tp-size 1dense 部分不做额外张量并行。slime 对 SGLang 所有参数实现无缝透传加--sglang-前缀即可见 使用说明因此--sglang-*系列均可按需组合启用例如--sglang-enable-ep-moe、--sglang-enable-deepep-moe等更激进的 MoE 推理优化。MTP 投机解码推理加速GLM-4.7 自带MTPMulti-Token Prediction多 token 预测层可在推理阶段充当 EAGLE 风格投机解码的 draft model一次前向预测多个 token从而显著加速 rollout 生成。在SGLANG_ARGS中加入SGLANG_ARGS( ... # MTP 投机解码 (EAGLE) --sglang-speculative-algorithm EAGLE --sglang-speculative-num-steps 3 --sglang-speculative-eagle-topk 1 --sglang-speculative-num-draft-tokens 4 )--sglang-speculative-algorithm EAGLE选择 EAGLE 投机解码算法--sglang-speculative-num-steps 3投机深度即一次最多验证 3 个 draft 步--sglang-speculative-eagle-topk 1每步 draft 候选只取 top-1降低 draft 分支开销--sglang-speculative-num-draft-tokens 4单次投机最多生成 4 个 draft token。⚠️注意投机解码会额外占用 GPU 显存需要额外空间存放 draft 模型状态。如果遇到 OOM可以尝试降低--sglang-mem-fraction-static或暂时关闭投机解码。MTP 训练与主模型联合训练除了用 MTP 层做推理加速slime 还支持把 MTP 层与主模型在 RL 阶段联合训练使 MTP 层持续适配当前策略。启用时配置# 在模型配置中添加 MTP 层数 MODEL_ARGS(--mtp-num-layers 1) # 启用 MTP 训练 MTP_ARGS( --enable-mtp-training --mtp-loss-scaling-factor 0.2 )参数语义--mtp-num-layers 1告知 Megatron 从 checkpoint 中加载 1 层 MTP 层对应新增的 1 个预测头--enable-mtp-training启用 MTP 层的梯度计算不设置时 MTP 层会被加载但保持冻结--mtp-loss-scaling-factor 0.2MTP loss 相对主策略 loss 的权重默认值 0.2。源码依据参数定义位于 slime/utils/arguments.py 的add_mtp_training_arguments其中--mtp-num-layers默认None、--mtp-loss-scaling-factor默认0.2、--enable-mtp-training默认关闭。训练循环侧在 slime/backends/megatron_utils/model.py 中当enable_mtp_training打开时会对 MTP loss 按 microbatch 数归一mtp_loss_scale 1 / num_microbatches[step_id]并写入train/mtp_loss等日志配合 slime/backends/megatron_utils/ci_utils.py 的check_mtp_loss断言可在 CI 中校验 MTP loss 数值。注意slime/backends/megatron_utils/hf_to_megatron/glm.py 中的原生 loader 会同时映射普通层与 MTP 层权重——它通过正则mtp\.layers\.(\d)\.(.)识别 MTP 权重并将其映射到config.num_hidden_layers mtp_layer的扩展层索引上因此 HF checkpoint 中的 MTP 权重可以原样加载进 Megatron。多机支持本示例本身就是多机训练配置。启动前请逐一确认模型权重和数据集放在所有节点都能访问到的共享路径MASTER_ADDR设置为所有节点都能访问到的地址在启动 Ray worker 前先取消代理见上文“前置条件”提供一个HOSTFILE列出 worker IP每行一个并在启动前export HOSTFILE/path/to/hostfile。脚本中会通过ssh root${WORKER_IP}逐台拉起 Ray workerray start --address${MASTER_ADDR}:6379并把no_proxy、GLOO_SOCKET_IFNAME、TP_SOCKET_IFNAME、MASTER_ADDR、PYTHONPATH/root/Megatron-LM/、NCCL_NVLS_ENABLE等通过 Ray runtime env 注入所有 worker并行度需要成套调整。默认示例训练侧使用TP8、PP4、EP16、CP2rollout 侧使用 32 卡/engine SGLang DP attention节点数可通过ACTOR_NUM_NODES、ACTOR_NUM_GPUS_PER_NODE环境变量覆盖默认 8 节点 x 8 卡。如果 rollout GPU 数与 expert 数160之间不能整除可以通过--sglang-ep-num-redundant-experts增加冗余 expert在推理侧补齐专家数量保证专家在 GPU 上均匀分布。FP8 Rollout从 per-channel 到 per-block 的转换开源版 GLM-4.7 的 FP8 checkpoint 使用per-channel 量化目前无法在 SGLang 中直接启用 DeepEPDeepEP 需要 per-block 粒度的量化 scale。可以利用 slime 自带的转换工具 tools/convert_hf_to_fp8.py 将其转换为128x128 per-block FP8 checkpointcd /root/slime python tools/convert_hf_to_fp8.py \ --model-dir $BASE_DIR/GLM-4.7-355B-A32B/ \ --save-dir $BASE_DIR/GLM-4.7-355B-A32B-FP8/ \ --strategy block --block-size 128 128 \ --max-workers 4参数说明--strategy {block,channel,tensor}量化粒度这里必须选block--block-size 128 128每个量化块覆盖 128 行 x 128 列128x128 块是 DeepEP 的标准支持粒度--max-workers 4并行处理线程数。实现层面见 tools/convert_hf_to_fp8.py 的block_fp8函数转换过程会对权重按块求绝对值最大值作为 scale并把空块如 padding 行或未使用的 MoE expert的 scale 用clamp(min1e-12)保护避免出现0/0 NaN。归一化层、embedding、router、lm_head 等模块默认不做量化modules_to_not_convert。转换完成后把--hf-checkpoint改为$BASE_DIR/GLM-4.7-355B-A32B-FP8/即可开启 FP8 rollout。一个可参考的 FP8SGLANG_ARGS完整配置如下SGLANG_ARGS( --rollout-num-gpus-per-engine 32 --sglang-mem-fraction-static 0.7 --sglang-enable-dp-attention --sglang-dp-size 32 --sglang-ep-size 32 --sglang-moe-dense-tp-size 1 --sglang-enable-dp-lm-head --sglang-cuda-graph-bs 1 2 4 8 $(seq 16 8 128) --sglang-speculative-algorithm EAGLE --sglang-speculative-num-steps 3 --sglang-speculative-eagle-topk 1 --sglang-speculative-num-draft-tokens 4 --sglang-moe-a2a-backend deepep --sglang-deepep-mode auto )与 BF16 版配置的差异点--sglang-dp-size 32DP attention 的 DP 规模从 4 放大到 32FP8 下显存更充裕可把请求并行打到全部 32 卡--sglang-cuda-graph-bs 1 2 4 8 $(seq 16 8 128)显式初始化覆盖更多 batch 尺寸的 CUDA graph避免高并发下反复重建 graph默认 CUDA graph 并发上限约 160超限会影响推理速度也常与--sglang-server-concurrency配合使用--sglang-moe-a2a-backend deepep与--sglang-deepep-mode autoMoE all-to-all 通信后端切换为 DeepEP 并自动选择调度模式——这正是把权重转成 128x128 per-block FP8 的目的所在。小结在 slime 框架中用 64xH100 训练 GLM-4.7-355B-A32B 是一条完整的工程链路环境与数据标准 slime Docker 共享$BASE_DIR 取消代理权重转换source scripts/models/glm4.5-355B-A32B.sh后通过 tools/convert_hf_to_torch_dist.py 生成 torch_dist 格式供 Megatron 参考模型加载训练启动scripts/run-glm4.7-355B-A32B.sh 一键拉起 Ray 集群并提交train.py并行策略训练端 TP8/PP4/EP16/CP2 CPU Adam 动态 batch推理端 32 卡 engine DP attention EP32MTP 双用既可作为 EAGLE draft model 加速 rollout也可通过--enable-mtp-training与主模型联合训练FP8 rollout用 tools/convert_hf_to_fp8.py 把 per-channel 权重转为 128x128 per-block再在 SGLang 侧开启 DeepEP。相关测试与更多示例可进一步参考仓库中的 GLM-4.7 30B 示例、DeepSeek-R1 示例 以及 入门指南它们对动态采样、partial rollout、训练推理解耦等 slime 通用特性做了更细致的讲解。【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考