Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ jobs:

deploy:
name: deploy versioned documentation
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
# The Pages environment accepts the default branch, not release tags. Tag
# pushes still build and visually inspect the immutable docs above; a main
# push or an explicit main dispatch publishes the newest immutable tag.
if: >-
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
github.event_name == 'workflow_dispatch'
# The workflow-level group keys on `github.ref`, so a release tag push and the `main` push that accompanies it
# land in different groups and run at the same time. Both then claim the single `github-pages` environment and
# one of them fails. Serialize just the deploy job across every ref so the builds still run in parallel.
Expand Down
2 changes: 1 addition & 1 deletion PROJECT_STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ and what it printed.

Last updated: 2026-08-13.

Canonical release state: releasing `v0.9.0`.
Canonical release state: stable `v0.9.0` (`bc03d0e6aa5b7646423c460b253ea53070db31de`), development `0.9.1.dev0`.
Every public version claim is generated from `release-state.yaml` and gated by
`python scripts/release_state.py --check`.

Expand Down
44 changes: 22 additions & 22 deletions PYPI.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/v0.9.0/docs/banner.svg" alt="miniVERL — run verl-style OPD on one consumer GPU" width="880">
<img src="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/main/docs/banner.svg" alt="miniVERL — run verl-style OPD on one consumer GPU" width="880">
</p>

