nnx-ppo
Experimental implementation of Proximal Policy Optimization in JAX, with first-class support for recurrent/stateful networks. Networks are built with flax.nnx; environments follow the MuJoCo Playground API.
Status: experimental — the API may change without notice.
Highlights
- Stateful modules. Recurrent layers, delayed connections, and noisy / variational populations are all first-class citizens. Carry state is threaded through rollout collection and multi-epoch loss replay, and is reset correctly when the environment resets — something other JAX RL libraries (e.g. Brax) do not natively support.
- PyTree observations. Observations can be arbitrary nested dicts, which makes it easy to route different streams (proprioception, vision, imitation targets, …) to different parts of a network.
- PyTree actions and rewards. Actions and rewards are also allowed to be PyTrees, which simplifies multi-actuator and multi-agent setups.
Installation
pip install nnx-ppo
nnx-ppo installs the CPU build of JAX by default. For a CUDA 12 GPU build:
pip install nnx-ppo "jax[cuda12]"
Optional extras:
nnx_ppo[examples]—brax,wandb, andplayground(import namemujoco_playground) for the scripts in examples/.nnx_ppo[dev]— test-suite dependencies (pytest,pyright,beartype,absl-py, plusplaygroundfor the env-driven tests).
Quick example
from flax import nnx
import mujoco_playground
from nnx_ppo.algorithms import ppo
from nnx_ppo.algorithms.config import TrainConfig, PPOConfig, EvalConfig
from nnx_ppo.networks.factories import make_mlp_actor_critic
from nnx_ppo.wrappers import episode_wrapper
env = mujoco_playground.registry.load("CartpoleBalance")
train_env = episode_wrapper.EpisodeWrapper(env, 1000)
rngs = nnx.Rngs(0)
nets = make_mlp_actor_critic(
env.observation_size,
env.action_size,
actor_hidden_sizes=[64] * 4,
critic_hidden_sizes=[256] * 2,
rngs=rngs,
normalize_obs=True,
)
result = ppo.train_ppo(
train_env,
nets,
TrainConfig(
ppo=PPOConfig(n_envs=1024, rollout_length=30, total_steps=10_000_000),
eval=EvalConfig(enabled=True, every_steps=500_000, n_envs=64,
max_episode_length=1000),
),
eval_env=env,
)
print(f"Final eval reward: {result.eval_history[-1]['episode_reward_mean']}")
See examples/wandb_logging.py for a complete training script with W&B logging and video recording.
Documentation
Full documentation, tutorials, and API reference are at https://nnx-ppo.readthedocs.io.
License
BSD 3-Clause — see LICENSE.
Metadata
Release files for nnx-ppo 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nnx_ppo-0.3.0.tar.gz | 84.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nnx_ppo-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 190.6 kB
Release files / nnx_ppo-0.3.0.tar.gz
| Download URL | nnx_ppo-0.3.0.tar.gz |
|---|---|
| Size | 84.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
86eb4f65255ad09480d25a5c63a3b6c037aa875b62306d409d7923f3ff17ce1e
|
|
BLAKE2b-256 checksum How to use checksums |
d70869b142084e3a6cef30f6759e2ec73cea5fb79e952a8946179de56571583a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 1, 2026.
Transparency logRelease files / nnx_ppo-0.3.0-py3-none-any.whl
| Download URL | nnx_ppo-0.3.0-py3-none-any.whl |
|---|---|
| Size | 106.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
733a3282ce08cd592176895026a2d5e3da988bc8de5bbc9a5061e7595cb222ed
|
|
BLAKE2b-256 checksum How to use checksums |
177addd5837088c644deb5a3b5d6381d51cf8cc26754446ca4e0db35d22df693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 1, 2026.
Transparency log