Skip to main content

strix-halo-jax

tests License: Apache-2.0 gfx1151

Run JAX and MuJoCo MJX (robotics simulation, e.g. MuJoCo Playground) on the GPU of an AMD Ryzen AI MAX ("Strix Halo", Ryzen AI MAX+ 395, Radeon 8060S, gfx1151) from pip wheels — no system ROCm install — and jaxcheck, a hang-safe check that tells you which wheel set works on your machine: GPU devices, matmul, scatters, MJX reset and step, each in its own process.

Useful if you searched for "Backend 'rocm' is not in the list of known backends", JAX ROCm gfx1151, MJX on AMD, HSA_STATUS_ERROR_MEMORY_APERTURE_VIOLATION or Strix Halo machine learning.

Demo

jaxcheck on a Ryzen AI MAX+ 395 with the recipe below — every stage passes, including the MuJoCo MJX ones (evidence):

$ jaxcheck --label "jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars"
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars devices       ok           3.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars matmul        ok          15.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars scatter_set   ok           3.5s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars scatter_add   ok           4.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars scatter_2d    ok           4.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars scatter_vmap  ok           4.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars scatter_oob   ok           4.0s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars mjx_reset     ok          49.1s
jax-0.11.1 PyPI plugin + rocm[libraries] 7.13.0, no env vars mjx_step      ok         101.6s

A broken set shows up in seconds as fault or fail, instead of a process that hangs for half an hour. What it is for — a humanoid walking policy trained on this machine with MuJoCo Playground (humanoid-companion):

A ROBOTIS OP3 humanoid walking forward at 0.5 m/s in MuJoCo

That policy was trained on the CPU (103 M steps in 96 min, 16 JAX CPU devices) while the GPU path was broken; with this recipe the same environment steps at up to 30,787 steps/s on the GPU (table below).

The working recipe (11 September 2026)

Linux x86_64, Python 3.12, uv:

uv venv -p 3.12 && source .venv/bin/activate
uv pip install --index https://repo.amd.com/rocm/whl/gfx1151/ --index-strategy unsafe-best-match \
  "jax==0.11.1" "jaxlib==0.11.1" "jax-rocm7-plugin==0.11.1" "jax-rocm7-pjrt==0.11.1" "rocm[libraries]==7.13.0"
python -c "import jax; print(jax.devices())"        # [RocmDevice(id=0)]

or, locked, from a clone: uv sync --extra gfx1151 --extra mjx. Your user must be in the render group (/dev/kfd is root:render 0660): sudo usermod -aG render,video $USER, then log in again.

That is all: the 0.11.1 plugin (from PyPI) finds AMD's rocm-sdk library wheels by itself. No LD_LIBRARY_PATH, no HSA_OVERRIDE_GFX_VERSION.

If the GPU is shared (with a local LLM, say), set XLA_PYTHON_CLIENT_PREALLOCATE=false, or JAX takes 75 % of device memory at start-up.

Compatibility matrix

Each cell from python jaxcheck.py --label … (evidence) on a Ryzen AI MAX+ 395 (64 GiB BIOS carve-out as VRAM), Ubuntu 24.04, kernel 7.0, no system ROCm. MJX stages: mujoco_playground 0.2.0 Op3Joystick, impl="jax", 16 environments.

