diff --git a/.github/workflows/gpu.yml b/.github/workflows/gpu.yml
index 9dc3be5..daea322 100644
--- a/.github/workflows/gpu.yml
+++ b/.github/workflows/gpu.yml
@@ -15,7 +15,7 @@ on:
workflow_dispatch:
inputs:
run_recipe:
- description: "Also run the full 16 GB recipe (slow, ~10 minutes)"
+ description: "Also run the full single-GPU recipe (slow, ~10 minutes)"
type: boolean
default: false
@@ -46,7 +46,7 @@ jobs:
- name: GPU tests
run: pytest -q -m gpu -ra
- - name: Full 16 GB recipe
+ - name: Full single-GPU recipe
if: ${{ inputs.run_recipe }}
env:
MINIVERL_LOG_LEVEL: INFO
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43bd3ce..9f1b8da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,34 @@ All notable changes to miniVERL are recorded here. The format follows
## [Unreleased]
+## [0.2.2] - 2026-07-29
+
+Single-GPU portability and presentation release.
+
+### Added
+
+- A hardware-portability guide for personal NVIDIA GPUs, including honest
+ starting points for 8–12 GiB, 16–24 GiB and 24–32+ GiB cards, OOM controls,
+ and a reproducible hardware-result contribution path.
+- A prominent PyPI destination in both READMEs and package metadata.
+- Visual regression assertions that keep benchmark grid lines below axis labels
+ and preserve the dark generated figure.
+
+### Changed
+
+- The supported Qwen3 recipe now uses model-agnostic run metadata and
+ `dtype: auto`, selecting bf16 when available and fp16 on older CUDA cards
+ such as Titan V. The pinned models, adapter, objective and budgets are
+ unchanged.
+- The repository is positioned as a personal single-GPU training stack rather
+ than a 16 GiB-specific implementation. RTX 4080 numbers remain explicitly
+ labeled as the only measured GPU evidence.
+- The banner and data-bound protocol benchmark figure use a new dark visual
+ system. Axis grids no longer cross tick labels, and protocol-incompatible
+ 0% controls are rendered as diagnostic states rather than zero-length bars.
+- GPU workflow language now names the portable single-GPU recipe instead of a
+ particular VRAM tier.
+
## [0.2.1] - 2026-07-29
Correctness, lifecycle safety and reproducibility release.
diff --git a/CITATION.cff b/CITATION.cff
index 1ca5b23..cf262c6 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -2,7 +2,7 @@ cff-version: 1.2.0
title: "miniVERL: On-policy distillation for tool-using agents on one GPU"
message: "If you use miniVERL in your work, please cite it as below."
type: software
-version: 0.2.1
+version: 0.2.2
date-released: 2026-07-29
license: Apache-2.0
repository-code: "https://github.com/DaoyuanLi2816/mini-verl"
@@ -18,8 +18,9 @@ abstract: >-
coarse-graining, enforces per-token provenance so that tool output can never
become a training label, and stores teacher targets in a versioned,
checksummed, pickle-free cache with policy-version enforcement. It is
- designed and measured for a single 16 GB consumer GPU and requires neither
- Ray nor a cluster.
+ designed for one personal CUDA GPU, automatically selects bf16 or fp16, and
+ requires neither Ray nor a cluster. Published performance is measured on one
+ RTX 4080; other GPU models use the same code path but remain unmeasured.
authors:
- family-names: Li
given-names: Daoyuan
@@ -32,6 +33,7 @@ keywords:
- agents
- QLoRA
- consumer GPU
+ - single GPU
- post-training
- reproducibility
references:
@@ -96,4 +98,4 @@ references:
url: "https://arxiv.org/abs/2603.07079"
notes: >-
Motivates recording per-token teacher entropy. Entropy-aware divergence
- mixing is a roadmap item and is not implemented in miniVERL v0.2.1.
+ mixing is a roadmap item and is not implemented in miniVERL v0.2.2.
diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md
index 489dfc0..0dd68bf 100644
--- a/PROJECT_STATE.md
+++ b/PROJECT_STATE.md
@@ -6,7 +6,20 @@ and what it printed.
Last updated: 2026-07-29.
-## v0.2.1 correctness release status
+## v0.2.2 single-GPU portability release candidate
+
+| item | current state |
+| --- | --- |
+| integration source | `agent/single-gpu-visuals`, based on synchronized public `main` at `dcded6bd1948eb7421f89e336f611e3b0d3c0ad3` |
+| version transition | source, changelog and citation metadata identify `0.2.2`; the intended annotated tag is `v0.2.2` |
+| hardware scope | one NVIDIA CUDA GPU with no device-name allowlist; automatic dtype selects bf16 when supported and fp16 otherwise; exact fit remains model/budget dependent |
+| measured evidence | the only published real-model GPU measurements remain the RTX 4080 runs; RTX 3070, Titan V, RTX 5090 and other cards are portable code paths, not fabricated benchmark claims |
+| presentation | banner and generated benchmark SVG use a dark single-GPU visual system; grid lines begin below tick labels and diagnostic 0% controls are status pills |
+| package discovery | both READMEs, project metadata and the GitHub About homepage expose `https://pypi.org/project/miniverl/` |
+| frozen scientific artifact | `benchmarks/results/gpu-calc-hard-equal-update-v2.json` remains byte-identical at SHA-256 `53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc` |
+| publication state | authorized for direct release; publish only after local gates, pull-request CI and synchronized default-branch CI pass |
+
+## Historical v0.2.1 correctness release status
| item | current state |
| --- | --- |
diff --git a/README.md b/README.md
index 4514511..0ba7f19 100644
--- a/README.md
+++ b/README.md
@@ -12,12 +12,21 @@
-**On-policy distillation for tool-using agents on one GPU.**
+
+
+**A compact, auditable training stack for tool-using agents on one personal GPU.**
miniVERL is a compact, auditable training lab for teaching a small language
model from its own multi-turn tool trajectories. It runs real tools, keeps
token provenance explicit, and applies teacher distributional targets only
-where they belong — without Ray, a GPU cluster, or a 40 GB accelerator.
+where they belong — without Ray or a GPU cluster. There is no device-name
+allowlist: use the NVIDIA CUDA card you have, then choose a model pair and
+sequence budget that fit it.
```bash
python -m pip install miniverl # lightweight core
@@ -44,7 +53,7 @@ validate artifacts without downloading a multi-gigabyte ML stack; use
`top-k + tail` objectives are named and reported separately.
[Run the local demo](#local-toy-demo) ·
-[Train on a consumer GPU](#consumer-gpu-quickstart) ·
+[Train on your GPU](#single-gpu-quickstart) ·
[Inspect the measured result](#measured-result-protocol-aligned-opd-matches-sft) ·
[Read the math](docs/math.md)
@@ -66,7 +75,7 @@ go wrong in practice, and all four are silent:
cannot run.
miniVERL makes each of those a *checked property* rather than a comment, and
-keeps the whole thing on one 16 GB card.
+keeps the whole lifecycle in one readable single-GPU process.
## What is implemented
@@ -78,7 +87,7 @@ keeps the whole thing on one 16 GB card.
| Compressed `top-k + tail` KL and JSD | yes; the unsmoothed coarse-graining has a proven lower-bound relationship to the exact loss |
| Privileged-context teacher with an explicit alignment map | yes |
| Frozen standard PEFT teacher adapters with provenance and competence gates | yes |
-| QLoRA (NF4) student, bf16 or quantized teacher | yes, measured on an RTX 4080 |
+| Single-GPU CUDA path with automatic bf16/fp16 selection | yes; model-agnostic code path, measured reference on an RTX 4080 |
| `resident` and `swap` memory strategies, `auto` resolution | yes, with an equivalence test |
| Versioned, checksummed, pickle-free teacher-target cache | yes |
| SFT / offline KD / strict OPD / explicitly labeled replay behind one trainer | yes |
@@ -105,7 +114,7 @@ keeps the whole thing on one 16 GB card.
| diagnostic control | answer-privileged, protocol-naive teacher | 0.0% | 0.0% |
The [public, immutable protocol-teacher adapter](https://huggingface.co/DaoyuanLi/mini-verl-qwen3-1.7b-protocol-teacher)
-is the default in the consumer-GPU recipe. It passed an independently
+is the default in the single-GPU recipe. It passed an independently
prespecified policy-competence gate before this benchmark was inspected. The
two controls intentionally remove that guarantee: their loss decreased
normally, but they taught the student an incompatible tool policy. This is a
@@ -200,7 +209,14 @@ The toy backend is a **machinery harness, not a capability demonstration**. Its
models are too small to solve anything beyond the `easy` split. Capability
numbers come from the GPU recipe.
-## Consumer-GPU quickstart
+## Single-GPU quickstart
+
+The default recipe uses `device: auto` and `dtype: auto`: bf16-capable cards use
+bf16, while older CUDA cards such as Titan V use fp16. RTX 3070, Titan V,
+RTX 4080 and RTX 5090-class cards all enter the same code path; only the
+RTX 4080 result is measured here. Exact fit is governed by VRAM, model sizes,
+drivers and token budgets, not the card's marketing name. See the
+[`single-GPU guide`](docs/single-gpu-guide.md) before changing the recipe.
```bash
git clone https://github.com/DaoyuanLi2816/mini-verl.git
@@ -474,8 +490,10 @@ environments, and multi-GPU. For anything at cluster scale, use verl.
The name is a nod to the problem space, not a claim of compatibility. verl is an
excellent, much larger system that also implements on-policy distillation and
multi-turn tool use — at cluster scale, with Ray. If you have a cluster, use it.
-miniVERL exists for the case where you have one consumer GPU and want to read
-every line of what is happening. See [`docs/comparisons.md`](docs/comparisons.md).
+miniVERL exists for the case where you have one personal GPU and want to read
+every line of what is happening. That can be an older 12 GiB card or a current
+high-end card; the repository claims measured performance only for hardware it
+actually ran. See [`docs/comparisons.md`](docs/comparisons.md).
## Citation
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 1a6f25b..265e5f8 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -12,13 +12,21 @@
+