Release notes#
AMD publishes two families of Primus training Docker image:
Image |
Backends |
Documented in |
|---|---|---|
|
Megatron-LM, TorchTitan, Megatron Bridge |
|
|
MaxText (JAX) |
The two families share a version number but are not built in lockstep — the same vNN.N tag can be weeks apart between families, and the MaxText family also ships patch releases (v26.3.1, v26.3.2) with no rocm/primus counterpart. Always read the section for the exact tag you are running.
This page is the single source of truth for image contents. Other pages link here instead of repeating version tables, so there is exactly one place to update per release. If you add a page that names an image tag, link to the relevant section below rather than restating the stack.
Every version below was read out of the published image itself. From v26.4 on, the values were additionally cross-checked against the release Dockerfiles in .github/workflows/docker-release/; earlier releases predate those files and are image-derived only. See Verifying the stack in an image to reproduce any table.
Highlights for v26.9#
Both families move to ROCm nightlies. rocm/primus moves from the ROCm 10.1.0 release to a ROCm 10.2 nightly (10.2.0a20261020), with a PyTorch 2.16 pre-release and a Transformer Engine 2.20 development build, still built from source. rocm/jax-training:maxtext moves to a ROCm 10.3 nightly (10.3.0a20261026) with JAX 0.12.0, a Transformer Engine 2.19 development build, and MaxText release/v26.9, and ships a copy of Primus again. Both images were built from the same Primus commit, db1a4160 on release/v26.9—see Primus source for v26.9.
Both families#
A convergence test for Megatron and MaxText.
tools/convergence_test/builds a dataset from a real corpus, lints the config for settings that silently spoil a convergence run (mock or synthetic data, forced load balancing, vocab mismatches), trains through the normalprimus-clipath, plots the loss, and gates it against a previous release’s baseline (#1229). It ships Llama-3.2-1B, Llama-2-7B, and Mixtral-8x7B recipes for both backends, plus a MaxText Llama-2-7B FP8 recipe for MI355X (#1261).The
tools/perfbatch runner is ready for unattended runs. Each run is bounded byMAX_RUN_SECONDS(default 1 h) andMAX_IDLE_SECONDS(default 20 min); busy GPUs and bad network interfaces are refused up front; failures are classified with the log line that shows them; every result records the image, host, and platform it came from; diffusion and DLRM benchmarks join the batch; and results go into an Excel report that can compare against a baseline (#1260, #1266, #1299). Two misreported throughput values are fixed: TorchTitan values printed with a thousands separator, and Megatron-Bridge’s post-training estimate. Note the behavior changes: single-node runs now time out, output files have fixed names, and the runners exit non-zero when any run fails.Release benchmark suites in the auto-benchmark menu. One choice detects the GPU and runs the whole Primus suite (Megatron, Megatron Bridge, TorchTitan) or JAX suite (MaxText, MaxDiffusion), recording the image digest, Primus commit, and submodule pins with every result (#1251).
A preset
HIP_VISIBLE_DEVICESis kept. The runner used to overwrite it with0..GPUS_PER_NODE-1, so on a shared node a job could land on another user’s GPU; it now keeps your selection and warns when its count differs fromGPUS_PER_NODE(#1237).
rocm/primus: Megatron-LM and TorchTitan#
Changes you might need to act on#
Mock-data runs use the model’s real vocabulary. Megatron mock data used to size every model for a 131,072-token vocabulary; each model config now sets its real
vocab_size, so embeddings, output layer, and logits have their true size. Mock-data throughput and memory are therefore not comparable with earlier releases (#1249).Megatron-only example material moved under
examples/megatron/. For exampleexamples/deepseek-v4/is nowexamples/megatron/models/deepseek-v4/, andexamples/moe_package/is nowexamples/megatron/guides/moe_package/;examples/mlperf/andexamples/hardware_configs/stay where they were. Update scripts that name the old paths (#1130).Some environment switches are now config keys, and the old variables do nothing.
PRIMUS_FUSED_QK_RMSNORM_ROPEis replaced byuse_turbo_fused_qk_rmsnorm_rope(#1247);PRIMUS_TURBO_CROSS_ENTROPYandPRIMUS_TURBO_CE_OVERWRITE_INPUTbyuse_turbo_cross_entropyandturbo_ce_overwrite_input(#1245); the MoE gather-quantization variables bymoe_permute_quant_fusion,moe_backward_permute_quant_fusion, andmoe_skip_identity_sort(#1241).Transformer Engine fused cross entropy reuses the logits buffer by default (
te_ce_overwrite_input: true), so after the loss backward the logits tensor holds its gradient. Set it tofalsewhen the same logits feed anything else in the step, such as a distillation or auxiliary loss, metrics, or hooks (#1287).TorchTitan uses a Triton fused AdamW by default (
optimizer.use_triton_fused_adam: true). Checkpoints stay interchangeable withtorch.optim.AdamW; set the flag tofalseto go back to it. Readingoptimizer.statedirectly between steps now shows stalestepvalues (#1233).Turbo grouped GEMM expects expandable segments. Primus warns when
use_turbo_grouped_gemmis on withoutexpandable_segments:True, and a runner hook stops the launch whenexpandable_segments:Trueis requested but not in effect on the PyTorch build (#1257).
New features#
GLM-5.3-Flash (
model_type: glm5_next): KDA linear attention, DSA sparse attention, and manifold-constrained hyper-connections with a 288-expert MoE, an MI355X BF16 recipe, and online loading of the released Hugging Face checkpoint for any TP / EP / PP layout (#1230). Packed sequences now run under context parallelism (#1265) and text-only checkpoint exports load (#1254). Training was validated on an 8-layer proxy; the full 45-layer model was checked forward-only against SGLang, and its DSA indexer is frozen.ZAYA1-8B FP8 recipes for MI300X, MI325X, and MI355X (
fp8: hybrid, tensorwise scaling, accurate from a cold start) and an MI325X BF16 recipe (#1269); the MI355X micro-batch sizes now fill that GPU’s memory (#1279).HunyuanWorld-Mirror post-training, stage 1 (geometry heads) and stage 2 (Gaussian head), with MI355X configs launched through
train posttrain. The upstream trainer is the newthird_party/HunyuanWorld-Mirror-rocmsubmodule; Primus applies ROCm fixes at runtime (#1242).MiniMax-M3 on MegaMoE. The fused MegaMoE expert layer accepts MiniMax-M3’s
swigluoaiactivation and matches the DeepEP path’s loss (#1243).Opt-in fusions: Primus-Turbo fused cross entropy for TP1 training (#1245); FlyDSL Q/K RMSNorm + RoPE and residual RMSNorm + MXFP4 QKV fusions for GPT-OSS (#1208), with the fused Q/K RMSNorm + RoPE now also covering head dimension 128 (#1247); and gradient reduce-scatter on the GPU’s copy engines (
MEGATRON_GRAD_REDUCE_BACKEND=rccl_sdma, which needs an RCCL build with CE ReduceScatter) (#1207).gfx1250 FP8 hybrid LoRA SFT proxies for Llama-2-70B, Qwen2.5-72B, and Qwen3-235B-A22B on one GPU (#1248).
Performance#
Optimizer and MoE kernel work, opt-in: gradient clipping and BF16 Adam moments fused into the Adam update (#1219), fused MXFP4 weight de-oscillation (#1222), BF16 router backward GEMMs (
moe_router_bwd_bf16, #1240), and MoE gathers folded into Primus-Turbo MXFP4 quantization (#1241).Qwen3-30B-A3B FP8 on MI355X moves to Primus-Turbo tensorwise FP8 with the Turbo grouped-MLP, activation, and permute fusions (#1247).
Tuned configs: MI355X GPT-OSS-20B, DeepSeek-V2-Lite, Llama 70B, Qwen, Mixtral, and TorchTitan Llama recipes (#1218, #1252, #1349); MI300X GPT-OSS-20B and Llama 70B (#1307, #1332, #1304); MI325X Llama 70B and ZAYA1-8B (#1318). Two of these change more than speed: MI355X DeepSeek-V2-Lite BF16 now uses MLA, the model’s real attention, and MI355X GPT-OSS-20B FP8 trains with global batch 96 instead of 80 (#1252).
Bug fixes#
Stale expert weights with the fused grouped MLP. With
turbo_fused_grouped_gemmandoverlap_param_gather, the fused op skipped the hooks that wait for the expert-weight all-gather, so whenever expert data parallelism exceeded one it read partly stale weights: no error and no NaN, just a drifting loss (#1252).Forced “even” routing under DeepEP. With DeepEP on, most routed slots received weight 0 and the MoE output collapsed toward the shared expert; the router now does the remap itself (#1243).
MoE recipes no longer force the DeepEP cheap fence. v26.8 recipes set
PRIMUS_TURBO_DEEPEP_DISABLE_CHEAP_FENCE=0, which could corrupt DeepEP dispatch-backward rows; the variable is removed from the 13 MI355X and MI325X recipes that set it (#1236).MoE models no longer hang on hosts with an amdgpu DRM interface older than 3.64. A runner hook detects such hosts and keeps HIP memory pools off virtual-memory mappings (#1302).
DeepSeek-V4 hyper-connections contract on the same axis as the inference kernels; the old convention drifted from SGLang by more with every layer (#1040).
TorchTitan: DeepSeek blocks are compiled inside their activation-checkpoint wrappers, so with full checkpointing the MoE block no longer runs eagerly (#1320); and the Primus-Turbo attention converter applies only when both
enable_primus_turboanduse_turbo_attentionare on, fixing aTypeErroron the first forward otherwise (#1234).Smaller fixes: the Turbo FP8 weight cache is stored in the operator’s padded layout (#1333), and
enable_turbo_attention_float8no longer fails on its first call (#1247).
rocm/jax-training:maxtext: MaxText#
The image ships Primus again.
/workspace/Primusis atdb1a4160, the commit the image was built from; arelease/v26.9checkout is still recommended—see Primus source for v26.9.MaxText moves to
release/v26.9(8d1d43c0), carrying the same ROCm patches as v26.8 on newer upstream. Upstream drops theretry_when_tokens_droppedconfig key, so remove it from any local config, and renames thecosmos3-*-reasonermodel configs toweaver-max/weaver-mini(#1316).XLA autotuning defaults to level 3. At Primus’s previous default, level 4, the autotuner’s correctness checks intermittently aborted compilation of the train step on GPU 0; level 3 keeps autotuning and drops only those checks. Set
XLA_GPU_AUTOTUNE_LEVEL=4to restore the old default (#1316).Transformer Engine’s per-call
return_max_logitwarning is silenced. It was printed on every backward attention call, per layer, per GPU, and per step; Primus now passes the same fallback value TE was using, so numerics are unchanged (#1316).MaxText runs on real data no longer stop before the first step. Grain data-loader workers read absl flags that Primus had left unparsed, and MaxText reported the error as a graceful stop: zero steps trained, exit status 0. Synthetic-data runs, including the benchmark configs, were not affected (#1229).
Recipe fixes: the MI300X Wan2.1-1.3B and MI355X Mixtral-8x7B FP8 out-of-memory errors are fixed, and FLUX.1-dev is retuned on MI300X and MI355X (#1338, #1349).
Primus Projection gains a MaxText/JAX backend (#1232). Its benchmark path has so far been verified on CPU only.
v26.9 (current)#
rocm/primus:v26.9#
Megatron-LM, TorchTitan, and Megatron Bridge backends.
Image ID |
|
Built |
2026-10-30 |
Size |
60.5 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.2.0a20261020 |
Python |
3.12.3 |
PyTorch |
2.16.0a0+rocm10.2.0a20261020 |
Transformer Engine |
2.20.0.dev0+023639b51 |
Flash Attention |
2.8.4 |
hipBLASLt |
1.5.0-cb261897 |
Triton |
3.9.0+gitfc8d31a5.rocm10.2.0a20261020 |
RCCL |
2.32.3 |
torchvision |
0.30.0a0+rocm10.2.0a20261020 |
torchaudio |
2.11.0a0+rocm10.2.0a20261020 |
APEX |
1.16.0a0+rocm10.3.0a20261029 |
AITER |
0.1.27 |
Primus-Turbo |
0.6.1.dev4 |
torchao |
0.15.0+gite9c7bead9 |
FBGEMM |
2026.10.30 |
mamba-ssm / causal-conv1d / grouped_gemm |
2.3.1 / 1.5.0.post8 / 1.1.4 |
transformers / datasets |
5.10.0 / 5.0.1 |
NumPy |
2.5.4 |
Both families run on ROCm nightlies this release, and not the same one.
rocm/primus:v26.9takes ROCm10.2.0a20261020fromnightly.repo.amd.com, where v26.8 used the 10.1.0 release fromstable.repo.amd.com; PyTorch, torchvision, and torchaudio are the matching pre-release builds from the nightly PyTorch index.rocm/jax-training:maxtext-v26.9takes ROCm10.3.0a20261026. hipBLASLt differs between the two images as a result; RCCL is 2.32.3 in both.
Transformer Engine is still built from source. It comes from
ROCm/TransformerEngineat023639b5(it reports2.20.0.dev0+023639b51). Flash Attention is unchanged: theROCm/flash-attentionfork at tagv2.8.4.1-cktile, reported as2.8.4.
The APEX row reads ahead of the image’s ROCm. The Dockerfile installs
apexunpinned from the nightly PyTorch index, which resolved to1.16.0a0+rocm10.3.0a20261029, a build against a ROCm 10.3 nightly, on this ROCm 10.2 image.
rocm/jax-training:maxtext-v26.9#
MaxText (JAX) backend.
Image ID |
|
Built |
2026-10-30 |
Size |
50.0 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.3.0a20261026 |
Python |
3.12.3 |
JAX / jaxlib |
0.12.0 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.12.0+rocm10.3.0a20261026 |
Transformer Engine |
2.19.0.dev0+rocm10.2.0a20261002.bfe94fb |
hipBLASLt |
1.5.0-565c4c74 |
RCCL |
2.32.3 |
Flax |
0.12.10 |
TensorFlow |
2.21.0 |
Optax / Orbax / Grain / tensorstore |
0.2.8 / 0.12.8 / 0.2.18 / 0.1.86 |
MaxText |
8d1d43c0 |
transformers / datasets |
4.57.3 / 4.8.5 |
NumPy |
2.5.4 |
rocm/jax-training:maxtext-v26.9contains Primus again. v26.8 shipped without it; this image has/workspace/Primusatdb1a4160, the commit both images were built from, next to MaxText at/workspace/maxtext(8d1d43c0) and MaxDiffusion at/workspace/maxdiffusion(68e06965). Arelease/v26.9checkout is still the recommended way to run it—see Primus source for v26.9.
Transformer Engine is a development build against an older nightly. TE
2.19.0.dev0comes from the ROCm frameworks staging index and is taggedrocm10.2.0a20261002, while the image’s ROCm and its JAX plugin pair are10.3.0a20261026.
Note:
transformersis 4.57.3 in the MaxText image because the published tag includes the MaxDiffusion stage, which pins transformers back to 4.x for Flax CLIP / T5. The build-time manifest records 5.17.0, captured before that stage runs; 4.57.3 is what you actually get (huggingface-hub0.36.2 andtokenizers0.22.2 move back with it). The PyTorch image is on 5.10.0.
Primus enables Shardy by default (
shardy: truein its MaxText module config). Leave it on. See the Shardy guide for JAX users.
Primus source for v26.9#
Use the release/v26.9 branch for both images:
git clone --recurse-submodules https://github.com/AMD-AGI/Primus.git
cd Primus
git checkout release/v26.9
git submodule update --init --recursive
Build commit |
|
Branch tip |
|
Megatron-LM |
|
TorchTitan |
|
Megatron Bridge |
|
MaxText |
|
Emerging-Optimizers |
|
HummingbirdXT |
|
HunyuanWorld-Mirror |
|
MaxText moved to release/v26.9 and HunyuanWorld-Mirror (third_party/HunyuanWorld-Mirror-rocm) is new since v26.8; Megatron-LM, TorchTitan, Megatron Bridge, Emerging-Optimizers, and HummingbirdXT are on the same commits.
Use a
release/v26.9checkout rather than anything baked into the images.
rocm/primus:v26.9androcm/jax-training:maxtext-v26.9were both built fromdb1a4160, and both carry that commit at/workspace/Primus.
release/v26.9has moved since the build: it is now at93dd9201(2026-10-31), which adds MI325X GPT-OSS-20B and ZAYA1-8B recipe tuning (#1355). The branch checkout includes it; the in-image copy does not.The MaxText image’s
/workspace/maxtext(8d1d43c0) matches the branch’sthird_party/maxtext.
Changes since v26.8#
rocm/primus:
Component |
v26.8 |
v26.9 |
|---|---|---|
ROCm |
10.1.0 |
10.2.0a20261020 |
PyTorch |
2.14.0+rocm10.1.0 |
2.16.0a0+rocm10.2.0a20261020 |
Transformer Engine |
2.17.1+130099ce4 |
2.20.0.dev0+023639b51 |
hipBLASLt |
1.4.1-39d8d603 |
1.5.0-cb261897 |
Triton |
3.8.0+git669b31ac.rocm10.1.0 |
3.9.0+gitfc8d31a5.rocm10.2.0a20261020 |
RCCL |
2.30.7 |
2.32.3 |
torchvision |
0.29.0a0+rocm10.1.0 |
0.30.0a0+rocm10.2.0a20261020 |
torchaudio |
2.11.0+rocm10.1.0 |
2.11.0a0+rocm10.2.0a20261020 |
APEX |
1.14.0+rocm10.1.0 |
1.16.0a0+rocm10.3.0a20261029 |
AITER |
0.1.22.post1 |
0.1.27 |
Primus-Turbo |
0.5.1.dev7 |
0.6.1.dev4 |
FBGEMM |
2026.10.8 |
2026.10.30 |
transformers / datasets |
5.10.0 / 3.6.0 |
5.10.0 / 5.0.1 |
NumPy |
2.5.3 |
2.5.4 |
Image size |
56.4 GB |
60.5 GB |
rocm/jax-training:maxtext:
Component |
v26.8 |
v26.9 |
|---|---|---|
ROCm |
10.2.0a20260923 |
10.3.0a20261026 |
JAX / jaxlib |
0.11.1 |
0.12.0 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.11.1+rocm10.2.0a20260923 |
0.12.0+rocm10.3.0a20261026 |
Transformer Engine |
2.18.0.dev0+rocm10.2.0a20260929.03afd8f |
2.19.0.dev0+rocm10.2.0a20261002.bfe94fb |
hipBLASLt |
1.5.0-9bb8b541 |
1.5.0-565c4c74 |
RCCL |
2.31.2 |
2.32.3 |
Flax |
0.12.9 |
0.12.10 |
Optax / Orbax / Grain / tensorstore |
0.2.8 / 0.12.6 / 0.2.18 / 0.1.85 |
0.2.8 / 0.12.8 / 0.2.18 / 0.1.86 |
MaxText |
07c240fa |
8d1d43c0 |
NumPy |
2.5.3 |
2.5.4 |
Image size |
43.9 GB |
50.0 GB |
v26.8#
Highlights for v26.8#
The two families split on ROCm. rocm/primus moves to the ROCm 10.1.0 release with PyTorch 2.14, and builds Transformer Engine and Flash Attention from source again. rocm/jax-training:maxtext moves to a ROCm 10.2 nightly (10.2.0a20260923) with JAX 0.11.1 and a Transformer Engine 2.18 development build, and no longer ships a copy of Primus: run it with a release/v26.8 checkout, which primus-cli container mounts for you. Bare-metal installs changed accordingly — see Bare-metal installation and the JAX guide.
Both families#
The
examples/run_*launchers are retired in favour of./primus-cli(#999). Callers that relied on theEXP/NNODES/DATA_PATHcontract can userunner/helpers/launch/slurm_pretrain.sh. The Kubernetes submission client (examples/run_k8s_pretrain.sh) is removed, and the dataset-split seed flag is renamed--split_seedso Megatron’s--seedstays the training RNG.Scientific-notation CLI overrides are parsed as numbers.
--lr 1e-5and similar used to reach the config as a string (#1112).amd-smiis supported alongside the deprecatedrocm-smi(#1134).Primus Projection gains a TorchTitan backend (#1202).
New tooling: a non-interactive batch benchmark runner and result extractor for every backend, in single-node and Slurm modes (
tools/perf, #1173).
rocm/primus: Megatron-LM and TorchTitan#
Changes you might need to act on#
Hybrid configs are named
zebra_*again. v26.7 shipped them ashylo_*; v26.8 restores the Zebra-Llama name (for examplehylo_llama_mamba_8B_BF16-pretrain.yamlis nowzebra_llama_mamba_8B_BF16-pretrain.yaml, and theHyloLlama*classes areZebraLlama*). Update any local config or script that names the old files (#1167).
New features#
ZAYA1-8B Megatron pretraining, with MI300X and MI355X mock-data configs. This ships on
release/v26.8from #1199, which is not yet merged tomain.MiniMax-M3 (text tower) with MiniMax Sparse Attention, in a reference PyTorch backend and a gfx950 FlyDSL backend. On an 8-layer proxy on 8× MI355X the FlyDSL backend runs at 380 TFLOP/s/GPU, twice as fast as the reference backend with an identical loss curve (#1197).
SDMA parameter gather for the Megatron distributed optimizer (#1128), enabled by default in the 1×8 MI355X GPT-OSS MLPerf recipe (#1168).
Fused grouped GEMM.
turbo_fused_grouped_gemmnow replaces the fc1 → GLU → fc2 chain with a single Primus-Turbo FP8/FP4 grouped-MLP call that also owns WGRAD (#1165).Fused MXFP4 weight-gradient accumulation for non-preshuffled MXFP4 (#1174).
qk_clip(MuonClip) for hybrid models and the distributed optimizer (#1164), with the per-head max attention logit now exposed on the FLA fused attention path (#1162).GPT-OSS-20B dense QKVO GEMMs run on Turbo FlyDSL in both the FP8 and MXFP4 recipes (#1127), on top of BF16 de-oscillation snapshots and a simplified 20B recipe (#1070).
Llama-3.1-8B FP4 building blocks — fused FP4 dense MLP, residual RMSNorm and skip-y — upstreamed from MLPerf, default-off (#1156).
New recipes: Qwen3-30B-A3B and Qwen2.5-72B MXFP4 pretraining on MI355X (#1119), Llama-3.1-8B BF16 LoRA-SFT on MI355X (#1113), and native LoRA-SFT proxies for gfx1250 (#1155).
SpecForge backend for speculative-decoding draft training, offline (#1139) and online with Mooncake + SGLang (#1191). It runs on its own ROCm runtime image; see the SpecForge guide.
Performance#
Fewer gradient-buffer clears and an isolated gradient reduce-scatter. Slices that Primus-Turbo’s expert WGRAD fully overwrites are no longer zeroed first, and the reduce-scatter runs on a dedicated RCCL group (#1186).
Cheaper MXFP4 de-oscillation, now quantized on the same scale grid as the forward pass (#1184).
Tuned configs: MI355X pretraining (#1218), and MI325X 70B/72B and MoE recipes (#1227).
Bug fixes#
Silent gradient corruption from a Triton buffer-store miscompile. Affected kernels are now detected and recompiled with buffer ops disabled, and TorchTitan restores eager precision semantics under
torch.compile(#962).DeepSeek-V4 reported TFLOPs 3.63× too high at the V4-Flash shape. Reporting only; training math is unchanged (#1158).
DeepSeek-V4 MegaMoE ignored
turbo_mega_moe_precision, somxfp8runs silently stayed on BF16 experts (#1196).TorchTitan GPT-OSS router bias is initialized after meta-device materialization, fixing non-finite router scores (#1183), and TorchTitan DeepSeek
torch.compileis bounded at the routed experts (#1216, onrelease/v26.8).Zebra-Llama KDA 1B no longer NaNs at iteration 1 on MI355X (#1215), and Zebra-Llama-Mamba 3B no longer OOMs on MI300X (#1209).
MI350X gets its own GPU env file, so
PRIMUS_GPU_MODEL=MI350Xno longer silently skips the gfx950 WarpSpeed setting and NaNs (#1178); the MXFP4 Transformer Engine settings move into the recipes’env:blocks soprimus-clilaunches pick them up (#1179); andprimus-clinow applies the FLA Triton autotune patch that prevents hybrid-model hangs (#1181). All three were also backported torelease/v26.7.Smaller fixes: the Flux validation loss is no longer rescaled in place (#1079), and Transformer Engine’s
requantize_datano longer raisesUnboundLocalError(#1108).
rocm/jax-training:maxtext: MaxText#
The image ships no Primus. Use
release/v26.8— see Primus source for v26.8.MaxText moves to
release/v26.8(07c240fa, about 290 upstream commits). Upstream removed the Linen modules and with them thepure_nnx_decoderconfig key, which MaxText now rejects; the three MI325Xnanoo_fp8configs that still set it are fixed. Drop the key from any local config (#1228).Three performance regressions on JAX 0.11.1 fixed with Primus-managed defaults: CUB radix sort is disabled for MoE top-k (about 0.8 s/step on DeepSeek-V2-16B), stream priority is honoured again so collectives overlap compute, and dynamic-slice fusion is disabled (about 10% on Llama-2-7B FP8). They need a
release/v26.8checkout, and can be overridden per config (#1228).XLA_FLAGSprecedence fixed. A config’s ownXLA_FLAGSnow beats the managed defaults instead of being silently overridden, andXLA_FLAGS_APPENDadds flags without replacing them (#1054).
rocm/primus:v26.8#
Megatron-LM, TorchTitan, and Megatron Bridge backends.
Image ID |
|
Built |
2026-10-08 |
Size |
56.4 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.1.0 |
Python |
3.12.3 |
PyTorch |
2.14.0+rocm10.1.0 |
Transformer Engine |
2.17.1+130099ce4 |
Flash Attention |
2.8.4 |
hipBLASLt |
1.4.1-39d8d603 |
Triton |
3.8.0+git669b31ac.rocm10.1.0 |
RCCL |
2.30.7 |
torchvision |
0.29.0a0+rocm10.1.0 |
torchaudio |
2.11.0+rocm10.1.0 |
APEX |
1.14.0+rocm10.1.0 |
AITER |
0.1.22.post1 |
Primus-Turbo |
0.5.1.dev7 |
torchao |
0.15.0+gite9c7bead9 |
FBGEMM |
2026.10.8 |
mamba-ssm / causal-conv1d / grouped_gemm |
2.3.1 / 1.5.0.post8 / 1.1.4 |
transformers / datasets |
5.10.0 / 3.6.0 |
NumPy |
2.5.3 |
rocm/jax-training:maxtext-v26.8#
MaxText (JAX) backend.
Image ID |
|
Built |
2026-10-01 |
Size |
43.9 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.2.0a20260923 |
Python |
3.12.3 |
JAX / jaxlib |
0.11.1 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.11.1+rocm10.2.0a20260923 |
Transformer Engine |
2.18.0.dev0+rocm10.2.0a20260929.03afd8f |
hipBLASLt |
1.5.0-9bb8b541 |
RCCL |
2.31.2 |
Flax |
0.12.9 |
TensorFlow |
2.21.0 |
Optax / Orbax / Grain / tensorstore |
0.2.8 / 0.12.6 / 0.2.18 / 0.1.85 |
MaxText |
07c240fa |
transformers / datasets |
4.57.3 / 4.8.5 |
NumPy |
2.5.3 |
The two families are on different ROCm builds this release.
rocm/primus:v26.8uses the ROCm 10.1.0 release fromstable.repo.amd.com.rocm/jax-training:maxtext-v26.8uses a ROCm 10.2 nightly,10.2.0a20260923fromnightly.repo.amd.com, and its JAX plugin pair and Transformer Engine are built against that nightly. hipBLASLt and RCCL differ between the two images as a result.
rocm/primusbuilds Transformer Engine and Flash Attention from source again. Transformer Engine comes fromROCm/TransformerEngineat130099ce(it reports2.17.1+130099ce4), replacing the three wheel distributions v26.7 installed; CK fused attention is JIT-compiled at run time from the aiter tree kept at/workspace/deps/te-aiter. Flash Attention is back on theROCm/flash-attentionfork (tagv2.8.4.1-cktile, reported as2.8.4) instead of PyPIflash-attn 2.8.1. The image also turns on the HIP device-queue path (GPU_USE_DEVICE_QUEUE=1,DEBUG_CLR_AQL_DEV_QUEUE=1).
rocm/jax-training:maxtext-v26.8no longer contains Primus. There is no/workspace/Primus; run the image with a Primus checkout mounted, whichprimus-cli containerdoes for you. See Primus source for v26.8. The MaxText checkout at/workspace/maxtext(07c240fa) is still in the image.
Note:
transformersis 4.57.3 in the MaxText image because the published tag includes the MaxDiffusion stage, which pins transformers back to 4.x for Flax CLIP / T5. The build-time manifest records 5.16.1, captured before that stage runs; 4.57.3 is what you actually get. The PyTorch image is on 5.10.0.
JAX 0.11.1 uses Shardy, and Primus enables it by default (
shardy: truein its MaxText module config). Leave it on. See the Shardy guide for JAX users.
Primus source for v26.8#
Use the release/v26.8 branch for both images:
git clone --recurse-submodules https://github.com/AMD-AGI/Primus.git
cd Primus
git checkout release/v26.8
git submodule update --init --recursive
Branch tip |
|
Megatron-LM |
|
TorchTitan |
|
Megatron Bridge |
|
MaxText |
|
Emerging-Optimizers |
|
HummingbirdXT |
|
Only the MaxText pin moved since v26.7; Megatron-LM, TorchTitan and Megatron Bridge are on the same commits.
Use a
release/v26.8checkout rather than anything baked into the images.
rocm/primus:v26.8was built fromf487a934, which is the currentrelease/v26.8tip, so the in-image/workspace/Primuscurrently matches, including the MI325X tuning for the 70B/72B and MoE recipes (#1227). Cloning the branch still keeps you current if later commits land on it.
rocm/jax-training:maxtext-v26.8ships no Primus at all.release/v26.8carries the MaxText environment defaults that restore performance on JAX 0.11.1 (#1228); an older checkout runs without them. Itsthird_party/maxtextmatches the image’s/workspace/maxtext.
Changes since v26.7#
rocm/primus:
Component |
v26.7 |
v26.8 |
|---|---|---|
ROCm |
10.0.0 |
10.1.0 |
PyTorch |
2.12.0+rocm10.0.0 |
2.14.0+rocm10.1.0 |
Transformer Engine |
2.17.0+rocm10.0.0 |
2.17.1+130099ce4 |
Flash Attention |
2.8.1 |
2.8.4 |
hipBLASLt |
1.4.1-8d1ae90e |
1.4.1-39d8d603 |
Triton |
3.8.0+git4cff872c.rocm10.0.0 |
3.8.0+git669b31ac.rocm10.1.0 |
RCCL |
2.30.4 |
2.30.7 |
torchvision |
0.27.0+rocm10.0.0 |
0.29.0a0+rocm10.1.0 |
torchaudio |
2.11.0+rocm10.0.0 |
2.11.0+rocm10.1.0 |
APEX |
1.13.0+rocm10.0.0 |
1.14.0+rocm10.1.0 |
AITER |
0.1.14.post1 |
0.1.22.post1 |
Primus-Turbo |
0.4.1.dev33 |
0.5.1.dev7 |
FBGEMM |
2026.9.9 |
2026.10.8 |
Image size |
53.8 GB |
56.4 GB |
rocm/jax-training:maxtext:
Component |
v26.7 |
v26.8 |
|---|---|---|
ROCm |
10.0.0 |
10.2.0a20260923 |
JAX / jaxlib |
0.11.0 |
0.11.1 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.11.0+rocm10.0.0 |
0.11.1+rocm10.2.0a20260923 |
Transformer Engine |
2.17.0+rocm10.0.0 |
2.18.0.dev0+rocm10.2.0a20260929.03afd8f |
hipBLASLt |
1.4.1-8d1ae90e |
1.5.0-9bb8b541 |
RCCL |
2.30.4 |
2.31.2 |
Flax |
0.12.8 |
0.12.9 |
Optax / Orbax / Grain / tensorstore |
0.2.8 / 0.12.4 / 0.2.18 / 0.1.85 |
0.2.8 / 0.12.6 / 0.2.18 / 0.1.85 |
MaxText |
b3c53763 |
07c240fa |
Image size |
43.7 GB |
43.9 GB |
v26.7#
Highlights for v26.7#
ROCm 10.0.0. Both image families move off the ROCm 7.x line. This is the defining change of the release and it reaches everything: PyTorch, Transformer Engine, Triton, torchvision/torchaudio and APEX are all rebuilt against it, and the JAX plugin pair is renamed jax-rocm10-pjrt / jax-rocm10-plugin. If you install bare metal, note that the wheel indexes moved too — see Bare-metal installation.
Beyond that, the backend work in this release is weighted towards the PyTorch family; MaxText picks up the ROCm 10 stack plus config tuning rather than new capability.
Both families#
gfx1250 multi-GPU enablement. Primus recognises gfx1250 by ISA rather than by MI number and ships an arch env file for it, so
primus-cliapplies real settings instead of falling through toDetected GPU model: unknown(#1043).primus-clihonours an explicit flag whose value happens to equal the parser default (#1002).*_SOCKET_IFNAMEno longer falls back to an IP address (#1063).The
primuswheel builds again. Themlperf-logging/mlperf-commonVCS pins moved to an optionalmlperfextra, because Hatchling 1.32 rejects PEP 508 direct references inproject.dependencies(#1061).
rocm/primus — Megatron-LM and TorchTitan#
New features#
DeepSeek-V4 on gfx942 at long context. V4 upstream targeted gfx950 and in practice only ran at
seq_length=4096; it now trains on CDNA3 with context parallelism at 128k, full model (#1047).Packed-sequence (THD) SFT for DeepSeek-V4 — many samples per window delimited by
cu_seqlens, with attention isolated so no query sees another sample; full model at 4k and 128k across three nodes (#1062).DLRM-v4 (TorchRec/HSTU) projection workload with first-principles MI350X calibration (#1059).
MLPerf Llama 3.1 8B launcher and refreshed MI355X benchmark configs (#1012).
Performance#
Fused SwiGLU + fc2 (opt-in, via FLA
swiglu_linear) removes one FFN-wide saved tensor per MLP layer by recomputing the activation in the backward pass (#1051).Fused cross-entropy no longer copies the full logits tensor (#1049).
DeepSeek-V4 indexer distillation loss is fused and enabled (#992).
Tuned configs: GDN/KDA 1B on MI355X for higher occupancy (#1080), and MI355X Llama 3.1 8B / GPT-OSS 20B defaults (#1045).
Bug fixes#
Weight gradients were dropped after the first microbatch on Turbo’s non-fused
_bridge_weight_gradpath, which gated accumulation ongrad_added_to_main_grad. Any run using gradient accumulation on that path was training on partial gradients (#1046).Out-of-bounds top-k index in the V4 DSA forward kernel is now bounded (#1044).
fused_softcapstays finite on saturation-range logits (#1057).KDA fused
in_projis padded past the hipBLASLt bf16 dead zone (#1050).Pipeline warmup is clamped for short batches (#1032).
TorchTitan Turbo grouped-GEMM config renamed (#1041). Update any local config that sets the old key.
rocm/jax-training:maxtext — MaxText#
No new MaxText capability this release; the change is the ROCm 10.0.0 stack itself, plus config tuning:
rocm/primus:v26.7#
Megatron-LM, TorchTitan, and Megatron Bridge backends.
Image ID |
|
Built |
2026-09-09 |
Size |
53.8 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.0.0 |
Python |
3.12.3 |
PyTorch |
2.12.0+rocm10.0.0 |
Transformer Engine |
2.17.0+rocm10.0.0 |
Flash Attention |
2.8.1 |
hipBLASLt |
1.4.1-8d1ae90e |
Triton |
3.8.0+git4cff872c.rocm10.0.0 |
RCCL |
2.30.4 |
torchvision |
0.27.0+rocm10.0.0 |
torchaudio |
2.11.0+rocm10.0.0 |
APEX |
1.13.0+rocm10.0.0 |
AITER |
0.1.14.post1 |
Primus-Turbo |
0.4.1.dev33 |
torchao |
0.15.0+gite9c7bead9 |
FBGEMM |
2026.9.9 |
mamba-ssm / causal-conv1d / grouped_gemm |
2.3.1 / 1.5.0.post8 / 1.1.4 |
transformers / datasets |
5.10.0 / 3.6.0 |
NumPy |
2.5.3 |
rocm/jax-training:maxtext-v26.7#
MaxText (JAX) backend.
Image ID |
|
Built |
2026-09-09 |
Size |
43.7 GB |
Manifest |
|
Dockerfile |
Software component |
Version |
|---|---|
ROCm |
10.0.0 |
Python |
3.12.3 |
JAX / jaxlib |
0.11.0 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.11.0+rocm10.0.0 |
Transformer Engine |
2.17.0+rocm10.0.0 |
hipBLASLt |
1.4.1-8d1ae90e |
RCCL |
2.30.4 |
Flax |
0.12.8 |
TensorFlow |
2.21.0 |
Optax / Orbax / Grain / tensorstore |
0.2.8 / 0.12.4 / 0.2.18 / 0.1.85 |
MaxText |
b3c53763 |
transformers / datasets |
4.57.3 / 4.8.5 |
NumPy |
2.5.3 |
ROCm 10.0.0 changes where the wheels come from. Both families now install ROCm core from
stable.repo.amd.com/rocm/core/whl-next, with PyTorch, Transformer Engine and the JAX plugin on sibling indexes. Therocm.nightlies.amd.com/whl-multi-archindex used through v26.6 does not carry these wheels. Transformer Engine also ships as three distributions (transformer_engine,transformer_engine_rocm10, and the torch or jax flavour) where v26.6 had two.
RCCL is no longer rebuilt. v26.6 overrode the SDK’s RCCL with a
rocm-systemsbuild; v26.7 uses RCCL 2.30.4 as shipped in the ROCm 10.0.0 SDK. The version is unchanged, the provenance is not.
Two rows in the delta table need reading carefully. APEX appears to go backwards, from
1.15.0a0+rocm10.1.0a20260822to1.13.0+rocm10.0.0: v26.6 pulled arocm10.1nightly onto a ROCm 7.15 base, whereas v26.7 uses the APEX built against its own ROCm 10.0.0. And the JAX plugin row is labelled with the v26.7 spelling on both sides — the v26.6 value0.11.0.post1shipped asjax-rocm7-pjrt/jax-rocm7-plugin, before the rename.
Note:
transformersis 4.57.3 in the MaxText image because the published tag includes the MaxDiffusion stage, which pins transformers back to 4.x for Flax CLIP / T5. The build-time manifest records 5.14.1, captured before that stage runs; 4.57.3 is what you actually get. The PyTorch image is on 5.10.0.
JAX 0.11.0 still requires Shardy. Set
shardy=Trueduring the training run. See the Shardy guide for JAX users.
Primus source for v26.7#
Use the release/v26.7 branch for both images:
git clone --recurse-submodules https://github.com/AMD-AGI/Primus.git
cd Primus
git checkout release/v26.7
git submodule update --init --recursive
Branch tip |
|
Megatron-LM |
|
TorchTitan |
|
Megatron Bridge |
|
MaxText |
|
Emerging-Optimizers |
|
HummingbirdXT |
|
Prefer a
release/v26.7checkout over the Primus copy baked into the images.
rocm/primus:v26.7was built from2631e68d, which is the currentrelease/v26.7tip, so the in-image/workspace/Primuscurrently matches. Cloning the branch still keeps you current if later commits land on it.
rocm/jax-training:maxtext-v26.7was built frommainate7968675(2026-09-09), because its Dockerfile pinsPRIMUS_BRANCH=mainrather than a commit. Userelease/v26.7anyway, so you get the Primus recipes the release was validated against rather than whatevermainheld on the build day. Its bundledthird_party/maxtextmatches/workspace/maxtext(b3c53763).
Changes since v26.6#
rocm/primus:
Component |
v26.6 |
v26.7 |
|---|---|---|
ROCm |
7.15.0a20260727 |
10.0.0 |
PyTorch |
2.12.0+rocm7.15.0a20260727 |
2.12.0+rocm10.0.0 |
Transformer Engine |
2.17.0+rocm7.15.0a20260727.e028a6c |
2.17.0+rocm10.0.0 |
hipBLASLt |
1.4.1-bbb68174 |
1.4.1-8d1ae90e |
Triton |
3.8.0+git4cff872c.rocm7.15.0a20260727 |
3.8.0+git4cff872c.rocm10.0.0 |
torchvision |
0.27.0+rocm7.15.0a20260727 |
0.27.0+rocm10.0.0 |
torchaudio |
2.11.0+rocm7.15.0a20260728 |
2.11.0+rocm10.0.0 |
APEX |
1.15.0a0+rocm10.1.0a20260822 |
1.13.0+rocm10.0.0 |
Primus-Turbo |
0.4.1.dev26 |
0.4.1.dev33 |
FBGEMM |
2026.8.25 |
2026.9.9 |
transformers / datasets |
5.5.0 / 3.6.0 |
5.10.0 / 3.6.0 |
NumPy |
2.5.2 |
2.5.3 |
Image size |
54.0 GB |
53.8 GB |
rocm/jax-training:maxtext:
Component |
v26.6 |
v26.7 |
|---|---|---|
ROCm |
7.14.0 |
10.0.0 |
jax-rocm10-pjrt / jax-rocm10-plugin |
0.11.0.post1 |
0.11.0+rocm10.0.0 |
Transformer Engine |
2.17.0+rocm7.14.0.50a84ad |
2.17.0+rocm10.0.0 |
hipBLASLt |
1.4.1-cd957402 |
1.4.1-8d1ae90e |
MaxText |
b47d74bf |
b3c53763 |
NumPy |
2.5.2 |
2.5.3 |
Image size |
42.6 GB |
43.7 GB |
Earlier releases#
Headline versions only. Read the in-image manifest for the full stack of any image below — except v26.2 and v26.1, which predate the manifest (use pip list there).
The three MaxText v26.3.x images ship an identical software stack; they differ only in MaxText and Primus content.
Image |
Python |
ROCm |
Framework |
Transformer Engine |
RCCL |
|---|---|---|---|---|---|
|
3.12.3 |
7.15.0 |
PyTorch 2.12.0+rocm7.15.0a20260727 |
2.17.0+rocm7.15.0a20260727.e028a6c |
2.30.4 |
|
3.12.3 |
7.15.0 |
PyTorch 2.12.0+rocm7.15.0a20260720 |
2.15.0.dev0+rocm7.15.0a20260716.a07e607 |
2.30.4 |
|
3.12.3 |
7.14.0 |
PyTorch 2.12.0+rocm7.14.0a20260608 |
2.14.0.dev0+e6ede467 |
2.29.7 |
|
3.12.3 |
7.2.1 |
PyTorch 2.10.0+git94c6e04 |
2.12.0.dev0+40434cf6 |
2.27.7 |
|
3.12.3 |
7.2.0 |
PyTorch 2.10.0a0+git449b176 |
2.8.0.dev0+51f74fa7 |
2.27.7 |
|
3.10.12 |
7.1.0 |
PyTorch 2.10.0.dev20251112+rocm7.1 |
2.6.0.dev0+f141f34b |
2.27.7 |
|
3.12.3 |
7.14.0 |
JAX 0.11.0 |
2.17.0+rocm7.14.0.50a84ad |
2.30.4 |
|
3.12.3 |
7.14.0 |
JAX 0.10.0 |
2.15.0.dev0+rocm7.15.0a20260707.72d01a0 |
2.30.4 |
|
3.12.3 |
7.14.0 |
JAX 0.9.1 |
2.12.0.dev0+635d7c08 |
2.28.9 |
|
3.12.3 |
7.2.1 |
JAX 0.8.2 |
2.8.0.dev0+9b312832 |
2.27.7 |
|
3.12.3 |
7.2.1 |
JAX 0.8.2 |
2.8.0.dev0+9b312832 |
2.27.7 |
|
3.12.3 |
7.2.1 |
JAX 0.8.2 |
2.8.0.dev0+9b312832 |
2.27.7 |
|
3.12.3 |
7.1.1 |
JAX 0.8.2 |
2.8.0.dev0+aec00a7f |
2.27.7 |
Verifying the stack in an image#
Images from v26.3 onward ship a manifest at /workspace/.manifest/ recording exactly what was installed at build time:
File |
Contents |
|---|---|
|
full |
|
full |
|
every environment variable baked into the image |
|
the build’s commit tag |
|
the Dockerfile the image was built from (named |
docker run --rm --entrypoint bash rocm/primus:v26.9 -c 'cat /workspace/.manifest/requirements.txt'
Native library versions are not pip packages; read them from the ROCm headers:
docker run --rm --entrypoint bash rocm/primus:v26.9 -c '
grep -E "HIPBLASLT_VERSION_(MAJOR|MINOR|PATCH|TWEAK)" $(find $ROCM_PATH /opt/rocm -name hipblaslt-version.h 2>/dev/null | head -1)
grep -E "define NCCL_(MAJOR|MINOR|PATCH)" $(find $ROCM_PATH /opt/rocm -name rccl.h 2>/dev/null | head -1)'
Images older than v26.3 predate the manifest; query them with pip list directly.