Model or dataset
inclusionAI/AReno avatar
inclusionAI/AReno

AReno: single-node RL post-training that keeps the inference backend inside the process

An easy-to-use, fast toolkit to scale up RL post-training on a single node.

317 stars129 forksPythonApache-2.0

At a glance

What is it?
AReno is an Apache-2.0 Python toolkit from the inclusionAI ASystem team that runs RL, SFT and agentic post-training on one machine, selecting CUDA on Linux and MLX on Apple Silicon. It is a reasonable fit for small-model experiments; it is not a distributed training system.
Who is it for?
Adopt AReno if you are post-training small models (the README's own example uses Qwen/Qwen3-0.6B) on one NVIDIA GPU or an Apple Silicon machine and you want the rollout, scoring and optimizer step in one Python process. Do not adopt it if you need multi-node scaling, or if you are on Windows without WSL2, since the CLI does not fall back between backends.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap AReno targets: three components that normally have to be wired together

Post-training a language model with reinforcement learning usually means assembling at least three moving parts: a training framework, an inference server for rollout generation, and whatever kernel or attention library the two share. The README frames AReno against exactly that setup, describing a workflow where you can go from a base checkpoint to a trained, served model on a single node without standing up a cluster or wiring together a training framework, an inference server, and a kernel library. The project describes itself as a local LLM post-training toolkit for RL, SFT/DPO-style training, serving, and agentic RL, originally developed by engineers from the ASystem Team at Ant Group. The audience is therefore narrow and specific: researchers and developers who have one GPU box or one Mac and want to iterate on reward functions and algorithms rather than on infrastructure. If your job is to serve a 70B model to production traffic, this is not the tool. If your job is to find out whether a reward function produces the behaviour you want on a 0.6B model before spending cluster time, the single-node constraint stops being a limitation and becomes the point.

Inside the loop: rollout sessions, TrainSequence objects and a loss function you supply

The architecture visible in the README is a short cycle of Trainer calls rather than a declarative config. You construct a Trainer with a world_size and a model_path, call init() to load the tokenizer and start workers, and then drive the loop yourself. Rollout happens inside a rollout_session(...) context manager, where rollout_batch(...) or rollout_token_batch(...) generates on-policy completions for each prompt. Scoring is explicitly not AReno's job: the README states that you reward each completion and turn rewards into advantages with your own reward function. The example imports reward_fn from examples/math/math_verify_reward and compute_group_advantages from areno.api.rewards, which implies group-relative advantage normalisation is provided but the reward signal itself is not. The scored rollout is then packed into TrainSequence objects carrying tokens, logprobs, prompt_len, scalar_advantage, reward and eos_token_id, and passed to train(batch, loss_fn) for one optimizer step. The example passes gspo_loss_fn from areno.api. New weights produce new rollouts, and you loop until done, then call close(). This is a library, not a pipeline: control flow, batching and stopping conditions live in your script. That is a deliberate trade-off. It gives you full control over advantage computation and lets you mix reward sources, but it also means there is no scheduler watching your run, and no checkpoint policy imposed on you beyond what the Trainer API offers.

Backend selection is a hard switch, not a negotiation

AReno ships one train/serve stack that installs and loads only the native backend needed by the host, CUDA on Linux or MLX on Apple Silicon. The README is unusually direct about the consequence: the CLI selects CUDA on Linux and MLX on native arm64 macOS, and it does not silently fall back between backends. That sentence matters more than it looks. It means a misconfigured environment fails rather than degrading, which is arguably better than a silent CPU fallback that turns a training run into a multi-day wait, but it also means you cannot prototype on a Mac and then move the same environment to a Linux box without reinstalling. Installation reflects the split. The CUDA and WSL2 path is a single script, bash scripts/install.sh, run from the cloned repository. The Apple Silicon path is a manual virtual environment: python3 -m venv .venv, source .venv/bin/activate, python -m pip install -U pip, then python -m pip install -e . The README notes that platform dependency markers install the MLX stack on Apple Silicon without pulling in Linux-only Torch and CUDA packages. Requirements are stated as Linux x86_64 or aarch64 with an NVIDIA GPU and CUDA-enabled PyTorch 2.6 or newer, plus Apple Silicon macOS through MLX, with Windows users directed to WSL2 for the CUDA path. A container image is also published at ghcr.io/inclusionai/areno, tagged v0.0.8, and the README's smoke test is docker run --gpus all --rm -it ghcr.io/inclusionai/areno:v0.0.8 areno check, which requires an NVIDIA driver and the NVIDIA Container Toolkit on the host.

What the --algo flag and the native LoRA support actually buy you

Two features in the highlights list change day-to-day work rather than just marketing the project. The first is that post-training methods are reachable through a --algo flag on the CLI or through the same Trainer class from Python, which means a method swap does not require rewriting the loop. The second is native LoRA: the README states AReno trains TP-aware adapters for Qwen3, Qwen3-MoE and Bailing-MoE V3, saves standard PEFT artifacts, and can reload them for training or serving. That list is short and specific, and it is worth reading as a constraint rather than a feature. If your base model is not one of those three families, the native adapter path is not documented as covering you, and the extensibility claim (register new algorithms, model adapters, reward functions and hardware backends without changing the core) means you would be writing the adapter yourself. Tensor-parallel-aware adapters are a real detail: adapters have to be sharded consistently with the base weights, and getting that wrong produces training that runs and does not learn. The agentic path is the other distinctive piece. You run an agent function against AReno's local OpenAI-compatible proxy, return explicit trajectories, and the trainer derives tokens, logprobs, rewards and loss masks from them. Multimodal content (image, audio, video) goes through the same OpenAI-style message format in serving and agentic training, subject to the model's processor supporting it. Both of these are integration surfaces, and both are places where the documentation is the thing you should read before the code.

Where AReno is the wrong tool

The single-node design is the first limit and the README states it plainly: the toolkit is optimized to extract maximum performance from a single node, with no external training or inference backend in the loop. There is no documented multi-node path, so anything requiring more memory or more compute than one machine provides is out of scope, and no amount of configuration changes that. The second limit is the reward function. AReno scores nothing by default; the README says rewards come from your function, not AReno's. That is honest, but it means the toolkit gives you no protection against a badly shaped reward, and the example's math verification reward is a narrow template that will not transfer to open-ended tasks. The third limit is version maturity. The releases listed are v0.0.6, v0.0.7 and v0.0.8, all in the 0.0.x series within roughly two months of each other. The API surface shown in the README (Trainer, rollout_session, TrainSequence, gspo_loss_fn) is the kind of interface that tends to move at that stage, so pinning a version is a practical necessity rather than caution. Finally, the README as supplied is truncated mid-sentence in the CLI section, so the full flag set, the available --algo values and the CLI's own training entry point are not verifiable from the material here. Treat the CLI as documented elsewhere and check the linked documentation site before assuming a flag exists.

How it differs from verl and OpenRLHF

The closest well-known alternatives are verl and OpenRLHF, and the difference is architectural rather than a matter of feature checklists. Both of those projects are built around distributed execution: they assume a cluster, a launcher (Ray in verl's case), and a separation between the training workers and the inference engine that generates rollouts, typically vLLM or SGLang. AReno inverts that. It has no launcher to set up, per the README's plug-and-play description, and it keeps serving inside its own stack rather than delegating to an external inference server. The practical consequence is that AReno's ceiling is one node and its floor is much lower: no Ray cluster, no separate vLLM deployment, no coordination between two process groups. If you already run a multi-node Ray cluster and your models do not fit on one machine, verl or OpenRLHF is the right shape and AReno is not. If your models do fit, AReno removes an entire category of operational work, at the cost of the scaling headroom you may want later. That is a real fork in the road, and it is better decided by model size than by which project looks more capable.

Maintenance, licence and what the release cadence implies

The licence is Apache-2.0, which permits commercial use and modification and includes an explicit patent grant. This article is not legal advice; read the LICENSE file in the repository for the terms that bind you, particularly if you redistribute a modified version or bundle the container image. On maintenance, the observable facts are a recent last push and a release cadence of roughly three to four weeks across v0.0.6 to v0.0.8. That cadence cuts both ways. Active development means bugs get attention and new model families get adapters; it also means a 0.0.x API can change under you between minor versions. The upgrade cost is concentrated in three places: the Trainer and api module signatures, the LoRA adapter target modules for whichever architecture you use, and the platform dependency markers that decide whether you get CUDA or MLX. Pin the version in your environment file, and re-read the release notes before bumping, because a change to TrainSequence fields would surface as a type error in your loop rather than as a wrong training result.

Editorial conclusion

Adopt AReno if you are post-training small models (the README's own example uses Qwen/Qwen3-0.6B) on one NVIDIA GPU or an Apple Silicon machine and you want the rollout, scoring and optimizer step in one Python process. Do not adopt it if you need multi-node scaling, or if you are on Windows without WSL2, since the CLI does not fall back between backends. Before committing, run the CLI against your actual checkpoint and verify that the tokenizer, the LoRA target modules for your architecture, and the multimodal processor path all load.

Official sources

  1. inclusionAI/AReno on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Community notes

Community notes