TMax DPPO RL — Qwen3.6-27B — resumable checkpoint @ ~step 61 (run2)
DeepSpeed ZeRO-3 training-state checkpoint (model + optimizer + dataloader state) from
reproducing hamishivi/tmax DPPO RL on
allenai/tmax-15k-open-instruct, base model Qwen3.6-27B (Qwen3_5ForConditionalGeneration).
This is not a plain HF model — it is a restartable checkpoint you feed back into
open_instruct/grpo_fast.py via --checkpoint_state_dir to continue training exactly where
it stopped (weights + Adam states + data order).
Contents
| path | what |
|---|---|
global_step61/ | ZeRO-3 sharded state: 16 ranks of bf16_zero_pp_rank_*_optim_states.pt + model states (~292 GB) |
latest | text file containing global_step61 (DeepSpeed reads this to pick the step) |
zero_to_fp32.py | DeepSpeed util to consolidate the shards into a single fp32 pytorch_model.bin if you want plain weights |
ref_policy/ | reference-policy metadata (DPPO uses beta 0.0, so KL/ref is effectively off) |
environment/ | exact Python env to reproduce the run (see below) |
How to resume training
# base weights + config come from the base model; the trained state comes from here
python open_instruct/grpo_fast.py \
--model_name_or_path Qwen/Qwen3.6-27B \ # or your local base VLM checkpoint
--checkpoint_state_dir /path/to/this/repo \ # <-- resumes from global_step61
--dataset_mixer_list allenai/tmax-15k-open-instruct 1.0 \
--loss_fn dppo --deepspeed_stage 3 ... (rest of the run2 recipe)
The trainer detects latest → loads global_step61 → continues at training step 61.
Extract plain fp32 weights (optional, if you just want the model)
python zero_to_fp32.py global_step61 ./consolidated_fp32 # then load as a normal HF model
Recipe (run2)
DPPO, beta 0.0, num_unique_prompts_rollout 8 × num_samples_per_prompt_rollout 32,
response_length 65536, learning_rate 1e-6 (constant), ZeRO-3, sequence_parallel_size 4,
tool = swerl_vanillux_sandbox (docker python:3.12-slim). 4×H200 nodes (16 GPU learners + 16 vLLM engines).
Evaluation — Terminal-Bench 2.0
Full harness, fixes, and scripts to reproduce our TB2.0 numbers are in
terminal_bench_eval/ (self-contained README.md, scripts/, PATCHES.md).
Results — terminus-2 (the official Harbor/Terminus-2 harness), mean reward, k=1:
| checkpoint | mean reward | full-solves |
|---|---|---|
| base Qwen3.6-27B | 0.564 | 42 |
| tmax step20 | 0.587 | 41 |
| tmax step40 | 0.657 | 42 |
| tmax step60 | 0.626 | 47 |
| tmax step80 | ~0.62 (78/89) | 47 |
| official card | 0.593 | — |
qwen3.6 reproduces the official 59.3; tmax RL adds a modest ~+0.08, plateauing ~step40.
An earlier ~0.26 reading was three harness bugs (32K-ctx assumption, 900s per-trial wall,
120s per-request timeout) starving the reasoning model — all fixed/documented in
terminal_bench_eval/PATCHES.md. vanillux2 (this repo's tool-calling harness) also works now
(base 0.387 / step20 0.364; it needs the qwen3_coder tool parser).
Environment
See environment/:
requirements_freeze.txt— fullpip freezepyproject.toml+uv.lock— reproduce exactly withuv syncversions.txt— key versions (torch / vLLM / transformers / ray / deepspeed / CUDA)