GLM
Training GLM-5.2-744B-A40B on H100
Ranked by tokens/s per GPU · 8,192-token SFT rows · global batch 128 · BF16
| # | Tokens/s per GPU | $ / 1M tokens | GPUs | Layout | Measured | Author | |
|---|---|---|---|---|---|---|---|
| #1 | 68.3 | $28.00 | 256 | TP4 PP8 EP32 DP8 max 8,192 tokens/GPU, CPU optimizer offload | 2026-10-11 | ATTUNE | Recipe › |
| #2 | 68.2 | $28.03 | 256 | TP4 PP8 EP32 DP8 max 8,192 tokens/GPU, recompute 2 layers, CPU optimizer offload | 2026-10-13 | ATTUNE | Recipe › |
| #3 | 66.2 | $28.85 | 256 | TP4 PP8 CP2 EP32 DP4 max 8,192 tokens/GPU, CPU optimizer offload | 2026-10-13 | ATTUNE | Recipe › |
Notes for GLM-5.2-744B-A40B
Patch slime's mask_utils.py with data/patch_glm5_mask.py before building the rows.
The steps every recipe shares: Running a recipe.
Recipes
#1attune-tp4-pp8-cp168.3 tokens/s/GPUTP4 PP8 EP32 DP8max 8,192 tokens/GPU, CPU optimizer offload
- Author
- ATTUNE (cite)
- GPUs
- 256 x H100 80 GB (AWS p5.48xlarge, 8 per node)
- Layout
- TP 4, PP 8 (first stage 14 layers, last 16), CP 1, EP 32, ETP 1, DP 8, sequence parallel; one 8,192-token row per microbatch; full recompute (uniform, 1 layer); CPU optimizer offload with overlapped copies and the precision-aware optimizer; alltoall dispatcher
- Tokens/s per GPU
- 68.26
- $ / 1M tokens
- $28.00
- MFU
- 1.7% (N = 40,297,758,720 active parameters per token)
- Step-time CV
- 1.73%
- Convergence check
- correlation 0.99954, final loss difference 0.0015, 0 pointwise failures over 20 steps
- Measured
- 2026-10-11, 14-step run scored over steps 4–13
- GPU-hours
- 122.2
- Rows
glm52-tulu3-fixed8192-v1(rows_sha256bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455)
Stack
- framework
- slime 0.3.0 with local patches; commit not recorded
- megatron lm
- commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
- transformer engine
- 2.10.0
- pytorch
- 2.11.0 (CUDA 12.9 build)
- cuda
- 12.9
- nccl
- 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
- deepep
- 1.2.1
- python
- 3.12.3
- network
- 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
Environment
CUDA_DEVICE_MAX_CONNECTIONS=1INDEXER_ROPE_NEOX_STYLE=0NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 14 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 1 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 1 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
# recipes/glm-5.2-744b-a40b/h100/attune-tp4-pp8-cp1.yaml
# An OpenRecipes recipe; the fields are documented in schema/recipe.schema.yaml.
schema_version: 1
model: GLM-5.2-744B-A40B
gpu:
type: H100
memory_gb: 80
count: 256
per_node: 8
instance: AWS p5.48xlarge
author:
name: ATTUNE
url: https://arxiv.org/abs/2610.17528
status: verified
stack:
framework: slime 0.3.0 with local patches; commit not recorded
megatron_lm: commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
transformer_engine: 2.10.0
pytorch: 2.11.0 (CUDA 12.9 build)
cuda: '12.9'
nccl: 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
deepep: 1.2.1
python: 3.12.3
network: 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
source: 'in-pod version dump of the measured run''s training image (same digest), 2026-10-11: Megatron-LM git commit
and status, installed megatron-core, TE, PyTorch, NCCL, DeepEP and slime, Python'
workload:
row_tokens: 8192
rows: SFT conversations
global_batch: 128
precision: bf16
dataset:
name: Tulu 3 SFT mixture
source: allenai/tulu-3-sft-mixture
revision: b14afda60f1bbebe55d5d2fa1e4df5042f97f8be
license: ODC-By 1.0
rows_sha256: bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455
build:
name: glm52-tulu3-fixed8192-v1
tokenizer: GLM-5.2 (tokenizer.json sha256 19e773648cb4e65de8660ea6365e10acca112d42a854923df93db4a6f333a82d)
loss_mask: glm5
rows: 12800
row_tokens: 8192
padding_tokens: 0
seed: 20260828
packing: source conversations in a seeded global permutation, concatenated with an EOS token between them and cut
into consecutive 8,192-token rows; rows without supervised targets are skipped
supervised_token_ratio: 0.661
parquet_sha256: 5d951089abd622511a40e0b3a1e5e36ad56859459e4d8c3aff14538cadbd0743
parquet_bytes: 169929706
builder: data/generate_fixed_sft.py with patch_glm5_mask.py (data/README.md)
layout:
label: TP4 PP8 EP32 DP8
summary: TP 4, PP 8 (first stage 14 layers, last 16), CP 1, EP 32, ETP 1, DP 8, sequence parallel; one 8,192-token row
per microbatch; full recompute (uniform, 1 layer); CPU optimizer offload with overlapped copies and the precision-aware
optimizer; alltoall dispatcher
highlights: max 8,192 tokens/GPU, CPU optimizer offload
tp: 4
pp: 8
vpp: 1
cp: 1
ep: 32
etp: 1
dp: 8
sequence_parallel: true
layer_split:
first: 14
last: 16
max_tokens_per_gpu: 8192
rows_per_microbatch: 1
recompute:
granularity: full
method: uniform
num_layers: 1
offload:
optimizer_fraction: 1.0
overlap_d2h_h2d: true
dispatcher: alltoall
result:
tokens_per_s_per_gpu: 68.26
usd_per_million_tokens: 28.0
step_time_cv_percent: 1.73
mfu: 0.0167
mfu_note: null
active_params:
count: 40297758720
source: https://huggingface.co/zai-org/GLM-5.2
revision: cf457fa734ab149ffef225f80893eb38c6ff5cdc
measured: 2026-10-11
steps_per_run: 14
window:
- 4
- 13
window_tokens: 10485760
runs: 1
profiler: false
gpu_hours: 122.2
gpu_hours_note: GPUs x (job start to end), including startup
correctness:
result: pass
summary: passed
reference: Not published.
configuration: pass
component_tests: []
convergence:
steps: 20
result: pass
correlation: 0.99954
final_loss_difference: 0.0015
pointwise_failures: 0
note: on the measured run's training image
rules: argument classes of ATTUNE's skill/scripts/correctness/rules/numerics_list.yaml; 20-step check by Megatron-Bridge
validate_convergence with its pipeline thresholds
env:
CUDA_DEVICE_MAX_CONNECTIONS: '1'
INDEXER_ROPE_NEOX_STYLE: '0'
NCCL_NVLS_ENABLE: $([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
PYTORCH_CUDA_ALLOC_CONF: expandable_segments:True
patches: []
run: |
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 14 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 1 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 1 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
#2attune-tp4-pp8-cp1-rc268.2 tokens/s/GPUTP4 PP8 EP32 DP8max 8,192 tokens/GPU, recompute 2 layers, CPU optimizer offload
- Author
- ATTUNE (cite)
- GPUs
- 256 x H100 80 GB (AWS p5.48xlarge, 8 per node)
- Layout
- TP 4, PP 8 (first stage 14 layers, last 16), CP 1, EP 32, ETP 1, DP 8, sequence parallel; one 8,192-token row per microbatch; full recompute (uniform, 2 layers); CPU optimizer offload with overlapped copies and the precision-aware optimizer; alltoall dispatcher; --allgather-cp
- Tokens/s per GPU
- 68.18
- $ / 1M tokens
- $28.03
- MFU
- 1.7% (N = 40,297,758,720 active parameters per token)
- Step-time CV
- 1.37%
- Convergence check
- correlation 0.999972, final loss difference 0.00014, 0 pointwise failures over 20 steps
- Measured
- 2026-10-13
- GPU-hours
- 149.62
- Rows
glm52-tulu3-fixed8192-v1(rows_sha256bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455)
Stack
- framework
- slime 0.3.0 with local patches; commit not recorded
- megatron lm
- commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
- transformer engine
- 2.10.0
- pytorch
- 2.11.0 (CUDA 12.9 build)
- cuda
- 12.9
- nccl
- 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
- deepep
- 1.2.1
- python
- 3.12.3
- network
- 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
Environment
CUDA_DEVICE_MAX_CONNECTIONS=1INDEXER_ROPE_NEOX_STYLE=0NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 20 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 1 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 2 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
# recipes/glm-5.2-744b-a40b/h100/attune-tp4-pp8-cp1-rc2.yaml
# An OpenRecipes recipe; the fields are documented in schema/recipe.schema.yaml.
schema_version: 1
model: GLM-5.2-744B-A40B
gpu:
type: H100
memory_gb: 80
count: 256
per_node: 8
instance: AWS p5.48xlarge
author:
name: ATTUNE
url: https://arxiv.org/abs/2610.17528
status: verified
stack:
framework: slime 0.3.0 with local patches; commit not recorded
megatron_lm: commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
transformer_engine: 2.10.0
pytorch: 2.11.0 (CUDA 12.9 build)
cuda: '12.9'
nccl: 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
deepep: 1.2.1
python: 3.12.3
network: 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
source: 'in-pod version dump of the measured run''s training image (same digest), 2026-10-11: Megatron-LM git commit
and status, installed megatron-core, TE, PyTorch, NCCL, DeepEP and slime, Python'
workload:
row_tokens: 8192
rows: SFT conversations
global_batch: 128
precision: bf16
dataset:
name: Tulu 3 SFT mixture
source: allenai/tulu-3-sft-mixture
revision: b14afda60f1bbebe55d5d2fa1e4df5042f97f8be
license: ODC-By 1.0
rows_sha256: bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455
build:
name: glm52-tulu3-fixed8192-v1
tokenizer: GLM-5.2 (tokenizer.json sha256 19e773648cb4e65de8660ea6365e10acca112d42a854923df93db4a6f333a82d)
loss_mask: glm5
rows: 12800
row_tokens: 8192
padding_tokens: 0
seed: 20260828
packing: source conversations in a seeded global permutation, concatenated with an EOS token between them and cut
into consecutive 8,192-token rows; rows without supervised targets are skipped
supervised_token_ratio: 0.661
parquet_sha256: 5d951089abd622511a40e0b3a1e5e36ad56859459e4d8c3aff14538cadbd0743
parquet_bytes: 169929706
builder: data/generate_fixed_sft.py with patch_glm5_mask.py (data/README.md)
layout:
label: TP4 PP8 EP32 DP8
summary: TP 4, PP 8 (first stage 14 layers, last 16), CP 1, EP 32, ETP 1, DP 8, sequence parallel; one 8,192-token row
per microbatch; full recompute (uniform, 2 layers); CPU optimizer offload with overlapped copies and the precision-aware
optimizer; alltoall dispatcher; --allgather-cp
highlights: max 8,192 tokens/GPU, recompute 2 layers, CPU optimizer offload
tp: 4
pp: 8
vpp: 1
cp: 1
ep: 32
etp: 1
dp: 8
sequence_parallel: true
layer_split:
first: 14
last: 16
max_tokens_per_gpu: 8192
rows_per_microbatch: 1
recompute:
granularity: full
method: uniform
num_layers: 2
offload:
optimizer_fraction: 1.0
overlap_d2h_h2d: true
dispatcher: alltoall
result:
tokens_per_s_per_gpu: 68.18
usd_per_million_tokens: 28.03
step_time_cv_percent: 1.37
mfu: 0.0167
mfu_note: null
active_params:
count: 40297758720
source: https://huggingface.co/zai-org/GLM-5.2
revision: cf457fa734ab149ffef225f80893eb38c6ff5cdc
measured: 2026-10-13
steps_per_run: 20
window:
- 5
- 19
window_tokens: 15728640
runs: 1
profiler: false
gpu_hours: 149.62
gpu_hours_note: GPUs x (scheduler admission to finish), including startup; the same run is the candidate arm of the
convergence check
correctness:
result: pass
summary: passed
reference: Not published.
configuration: pass
component_tests: []
convergence:
steps: 20
result: pass
correlation: 0.999972
final_loss_difference: 0.00014
pointwise_failures: 0
note: 'candidate arm: the measured run; reference arm: a 20-step run of the reference recipe on the same image and
rows; the parity probe off in both'
rules: argument classes of ATTUNE's skill/scripts/correctness/rules/numerics_list.yaml; 20-step check by Megatron-Bridge
validate_convergence with its pipeline thresholds
env:
CUDA_DEVICE_MAX_CONNECTIONS: '1'
INDEXER_ROPE_NEOX_STYLE: '0'
NCCL_NVLS_ENABLE: $([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
PYTORCH_CUDA_ALLOC_CONF: expandable_segments:True
patches: []
run: |
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 20 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 1 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 2 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
#3attune-tp4-pp8-cp266.2 tokens/s/GPUTP4 PP8 CP2 EP32 DP4max 8,192 tokens/GPU, CPU optimizer offload
- Author
- ATTUNE (cite)
- GPUs
- 256 x H100 80 GB (AWS p5.48xlarge, 8 per node)
- Layout
- TP 4, PP 8 (first stage 14 layers, last 16), CP 2, EP 32, ETP 1, DP 4, sequence parallel; max 8,192 tokens per GPU; full recompute (uniform, 1 layer); CPU optimizer offload with overlapped copies and the precision-aware optimizer; alltoall dispatcher; --allgather-cp
- Tokens/s per GPU
- 66.24
- $ / 1M tokens
- $28.85
- MFU
- 1.6% (N = 40,297,758,720 active parameters per token)
- Step-time CV
- 2.59%
- Convergence check
- correlation 0.999974, final loss difference 0.00044, 0 pointwise failures over 20 steps
- Measured
- 2026-10-13
- GPU-hours
- 151.32
- Rows
glm52-tulu3-fixed8192-v1(rows_sha256bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455)
Stack
- framework
- slime 0.3.0 with local patches; commit not recorded
- megatron lm
- commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
- transformer engine
- 2.10.0
- pytorch
- 2.11.0 (CUDA 12.9 build)
- cuda
- 12.9
- nccl
- 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
- deepep
- 1.2.1
- python
- 3.12.3
- network
- 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
Environment
CUDA_DEVICE_MAX_CONNECTIONS=1INDEXER_ROPE_NEOX_STYLE=0NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 20 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 2 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 1 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
# recipes/glm-5.2-744b-a40b/h100/attune-tp4-pp8-cp2.yaml
# An OpenRecipes recipe; the fields are documented in schema/recipe.schema.yaml.
schema_version: 1
model: GLM-5.2-744B-A40B
gpu:
type: H100
memory_gb: 80
count: 256
per_node: 8
instance: AWS p5.48xlarge
author:
name: ATTUNE
url: https://arxiv.org/abs/2610.17528
status: verified
stack:
framework: slime 0.3.0 with local patches; commit not recorded
megatron_lm: commit 1dcf0daf (megatron-core 0.16.0rc0) with local patches
transformer_engine: 2.10.0
pytorch: 2.11.0 (CUDA 12.9 build)
cuda: '12.9'
nccl: 2.28.9 (PyTorch's NCCL wheel; printed by the measured run)
deepep: 1.2.1
python: 3.12.3
network: 8 GPUs per node, EFA, 3.2 Tb/s RDMA per node
source: 'in-pod version dump of the measured run''s training image (same digest), 2026-10-11: Megatron-LM git commit
and status, installed megatron-core, TE, PyTorch, NCCL, DeepEP and slime, Python'
workload:
row_tokens: 8192
rows: SFT conversations
global_batch: 128
precision: bf16
dataset:
name: Tulu 3 SFT mixture
source: allenai/tulu-3-sft-mixture
revision: b14afda60f1bbebe55d5d2fa1e4df5042f97f8be
license: ODC-By 1.0
rows_sha256: bb302c134974b96f3905e9c87bfc4c0bb2be674a50e6dad09121aed2a0eb3455
build:
name: glm52-tulu3-fixed8192-v1
tokenizer: GLM-5.2 (tokenizer.json sha256 19e773648cb4e65de8660ea6365e10acca112d42a854923df93db4a6f333a82d)
loss_mask: glm5
rows: 12800
row_tokens: 8192
padding_tokens: 0
seed: 20260828
packing: source conversations in a seeded global permutation, concatenated with an EOS token between them and cut
into consecutive 8,192-token rows; rows without supervised targets are skipped
supervised_token_ratio: 0.661
parquet_sha256: 5d951089abd622511a40e0b3a1e5e36ad56859459e4d8c3aff14538cadbd0743
parquet_bytes: 169929706
builder: data/generate_fixed_sft.py with patch_glm5_mask.py (data/README.md)
layout:
label: TP4 PP8 CP2 EP32 DP4
summary: TP 4, PP 8 (first stage 14 layers, last 16), CP 2, EP 32, ETP 1, DP 4, sequence parallel; max 8,192 tokens
per GPU; full recompute (uniform, 1 layer); CPU optimizer offload with overlapped copies and the precision-aware optimizer;
alltoall dispatcher; --allgather-cp
highlights: max 8,192 tokens/GPU, CPU optimizer offload
tp: 4
pp: 8
vpp: 1
cp: 2
ep: 32
etp: 1
dp: 4
sequence_parallel: true
layer_split:
first: 14
last: 16
max_tokens_per_gpu: 8192
rows_per_microbatch: 2
recompute:
granularity: full
method: uniform
num_layers: 1
offload:
optimizer_fraction: 1.0
overlap_d2h_h2d: true
dispatcher: alltoall
result:
tokens_per_s_per_gpu: 66.24
usd_per_million_tokens: 28.85
step_time_cv_percent: 2.59
mfu: 0.0162
mfu_note: null
active_params:
count: 40297758720
source: https://huggingface.co/zai-org/GLM-5.2
revision: cf457fa734ab149ffef225f80893eb38c6ff5cdc
measured: 2026-10-13
steps_per_run: 20
window:
- 5
- 19
window_tokens: 15728640
runs: 1
profiler: false
gpu_hours: 151.32
gpu_hours_note: GPUs x (scheduler admission to finish), including startup; the same run is the candidate arm of the
convergence check
correctness:
result: pass
summary: passed
reference: Not published.
configuration: pass
component_tests: []
convergence:
steps: 20
result: pass
correlation: 0.999974
final_loss_difference: 0.00044
pointwise_failures: 0
note: 'candidate arm: the measured run; reference arm: a 20-step run of the reference recipe on the same image and
rows; the parity probe off in both'
rules: argument classes of ATTUNE's skill/scripts/correctness/rules/numerics_list.yaml; 20-step check by Megatron-Bridge
validate_convergence with its pipeline thresholds
env:
CUDA_DEVICE_MAX_CONNECTIONS: '1'
INDEXER_ROPE_NEOX_STYLE: '0'
NCCL_NVLS_ENABLE: $([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
PYTORCH_CUDA_ALLOC_CONF: expandable_segments:True
patches: []
run: |
export CUDA_DEVICE_MAX_CONNECTIONS=1
export INDEXER_ROPE_NEOX_STYLE=0
export NCCL_NVLS_ENABLE=$([ "$NVLINK_COUNT" -gt 0 ] && echo 1 || echo 0)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # set in the pod environment
python3 -m <slime entry module> --async \
--actor-num-nodes 32 \
--actor-num-gpus-per-node 8 \
${MODEL_ARGS[@]} \
--hf-checkpoint "$HF_CKPT" \
--ref-load "$TORCH_DIST" \
--rollout-function-path pretokenized_sft_rollout.generate_rollout \
--prompt-data "$SFT_DATA" \
--input-key messages \
--metadata-key metadata \
--num-rollout 20 \
--rollout-batch-size 128 \
--global-batch-size 128 \
--loss-type sft_loss \
--calculate-per-token-loss \
--disable-compute-advantages-and-returns \
--debug-train-only \
--tensor-model-parallel-size 4 \
--sequence-parallel \
--pipeline-model-parallel-size 8 \
--decoder-first-pipeline-num-layers 14 \
--decoder-last-pipeline-num-layers 16 \
--context-parallel-size 2 \
--expert-model-parallel-size 32 \
--expert-tensor-parallel-size 1 \
--recompute-granularity full \
--recompute-method uniform \
--recompute-num-layers 1 \
--use-dynamic-batch-size \
--max-tokens-per-gpu 8192 \
--data-pad-size-multiplier 256 \
--optimizer adam --lr 1e-5 --lr-decay-style cosine --min-lr 1e-6 \
--lr-warmup-fraction 0.1 --weight-decay 0.1 --adam-beta1 0.9 --adam-beta2 0.98 \
--optimizer-cpu-offload --overlap-cpu-optimizer-d2h-h2d --use-precision-aware-optimizer \
--attention-dropout 0.0 --hidden-dropout 0.0 \
--accumulate-allreduce-grads-in-fp32 --attention-softmax-in-fp32 \
--attention-backend flash \
--moe-token-dispatcher-type alltoall \
--allgather-cp
Citation
If you use a recipe by ATTUNE, please cite the paper.
@article{fan2026attune,
title = {{ATTUNE: Agentic Throughput Tuning for LLM Training}},
author = {Leo Fan and Hongyang Wang and Wenbo Chen and Jingguo Liu and Xian Li and Xuan Wang and
Ruochen Wen and Yiming Yan and Hao Wu and Zheshen Wang and Benoit Dumoulin},
journal = {arXiv preprint arXiv:2610.17528},
year = {2026},
url = {https://arxiv.org/abs/2610.17528}
}
GLM-5.2-744B-A40B on other GPUs
H100 · 256 GPUs · this page
68.3
tokens/s/GPU · $28.00 / 1M tokens
H200 · 128 GPUs
161.8
tokens/s/GPU · $13.58 / 1M tokens
B200 · 64 GPUs
146.8
tokens/s/GPU · $26.95 / 1M tokens