<div align="center">
Expand All @@ -8,15 +8,15 @@
[![Build](https://github.com/DaoyuanLi2816/mini-verl/actions/workflows/build.yml/badge.svg)](https://github.com/DaoyuanLi2816/mini-verl/actions/workflows/build.yml)
[![PyPI](https://img.shields.io/pypi/v/miniverl.svg)](https://pypi.org/project/miniverl/)
[![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org)
[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/LICENSE)
[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/DaoyuanLi2816/mini-verl/blob/main/LICENSE)

</div>

<p align="center">
<a href="https://pypi.org/project/miniverl/"><strong>PyPI</strong></a> ·
<a href="https://daoyuanli2816.github.io/mini-verl/"><strong>Stable docs</strong></a> ·
<a href="https://daoyuanli2816.github.io/mini-verl/dev/">Development docs</a> ·
<a href="https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/README.zh-CN.md">中文</a>
<a href="https://github.com/DaoyuanLi2816/mini-verl/blob/main/README.zh-CN.md">中文</a>
</p>

**Run a documented subset of verl-style on-policy distillation on one consumer
Expand Down Expand Up @@ -51,14 +51,14 @@ recipe and produce an inspectable PEFT adapter.

The `train` extra installs the ML runtime, but does not choose the correct CUDA
PyTorch wheel. The optional `cuda` extra adds bitsandbytes only. Follow the
[one-GPU installation and memory guide](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/single-gpu-guide.md) before a real
[one-GPU installation and memory guide](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/single-gpu-guide.md) before a real
run.

## Architecture

<picture>
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/v0.9.0/docs/verl-local-runtime-mobile.svg">
<img src="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/v0.9.0/docs/verl-local-runtime.svg" alt="verl-shaped YAML, overrides and Parquet prompts pass through a typed compiler; one CUDA GPU runs actor rollout, teacher scoring and actor update; inspectable artifacts can be handed to pinned verl while distributed execution remains outside miniVERL.">
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/main/docs/verl-local-runtime-mobile.svg">
<img src="https://raw.githubusercontent.com/DaoyuanLi2816/mini-verl/main/docs/verl-local-runtime.svg" alt="verl-shaped YAML, overrides and Parquet prompts pass through a typed compiler; one CUDA GPU runs actor rollout, teacher scoring and actor update; inspectable artifacts can be handed to pinned verl while distributed execution remains outside miniVERL.">
</picture>

miniVERL uses one ordinary process and schedules model roles in phases. It does
Expand Down Expand Up @@ -113,13 +113,13 @@ miniverl plan --profile verl-opd-v0.8-single-gpu-v1 --config verl-opd.yaml \

External YAML must explicitly accept the high-risk local mappings printed by
`plan` before `run`; the packaged profile carries a value-bound reviewed
manifest. [Override precedence and safe input forms](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/config-overrides.md)
manifest. [Override precedence and safe input forms](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/config-overrides.md)
are documented without executing Hydra interpolation or shell text.

The public built-in profile deliberately uses upstream-shaped `name: vllm`
values. miniVERL classifies both rollout and teacher engine names as local
reinterpretations and executes them with sequential local HF phases; this is
not vLLM equivalence. See [For verl users](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/for-verl-users.md) for config,
not vLLM equivalence. See [For verl users](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/for-verl-users.md) for config,
data, role and error mappings.

## Tested profile boundary
Expand Down Expand Up @@ -149,8 +149,8 @@ with a 64-token response bound, and completed **8 current-policy updates** at
**3.1914 GiB peak reserved VRAM**. Median steady-state rollout, teacher-scoring
and update times were 9.7200, 0.4864 and 2.3260 seconds. A matched 4-update
interruption resumed to the same byte-identical trajectories, adapter and
optimizer tensors. See the [data-bound figure and full record](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/verl-opd-reference-workload.md);
the original one-update [pip smoke](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/opd-quickstart.md) remains preserved.
optimizer tensors. See the [data-bound figure and full record](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/verl-opd-reference-workload.md);
the original one-update [pip smoke](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/opd-quickstart.md) remains preserved.
A separate pinned SmolLM2-360M/1.7B compatibility smoke completed one full
rollout/scoring/update cycle; it is not a second measured recipe.

Expand All @@ -172,7 +172,7 @@ Automatic BF16/FP16 selection follows device support; it is not inferred from
marketing names such as 3070, 4080, 5090 or Titan. `miniverl doctor` reports the
installed CUDA/PyTorch path. Normal planning is weight-free; explicit
`plan --probe` adds bounded, cached CUDA measurements with zero optimizer
updates. See [hardware planning](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/hardware-planning.md). There is no
updates. See [hardware planning](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/hardware-planning.md). There is no
automatic downgrade to a different model,
teacher, context, top-k or loss when memory is tight.

Expand Down Expand Up @@ -200,30 +200,30 @@ The v0.8.1 export preserves student/teacher identities, Parquet bytes and pure
OPD overrides, but reports `launchable: false` until exact base snapshots are
materialized and validated against the installed pinned verl commit. Only then
does `bridge materialize` publish a checksummed `launch.sh`; distributed
execution remains untested. Review the [materialization contract](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/scaleout-materialization.md),
[bridge contract](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/verl-bridge.md) and [compatibility policy](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/compatibility.md).
execution remains untested. Review the [materialization contract](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/scaleout-materialization.md),
[bridge contract](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/verl-bridge.md) and [compatibility policy](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/compatibility.md).

The intended operating loop is **plan → inspect → run → inspect → export**.
`plan --out` byte-binds the YAML, ordered overrides and scanned Parquet inputs
to the exact native config; `run --plan` rejects drift before loading weights.
Its digest follows the run manifest, teacher cache and checkpoints. Direct
`run --config` remains available for experiments. See [immutable execution
plans](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/immutable-plans.md).
plans](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/immutable-plans.md).

## Research and validation

miniVERL keeps every measured study—including negative results, superseded
runs and preregistered early stops—public under the documentation. None is used
as a claim that OPD universally beats SFT, DPO or KD: see the
[v0.7 External Alignment Gate](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/alignment-external/alignment-external-v1.md),
[Alignment Lab](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/alignment-lab/alignment-lab-v1.md),
[RecoveryBench](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/recoverybench/recoverybench-v1.md), and the
[calculator study](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/benchmarking.md).
[v0.7 External Alignment Gate](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/alignment-external/alignment-external-v1.md),
[Alignment Lab](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/alignment-lab/alignment-lab-v1.md),
[RecoveryBench](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/recoverybench/recoverybench-v1.md), and the
[calculator study](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/benchmarking.md).

New runs establish tokenizer compatibility through structural identity. The
legacy behavioral fingerprint is retained only for migration and is not an
identity proof. Scientific caveats and immutable source hashes remain in the
detailed reports and [limitations](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/limitations.md).
detailed reports and [limitations](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/limitations.md).

## Development, security and license

Expand All @@ -236,6 +236,6 @@ pytest -q -m "not gpu and not network"

Contributions should keep the one-GPU boundary explicit and include tests for
new failure modes. Report vulnerabilities privately through
[SECURITY.md](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/SECURITY.md). See [CONTRIBUTING.md](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/CONTRIBUTING.md), the
[changelog](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/CHANGELOG.md), [citation metadata](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/CITATION.cff),
[reproducibility guide](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/docs/reproducibility.md), and [Apache-2.0 license](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.9.0/LICENSE).
[SECURITY.md](https://github.com/DaoyuanLi2816/mini-verl/blob/main/SECURITY.md). See [CONTRIBUTING.md](https://github.com/DaoyuanLi2816/mini-verl/blob/main/CONTRIBUTING.md), the
[changelog](https://github.com/DaoyuanLi2816/mini-verl/blob/main/CHANGELOG.md), [citation metadata](https://github.com/DaoyuanLi2816/mini-verl/blob/main/CITATION.cff),
[reproducibility guide](https://github.com/DaoyuanLi2816/mini-verl/blob/main/docs/reproducibility.md), and [Apache-2.0 license](https://github.com/DaoyuanLi2816/mini-verl/blob/main/LICENSE).
26 changes: 17 additions & 9 deletions docs/generated/quality.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schema_version": 2,
"release": "0.9.0",
"status": "candidate",
"status": "released",
"quality_floor": "2,000+ tests and 80%+ branch coverage at v0.9.0",
"local_validation": {
"scope": "the maintainer's workstation, where the GPU and Windows-specific paths actually run",
Expand All @@ -27,16 +27,24 @@
}
},
"release_validation": {
"scope": "the exact product merge, validated by CI before release metadata",
"commit": "fb78f64be411890f44a075ebac3cba2c5e1bec04",
"scope": "the exact immutable v0.9.0 release commit",
"commit": "bc03d0e6aa5b7646423c460b253ea53070db31de",
"workflows": {
"ci": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31680333897",
"build": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31680333905",
"docs": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31680333907",
"pinned_verl_bridge": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31680333928",
"release": "pending tag workflow"
"ci": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681471818",
"build": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681471787",
"docs": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681471824",
"pinned_verl_bridge": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681471747",
"release": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681888075"
},
"conclusion": "success",
"gpu_coverage": "none; no GPU runner is configured for this repository, so the GPU counts above exist only from the local measurement"
"gpu_coverage": "none; no GPU runner is configured for this repository, so the GPU counts above exist only from the local measurement",
"publication": {
"pypi": "https://pypi.org/project/miniverl/0.9.0/",
"github_release": "https://github.com/DaoyuanLi2816/mini-verl/releases/tag/v0.9.0",
"documentation": "https://daoyuanli2816.github.io/mini-verl/",
"documentation_workflow": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31682785478",
"wheel_sha256": "cffc46b433170aecad11539f9f512a37d936827e3dc1e123bb359cbde6557bcc",
"sdist_sha256": "a08b94b63888e0a9038610c60b94493379fdc265034706d56b016572e11a4bed"
}
}
}
4 changes: 2 additions & 2 deletions docs/overrides/main.html
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{% extends "base.html" %}

{% block announce %}
<div class="docs-channel" data-stable-version="0.9.0" data-dev-version="0.9.0">
<div class="docs-channel" data-stable-version="0.9.0" data-dev-version="0.9.1.dev0">
<strong id="docs-channel-label">Stable documentation</strong>
<label for="docs-version-selector">Version</label>
<select id="docs-version-selector" aria-label="Documentation version">
<option value="stable">Stable 0.9.0</option>
<option value="dev">Development 0.9.0</option>
<option value="dev">Development 0.9.1.dev0</option>
</select>
</div>
{% endblock %}
24 changes: 24 additions & 0 deletions docs/release-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ This is the release gate and publication record for miniVERL. A checked item
names an invariant exercised on the stated source. Publication begins only
after the exact release commit and its remote checks are green.

## v0.9.1 development

Development reopened from the exact published v0.9.0 commit. No v0.9.1
release scope, scientific result or publication is claimed by this state-sync
change.

## v0.8.1 development

- [x] Keep the release to product positioning, migration documentation and an
Expand Down Expand Up @@ -188,6 +194,24 @@ unauthorized after checkpoint-selection failure**.

## After the tag

- [x] v0.9.0 release run
[`31681888075`](https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31681888075)
completed the full release gate, OIDC Trusted Publishing, one public
integrity attestation per file, exact public install and GitHub Release
creation for commit `bc03d0e6aa5b7646423c460b253ea53070db31de`.
- [x] PyPI and the
[v0.9.0 GitHub Release](https://github.com/DaoyuanLi2816/mini-verl/releases/tag/v0.9.0)
expose identical files: wheel SHA-256
`cffc46b433170aecad11539f9f512a37d936827e3dc1e123bb359cbde6557bcc`,
sdist SHA-256
`a08b94b63888e0a9038610c60b94493379fdc265034706d56b016572e11a4bed`.
- [x] Advance development to `0.9.1.dev0` in this separate state-sync PR.
- [x] Main dispatch
[`31682785478`](https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31682785478)
published v0.9.0 at the stable documentation root after the Pages
environment correctly refused direct deployment from the release tag;
future tag runs build and inspect docs without requesting deployment.

- [x] v0.8.1 OIDC publication run
[`31666095069`](https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31666095069)
uploaded both exact distributions and exposed one PyPI integrity
Expand Down
6 changes: 3 additions & 3 deletions release-state.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
# such distinction, which is how its tag shipped a docs selector still
# advertising "Stable 0.6.1 / Development 0.6.2.dev0".
schema_version: 1
phase: release
phase: development

stable:
version: "0.9.0"
tag: "v0.9.0"
release_commit: "pending"
release_commit: "bc03d0e6aa5b7646423c460b253ea53070db31de"
released_at: "2026-08-13"

development:
version: "0.9.0"
version: "0.9.1.dev0"
2 changes: 1 addition & 1 deletion src/miniverl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@

from __future__ import annotations

__version__ = "0.9.0"
__version__ = "0.9.1.dev0"

__all__ = ["__version__"]