Wheel set devices matmul scatters MJX reset MJX step
JAX 0.11.1: plugin + PJRT 0.11.1 from PyPI, rocm[libraries]==7.13.0 (AMD gfx1151 index), no env vars ok ok ok ok ok
JAX 0.9.2: TheRock nightly 0.9.2+rocm7.14.0a20260608 + rocm[libraries] of the same date, with rocm-run ok ok ok fault, then the process hangs not reached
JAX 0.9.1: AMD gfx1151 release index 0.9.1+rocm7.13.0 + rocm[libraries,devel]==7.13.0 plugin cannot load: librocm_sysdeps_hwloc.so.5, librocm_sysdeps_pciaccess.so.0 not in any 7.13.0 SDK wheel (TheRock#8163)

The 0.9.x fault (HSA_STATUS_ERROR_MEMORY_APERTURE_VIOLATION in input_scatter_fusion_5, a large fused scatter built from MJX kinematics) matches the fused-kernel bug fixed in XLA for JAX ≥ 0.10.0 (rocm-jax#453); no XLA flag avoided it on 0.9.2. Details: rocm-jax#132.

Please add your row (another kernel, a system ROCm install, a newer index): CONTRIBUTING.md.

MJX throughput on this chip

Raw vmap(env.step) of Op3Joystick, 100 steps after compile, JAX 0.11.1, GPU shared with a resident 52 GB LLM:

environments GPU (env steps/s) one CPU device (env steps/s)
1,024 7,744 4,780
4,096 28,612 6,376
8,192 30,787 3,605

For comparison, Brax PPO training of the same env on the CPU split into 16 JAX devices (--xla_force_host_platform_device_count=16) ran at 21,600 steps/s including the learning updates — so on this APU the GPU is a solid but not dramatic gain, and it competes with other GPU users for memory. First compiles take 40–170 s per batch shape; a persistent compilation cache helps.

jaxcheck: which set works, without hanging

Run it inside the environment you want to test (it checks the JAX that is installed there):

pip install strix-halo-jax     # jaxcheck only (standard library): it tests the JAX already installed
jaxcheck --label "my set"                                   # devices, matmul, scatters, MJX reset/step
jaxcheck --label "my set" --stages matmul scatter_set
XLA_FLAGS=--xla_… jaxcheck --label "with a flag"

or, with nothing installed yet, the tested set and the check in one go (verified with the wheel on the machine above):

uvx --python 3.12 --index https://repo.amd.com/rocm/whl/gfx1151/ --index-strategy unsafe-best-match \
    --from "strix-halo-jax[gfx1151,mjx]" jaxcheck --label "strix-halo-jax 0.1.0 set"

From a clone, python jaxcheck.py … works the same.

Each stage runs in its own process with its output streamed to results/<label>-<stage>.log, and is recorded as ok, fail (non-zero exit; last error line kept), fault (a GPU fault signature was printed — the process is killed at once, because after a queue abort ROCm processes can hang instead of exiting) or timeout. Results go to results/results.jsonl and a table in results/README.md. The MJX stages need pip install playground.

Traps we hit (so you don't)

Symptom Cause Fix
Backend 'rocm' is not in the list of known backends, rocm_plugin_extension not found a 0.9.x plugin cannot find the ROCm libraries (no system ROCm) use the 0.11.1 plugin from PyPI; for 0.9.x, ./rocm-run sets the paths
FAILED_PRECONDITION: No visible GPU devices; rocminfo: not member of "render" group /dev/kfd permission sudo usermod -aG render,video $USER, log in again
a benchmark "compiles" for 25 minutes, one thread at 100 % a GPU fault followed by a hang (0.9.x + MJX), not a compile upgrade to JAX ≥ 0.10; use jaxcheck.py to see fault in seconds
rocblas_gemm_ex failed with: rocblas_status_internal_error in code that used to work a persistent compilation cache shared between JAX versions ("PjRt-IFRT does not track XLA executable versions") one cache per jaxlib/plugin build (rocm-run does this)
Unknown flag in XLA_FLAGS: --xla_gpu_… the flag exists in the plugin's strings but jaxlib does not accept it drop it; jaxcheck.py reports the line
out-of-memory next to a local LLM the BIOS gives the iGPU a fixed carve-out (64 GiB here) shared by everything on the GPU preallocation off; or set the BIOS UMA frame buffer to its minimum so the GPU uses GTT from the full RAM

Contributors

Licence and disclaimer

Apache-2.0. Measurements from one machine on one day; your firmware, kernel and wheel versions may differ — the matrix says exactly what was tested. Not affiliated with AMD or Google DeepMind. A developer tool, provided as is; not a medical device and not for clinical use.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strix_halo_jax-0.1.0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strix_halo_jax-0.1.0-py3-none-any.whl (12.6 kB view details)

Uploaded Python 3

File details

Details for the file strix_halo_jax-0.1.0.tar.gz.

File metadata

  • Download URL: strix_halo_jax-0.1.0.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for strix_halo_jax-0.1.0.tar.gz
Algorithm Hash digest
SHA256 688f5e5770310bb3b9fa49029a7f4cd3b03a7fcdb59d339276317b754ec7a803
MD5 bfdb76087ee133296693a9189fb955d4
BLAKE2b-256 f959953666c021882128ce0f5f02e99cd08480d7f5319912a8a91d199c0cb85d

See more details on using hashes here.

File details

Details for the file strix_halo_jax-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: strix_halo_jax-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for strix_halo_jax-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a58e101fd55701a3f04849d3cfd54f04cde89b7674269fccd16e29f7e95242d4
MD5 132fc063bbdd925248e873b242dd0bd0
BLAKE2b-256 a9ef2fec006f75f0a108ea2d586df5b0e89b707984eacd04fd1ac584cde4dda5

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.1

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page