8xH100 训练 Qwen3-30B-A3B#
环境准备#
搭建环境、下载模型、数据与 ckpt 转换均与 Qwen3-4B 模型相同,可以参考 示例:Qwen3-4B,将文中 Qwen3-4B 的部分转换为 Qwen3-30B-A3B 即可。
可以用如下方法把 huggingface checkpoint 转化为 torch_dist 格式:
cd vime/
pip install -e . --no-deps
source scripts/models/qwen3-30B-A3B.sh
PYTHONPATH=/root/Megatron-LM/ torchrun --nproc-per-node 8 \
tools/convert_hf_to_torch_dist.py \
${MODEL_ARGS[@]} \
--hf-checkpoint /root/Qwen3-30B-A3B/ \
--save /root/Qwen3-30B-A3B_torch_dist/
执行训练#
执行训练:
cd /root/vime
bash scripts/run-qwen3-30B-A3B.sh
参数简介#
这里我们简单介绍一下脚本 run-qwen3-30B-A3B.sh 中与 MoE 相关的部分。
为了支持在 8xH800 环境中运行 Qwen3-30B-A3B,我们需要开启 megatron 的 CPU Adam 以节省显存,对应配置为:
OPTIMIZER_ARGS=( ... --optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer )
开启 megatron 支持的 moe 优化,当前配置为 tp4, ep8:
PERF_ARGS=( --tensor-model-parallel-size 4 --sequence-parallel --pipeline-model-parallel-size 1 --context-parallel-size 1 --expert-model-parallel-size 8 --expert-tensor-parallel-size 1 ... )
在 vLLM 侧开启 MoE expert parallelism。vLLM 中 EP size 由
tensor_parallel_size × data_parallel_size自动推导,所以 8 卡 engine 只需--vllm-enable-expert-parallel就是 EP=8:VLLM_ARGS=( --rollout-num-gpus-per-engine 8 --vllm-gpu-memory-utilization 0.7 --vllm-enable-expert-parallel --vllm-cudagraph-capture-sizes 1 2 4 8 $(seq 16 8 256) )
如果要在 attention 上做 DP 同时在 expert 上做 EP,可以加
--vllm-data-parallel-size N配合--vllm-enable-expert-parallel。
多机支持#
以下以 2台机器、每台8卡(共16GPU) 为入门示例;脚本与参数可扩展到 N节点。多机与单机的主要差异:
训练模型、数据放在所有节点均可访问的路径(如 NFS);
MASTER_ADDR设为 head 节点的 局域网 IP(非127.0.0.1);去掉 CPU Adam(多机使用 distributed optimizer,无需
--optimizer-cpu-offload);global-batch-size必须等于rollout-batch-size × n-samples-per-prompt。
拓扑概览#
组件 |
双机默认配置 |
|---|---|
集群 |
|
Megatron训练 |
TP=8, EP=8, CP=2(expert 分片跨节点) |
vLLM Rollout |
跨节点 TP=16( |
调度 |
Ray 集群 + |
转换 checkpoint 时建议使用与训练一致的 Megatron 并行度(双机示例 TP=8, EP=8)。checkpoint 的 EP 需与 --expert-model-parallel-size 一致,否则 load_checkpoint 可能极慢或卡住。
启动 Ray 集群#
Ray 集群需在各节点上 单独启动,不在训练脚本内。先在所有 worker 节点加入集群,确认 ray status 显示预期 GPU 总数后,再在 head 提交训练。示例(双机):
# === Head 节点 ===
export MASTER_ADDR=<head_局域网_IP>
ray start --head --node-ip-address="${MASTER_ADDR}" --num-gpus 8 --disable-usage-stats \
--dashboard-host=0.0.0.0 --dashboard-port=8265
# === 各 Worker 节点 ===
export MASTER_ADDR=<head_局域网_IP>
ray start --address="${MASTER_ADDR}:6379" --node-ip-address=<本机_局域网_IP> --num-gpus 8
更多说明见 快速开始 — 多机训练。
执行训练#
Ray 集群就绪后,在 head 节点 设置多机环境变量并运行 与单机相同的脚本(ACTOR_NUM_NODES>1 时脚本不会启动 Ray,并使用多机默认参数):
export MASTER_ADDR=<head_局域网_IP>
export ACTOR_NUM_NODES=2
export ACTOR_NUM_GPUS_PER_NODE=8
cd /root/vime
bash scripts/run-qwen3-30B-A3B.sh
2 step 冒烟示例:
NUM_ROLLOUT=2 ENABLE_R3=0 bash scripts/run-qwen3-30B-A3B.sh
扩展到 N 节点(例如 4×8)时,在各 worker 加入 Ray 后,于 head 设置 ACTOR_NUM_NODES=4 并按总卡数调整 MEGATRON_TP / MEGATRON_EP / MEGATRON_CP / ROLLOUT_NUM_GPUS_PER_ENGINE。
多机关键参数#
变量 |
双机默认 |
说明 |
|---|---|---|
|
2(单机默认为 1) |
训练节点总数(含 head);>1 时脚本不启动 Ray |
|
8 |
每节点 GPU 数 |
|
8 / 8 / 2 |
Megatron 并行 |
|
总 GPU 数 |
vLLM engine 占用卡数 |
|
1 |
设为 0 可关闭 R3 路径 |
脚本默认 batch:rollout-batch-size=4,n-samples-per-prompt=2,global-batch-size=8;vLLM 使用 --vllm-moe-backend triton。
多机常见问题#
Worker 无法加入 Ray / NCCL 失败:检查
MASTER_ADDR、容器/etc/hosts(hostname 勿指向127.0.0.1)、NCCL_SOCKET_IFNAME/GLOO_SOCKET_IFNAME。Not enough samples X for global_batch_size Y:同步调整global-batch-size与rollout-batch-size × n-samples-per-prompt。GPU 显存占满但无进程:重启容器或
ray stop --force清理残留 vLLM 上下文。
EPLB#
当总卡数并不能被 expert 总数整除时,可以开启 vLLM 的 EPLB(Expert Parallelism Load Balancer),通过 --vllm-eplb-config 配置冗余 expert。例如对于 24 卡的场景:
VLLM_ARGS=(
--rollout-num-gpus-per-engine 24
--vllm-gpu-memory-utilization 0.7
--vllm-data-parallel-size 3
--vllm-enable-expert-parallel
--vllm-enable-eplb
--vllm-eplb-config '{"num_redundant_experts": 16}'
)