From 0d6e0070ae73ef35f718aec3624ee5263ac96e3a Mon Sep 17 00:00:00 2001
From: Daoyuan Li <94409450+DaoyuanLi2816@users.noreply.github.com>
Date: Sat, 29 Aug 2026 01:30:56 -0700
Subject: [PATCH 1/2] Preregister Rollout Runtime v2 baseline
---
CHANGELOG.md | 7 +
PROJECT_STATE.md | 8 +-
.../preregistration/rollout-runtime-v2.yaml | 142 +++++
.../schema/rollout-runtime-v2.schema.json | 212 ++++++++
docs/benchmarks/rollout-runtime-v2-method.md | 46 ++
docs/competitive-landscape.md | 28 +
docs/overrides/main.html | 4 +-
docs/release-checklist.md | 21 +-
mkdocs.yml | 3 +
release-state.yaml | 2 +-
scripts/benchmark_rollout_runtime.py | 495 ++++++++++++++++++
src/miniverl/__init__.py | 2 +-
tests/unit/test_release_assets.py | 6 +-
.../unit/test_rollout_runtime_v2_benchmark.py | 136 +++++
tests/unit/test_v1_readiness.py | 2 +-
15 files changed, 1101 insertions(+), 13 deletions(-)
create mode 100644 benchmarks/preregistration/rollout-runtime-v2.yaml
create mode 100644 benchmarks/schema/rollout-runtime-v2.schema.json
create mode 100644 docs/benchmarks/rollout-runtime-v2-method.md
create mode 100644 docs/competitive-landscape.md
create mode 100644 scripts/benchmark_rollout_runtime.py
create mode 100644 tests/unit/test_rollout_runtime_v2_benchmark.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3529339..f5dee61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,13 @@ All notable changes to miniVERL are recorded here. The format follows
## [Unreleased]
+### Rollout Runtime v2 baseline
+
+- Advanced the development line to `0.11.0.dev0` and preregistered the fixed
+ RTX 4080 rollout workload before changing generation behavior.
+- Added an exact-source competitive landscape that separates upstream claims,
+ miniVERL's current state and measurements that have not yet been run.
+
### Documentation narrative
- Rebuilt the English, Chinese and PyPI landing narratives around the local
diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md
index bbbe23c..51121ca 100644
--- a/PROJECT_STATE.md
+++ b/PROJECT_STATE.md
@@ -4,14 +4,14 @@ Current maintainer handoff for **miniVERL** (`mini-verl` package, `miniverl`
CLI). `release-state.yaml` is the canonical version source; this page indexes
current product and evidence state rather than repeating release history.
-Last updated: 2026-08-16.
+Last updated: 2026-08-29.
-Canonical release state: stable `v0.10.1` (`2364e9b8e8b550f44d1b66a77fc2d407b76b05b5`), development `0.10.2.dev0`.
+Canonical release state: stable `v0.10.1` (`2364e9b8e8b550f44d1b66a77fc2d407b76b05b5`), development `0.11.0.dev0`.
## Release state
- Stable release: `v0.10.1` at `2364e9b8e8b550f44d1b66a77fc2d407b76b05b5`.
-- Development release: `0.10.2.dev0`.
+- Development release: `0.11.0.dev0`.
- Stable docs: .
- Development docs: .
- Historical build log: [v0.1-v0.9 archive](docs/history/project-state-v0.1-v0.9.md).
@@ -31,7 +31,7 @@ Executable compatibility claims are mutation-tested and recorded in
unknown-size quantized roles require proof instead of receiving an executable
plan.
-Development `0.10.2.dev0` has a closed typed profile registry and torch-free
+Development `0.11.0.dev0` has a closed typed profile registry and torch-free
compatibility introspection. Profile-scoped plans, caches, checkpoints and
exports bind an independent identity. The direct-GKD and sampled-k1 vanilla
policy-loss profiles both have pinned conformance and measured RTX 4080 paths.
diff --git a/benchmarks/preregistration/rollout-runtime-v2.yaml b/benchmarks/preregistration/rollout-runtime-v2.yaml
new file mode 100644
index 0000000..939011c
--- /dev/null
+++ b/benchmarks/preregistration/rollout-runtime-v2.yaml
@@ -0,0 +1,142 @@
+schema_version: 1
+name: rollout-runtime-v2
+status: preregistered_before_baseline_measurement
+registered_at_utc: 2026-08-29T08:20:00Z
+
+question: >-
+ On one RTX 4080 under WSL2, how do miniVERL rollout backends change
+ generation throughput, current-policy synchronization cost, peak memory and
+ lifecycle cleanup under one fixed token workload?
+
+claim_scope:
+ allowed:
+ - measured runtime, memory and conformance on the declared machine
+ - exact current-policy synchronization and cache-invalidation behavior
+ - behavior of samples_per_prompt under the versioned workload
+ forbidden:
+ - task-quality improvement
+ - universal performance across GPUs or software stacks
+ - distributed verl execution
+ - unmeasured superiority over mini-opd or NeMo RL
+
+hardware:
+ gpu: NVIDIA GeForce RTX 4080
+ total_vram_mib: 16376
+ os: WSL2/Linux
+ peak_reserved_limit_gib: 14.5
+
+models:
+ actor:
+ id: Qwen/Qwen3-0.6B
+ revision: c1899de289a04d12100db370d81485cdf75e47ca
+ tokenizer_revision: c1899de289a04d12100db370d81485cdf75e47ca
+ teacher:
+ id: Qwen/Qwen3-1.7B
+ revision: 70d244cc86ccca08cf5af4e1e306ecf908b1ad5e
+ tokenizer_revision: 70d244cc86ccca08cf5af4e1e306ecf908b1ad5e
+ dtype: bfloat16
+ quantization: nf4
+ attention_implementation: sdpa
+
+workload:
+ manifest_version: rollout-runtime-v2-workload-v1
+ run_seed: 20260829
+ logical_prompts: 4
+ prompt_lengths: [128, 512]
+ response_bounds: [64, 256, 512]
+ optional_response_bounds: [1024]
+ samples_per_prompt: [1, 4]
+ sampling:
+ - name: greedy
+ temperature: 0.0
+ top_p: 1.0
+ top_k: 0
+ - name: seeded_stochastic
+ temperature: 0.8
+ top_p: 0.95
+ top_k: 50
+ warmup_repetitions: 1
+ measured_repetitions: 3
+
+baseline:
+ backend: hf_reference
+ timing: before_hf_cached_or_external_backend_implementation
+ grouped_semantics: >-
+ Repeated independent requests only. The baseline does not claim the typed,
+ transactional samples_per_prompt semantics planned for runtime v2.
+
+metrics:
+ phases:
+ - cold_start
+ - prefill
+ - decode
+ - rollout_total
+ - policy_sync
+ - teacher_scoring
+ - actor_update
+ - full_cycle
+ - teardown
+ counters:
+ - logical_prompts
+ - samples_per_prompt
+ - generated_trajectories
+ - prompt_tokens
+ - generated_tokens
+ - physical_batches
+ - oom_downshifts
+ rates:
+ - time_to_first_token_seconds
+ - prompt_tokens_per_second
+ - output_tokens_per_second
+ memory:
+ - peak_allocated_bytes
+ - peak_reserved_bytes
+ - process_rss_bytes
+ - teardown_residual_allocated_bytes
+ identity:
+ - source_commit
+ - wheel_sha256
+ - profile_identity
+ - model_and_tokenizer_revisions
+ - backend_name_and_version
+ - policy_version
+ - adapter_or_weight_digest
+ - workload_manifest_sha256
+ - reproducibility_class
+
+conformance:
+ greedy_token_ids: exact
+ stop_reason: exact
+ policy_identity: exact
+ logprob_max_absolute:
+ fp32: 2.0e-4
+ bf16_or_fp16: 2.0e-3
+ nf4: 1.0e-2
+ batch_partitions:
+ - [4]
+ - [2, 2]
+ - [1, 1, 1, 1]
+
+performance_gates:
+ hf_cached_speedup_over_hf_reference:
+ response_256: 2.0
+ response_512: 2.0
+ selected_external_engine_advantage_over_hf_cached: 1.2
+ repeated_sync_generate_cycles: 8
+ monotonic_memory_leak_allowed: false
+
+invalidation_policy:
+ invalidate_if:
+ - a model or tokenizer revision changes
+ - prompt token ids, sample seeds or response bounds change across backends
+ - phase timings are merged into one throughput number
+ - failed or OOM cells are discarded
+ - a backend silently falls back to another backend
+ - the frozen calculator benchmark changes
+ frozen_calculator_sha256: 53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc
+
+outputs:
+ schema: benchmarks/schema/rollout-runtime-v2.schema.json
+ baseline_result: benchmarks/results/rollout-runtime-v2-hf-reference.json
+ method: docs/benchmarks/rollout-runtime-v2-method.md
+ report: docs/benchmarks/rollout-runtime-v2.md
diff --git a/benchmarks/schema/rollout-runtime-v2.schema.json b/benchmarks/schema/rollout-runtime-v2.schema.json
new file mode 100644
index 0000000..f8bd3ef
--- /dev/null
+++ b/benchmarks/schema/rollout-runtime-v2.schema.json
@@ -0,0 +1,212 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://github.com/DaoyuanLi2816/mini-verl/benchmarks/schema/rollout-runtime-v2.schema.json",
+ "title": "miniVERL Rollout Runtime v2 benchmark result",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "schema_version",
+ "name",
+ "measurement_status",
+ "source",
+ "preregistration_sha256",
+ "workload_manifest_sha256",
+ "frozen_calculator_sha256",
+ "environment",
+ "models",
+ "backend",
+ "cells",
+ "failures"
+ ],
+ "properties": {
+ "schema_version": {"const": 1},
+ "name": {"const": "rollout-runtime-v2-hf-reference"},
+ "measurement_status": {
+ "enum": ["measured_baseline", "completed_with_failures"]
+ },
+ "source": {"$ref": "#/$defs/source"},
+ "preregistration_sha256": {"$ref": "#/$defs/sha256"},
+ "workload_manifest_sha256": {"$ref": "#/$defs/sha256"},
+ "frozen_calculator_sha256": {
+ "const": "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc"
+ },
+ "environment": {"type": "object"},
+ "models": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["actor", "teacher", "dtype", "quantization"],
+ "properties": {
+ "actor": {"$ref": "#/$defs/model"},
+ "teacher": {"$ref": "#/$defs/model"},
+ "dtype": {"type": "string", "minLength": 1},
+ "quantization": {"type": "string", "minLength": 1}
+ }
+ },
+ "backend": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["name", "version", "reproducibility_class"],
+ "properties": {
+ "name": {"const": "hf_reference"},
+ "version": {"type": "string", "minLength": 1},
+ "reproducibility_class": {"const": "same_process_seeded_reference"}
+ }
+ },
+ "cells": {
+ "type": "array",
+ "minItems": 1,
+ "items": {"$ref": "#/$defs/cell"}
+ },
+ "failures": {
+ "type": "array",
+ "items": {"type": "string", "minLength": 1}
+ }
+ },
+ "$defs": {
+ "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["commit", "dirty", "miniverl_version", "wheel_sha256"],
+ "properties": {
+ "commit": {"type": "string", "pattern": "^[0-9a-f]{40}$"},
+ "dirty": {"const": false},
+ "miniverl_version": {"type": "string", "minLength": 1},
+ "wheel_sha256": {"$ref": "#/$defs/sha256"}
+ }
+ },
+ "model": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "revision", "tokenizer_revision"],
+ "properties": {
+ "id": {"type": "string", "minLength": 1},
+ "revision": {"type": "string", "pattern": "^[0-9a-f]{40}$"},
+ "tokenizer_revision": {"type": "string", "pattern": "^[0-9a-f]{40}$"}
+ }
+ },
+ "phase": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["status"],
+ "properties": {
+ "status": {"enum": ["measured", "not_applicable", "not_measured", "failed"]},
+ "median_seconds": {"type": "number", "minimum": 0},
+ "minimum_seconds": {"type": "number", "minimum": 0},
+ "note": {"type": "string"}
+ },
+ "allOf": [
+ {
+ "if": {"properties": {"status": {"const": "measured"}}},
+ "then": {"required": ["median_seconds", "minimum_seconds"]}
+ }
+ ]
+ },
+ "cell": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "cell_id",
+ "prompt_length",
+ "response_bound",
+ "samples_per_prompt",
+ "sampling",
+ "status",
+ "counts",
+ "phases",
+ "rates",
+ "memory",
+ "output_token_ids_sha256",
+ "sampled_logprobs_sha256",
+ "oom_downshifts",
+ "error"
+ ],
+ "properties": {
+ "cell_id": {"type": "string", "minLength": 1},
+ "prompt_length": {"enum": [128, 512]},
+ "response_bound": {"enum": [64, 256, 512, 1024]},
+ "samples_per_prompt": {"enum": [1, 4]},
+ "sampling": {"enum": ["greedy", "seeded_stochastic"]},
+ "status": {"enum": ["completed", "oom", "failed", "not_run"]},
+ "counts": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "logical_prompts",
+ "generated_trajectories",
+ "prompt_tokens",
+ "generated_tokens",
+ "physical_batches"
+ ],
+ "properties": {
+ "logical_prompts": {"type": "integer", "minimum": 0},
+ "generated_trajectories": {"type": "integer", "minimum": 0},
+ "prompt_tokens": {"type": "integer", "minimum": 0},
+ "generated_tokens": {"type": "integer", "minimum": 0},
+ "physical_batches": {"type": "integer", "minimum": 0}
+ }
+ },
+ "phases": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "cold_start",
+ "prefill",
+ "decode",
+ "rollout_total",
+ "policy_sync",
+ "teacher_scoring",
+ "actor_update",
+ "full_cycle",
+ "teardown"
+ ],
+ "properties": {
+ "cold_start": {"$ref": "#/$defs/phase"},
+ "prefill": {"$ref": "#/$defs/phase"},
+ "decode": {"$ref": "#/$defs/phase"},
+ "rollout_total": {"$ref": "#/$defs/phase"},
+ "policy_sync": {"$ref": "#/$defs/phase"},
+ "teacher_scoring": {"$ref": "#/$defs/phase"},
+ "actor_update": {"$ref": "#/$defs/phase"},
+ "full_cycle": {"$ref": "#/$defs/phase"},
+ "teardown": {"$ref": "#/$defs/phase"}
+ }
+ },
+ "rates": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "time_to_first_token_seconds",
+ "prompt_tokens_per_second",
+ "output_tokens_per_second"
+ ],
+ "properties": {
+ "time_to_first_token_seconds": {"type": ["number", "null"], "minimum": 0},
+ "prompt_tokens_per_second": {"type": ["number", "null"], "minimum": 0},
+ "output_tokens_per_second": {"type": ["number", "null"], "minimum": 0}
+ }
+ },
+ "memory": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "peak_allocated_bytes",
+ "peak_reserved_bytes",
+ "process_rss_bytes",
+ "teardown_residual_allocated_bytes"
+ ],
+ "properties": {
+ "peak_allocated_bytes": {"type": ["integer", "null"], "minimum": 0},
+ "peak_reserved_bytes": {"type": ["integer", "null"], "minimum": 0},
+ "process_rss_bytes": {"type": ["integer", "null"], "minimum": 0},
+ "teardown_residual_allocated_bytes": {"type": ["integer", "null"], "minimum": 0}
+ }
+ },
+ "output_token_ids_sha256": {"type": ["string", "null"], "pattern": "^[0-9a-f]{64}$"},
+ "sampled_logprobs_sha256": {"type": ["string", "null"], "pattern": "^[0-9a-f]{64}$"},
+ "oom_downshifts": {"type": "integer", "minimum": 0},
+ "error": {"type": ["string", "null"]}
+ }
+ }
+ }
+}
diff --git a/docs/benchmarks/rollout-runtime-v2-method.md b/docs/benchmarks/rollout-runtime-v2-method.md
new file mode 100644
index 0000000..d8fb3f4
--- /dev/null
+++ b/docs/benchmarks/rollout-runtime-v2-method.md
@@ -0,0 +1,46 @@
+# Rollout Runtime v2 benchmark method
+
+This is a systems benchmark for one WSL2 RTX 4080. It measures rollout phases,
+memory, current-policy synchronization and lifecycle behavior; it does not
+measure task quality or establish an algorithm ranking.
+
+The preregistration is
+[`benchmarks/preregistration/rollout-runtime-v2.yaml`](https://github.com/DaoyuanLi2816/mini-verl/blob/main/benchmarks/preregistration/rollout-runtime-v2.yaml).
+The actor and teacher snapshots, token workload, sample seeds, response bounds,
+warmups, repetitions and invalidation rules are fixed there before the first
+baseline measurement.
+
+## Comparisons
+
+1. `hf_reference` freezes the pre-v0.11 behavior and acts as the compatibility
+ oracle.
+2. `hf_cached` must preserve the oracle's greedy tokens, stop decisions and
+ policy identity while adding batched incremental KV-cache decoding.
+3. One external engine may be qualified after separate SGLang and vLLM spikes.
+
+`samples_per_prompt=4` in the baseline means four independently repeated
+requests. It is not evidence that the later grouped trajectory, transaction or
+resume contract already exists.
+
+## Timing and rates
+
+Cold start, prefill, decode, policy synchronization, teacher scoring, actor
+update, complete cycle and teardown are separate fields. Prompt throughput,
+decode throughput and full-cycle throughput are never combined into one number.
+Cells that cannot expose a phase retain a structured `not_measured` status
+instead of a fabricated zero.
+
+Each measured cell records actual prompt and generated token counts. Rates use
+those counts, not configured maximums. CUDA is synchronized at timing
+boundaries, peak memory is reset per cell, and failures/OOM downshifts remain in
+the artifact.
+
+## Correctness and scope
+
+Greedy output IDs, stop reasons and policy identity are exact comparisons.
+Sampled-token log-probabilities use the preregistered dtype-aware tolerances.
+The workload also tests batch partitions `[4]`, `[2,2]` and `[1,1,1,1]`.
+
+The result applies to the recorded RTX 4080, WSL2/Linux stack and exact model
+revisions. It does not imply gains on other GPUs, a task-quality improvement,
+or execution of distributed verl.
diff --git a/docs/competitive-landscape.md b/docs/competitive-landscape.md
new file mode 100644
index 0000000..4c00787
--- /dev/null
+++ b/docs/competitive-landscape.md
@@ -0,0 +1,28 @@
+# Competitive landscape
+
+miniVERL's v0.11 development line is focused on current-policy rollout speed,
+grouped samples and deterministic reward composition on one consumer GPU. This
+page records the upstream state used to make engineering choices; it is not a
+leaderboard. A capability observed in source is kept separate from a workload
+measured on the local RTX 4080.
+
+Inspected: **2026-08-29**.
+
+| Project | Exact source inspected | Capability observed in source or stable documentation | miniVERL state at the start of v0.11 | Locally measured | Caveat |
+| --- | --- | --- | --- | --- | --- |
+| [mini-opd](https://github.com/thu-nics/mini-opd) | `b47eaa1728fc3a7ff0b0b627ec2c93d60f07aa16` (`main`; no GitHub release) | SGLang HTTP rollouts, `n_rollouts` (default 4), task rewards, group reward processing, macro-batching, optional one-step-stale background rollout, and checkpoint weight reload | Local HF prompt rollouts; no typed grouped-sample contract and no external generation engine | **No** — source audit only | Its README starts SGLang in a separate terminal. Async measurements would not be compared with miniVERL's strict synchronous path without a separate staleness label. |
+| [NVIDIA NeMo RL](https://github.com/NVIDIA-NeMo/RL) | stable `v0.7.0`, commit `81aa43dda4765b0429cf31dab44441e4e4383911`; current `main` also inspected at `46dfb92fb5ceed5b2d593d652361b10d0acc6ef6` | A documented single-GPU OPD example, vLLM and SGLang generation, refit/weight synchronization, multi-teacher MOPD, and broader Ray/distributed scope | One-GPU local trainer and a fail-closed portable verl bridge; no NeMo RL runtime integration | **No** — install and one-step feasibility remain to be measured | “Single GPU” is not evidence that the published example fits this repository's 16 GiB RTX 4080 envelope. The stable MOPD objective and runtime differ from miniVERL's closed profiles. |
+| [SGLang](https://github.com/sgl-project/sglang) | stable `v0.5.18`; current `main` `0a585d5bb108cab8f0922b483d7f55812f05e245` | Generation server and engine APIs considered for a managed rollout backend | Not integrated | **No** | Public support requires a local lifecycle, raw-token, synchronization, cache-invalidation and teardown qualification; an API being present is not that qualification. |
+| [vLLM](https://github.com/vllm-project/vllm) | stable `v0.28.0`; current `main` `cacc429f62c3738c9c95093e9bd410e96103221a` | Batched generation and model-serving APIs considered for a managed rollout backend | The verl-shaped config vocabulary may mention vLLM, but miniVERL currently executes local HF generation | **No** | No vLLM process or distributed verl job has been run by the v0.11 line yet. Support depends on measured policy refresh, cache invalidation, memory and teardown behavior. |
+
+## Selection rule
+
+`hf_reference` remains the compatibility oracle. A batched local `hf_cached`
+backend is the first implementation target. SGLang and vLLM will be spiked on
+the same WSL2 RTX 4080 workload; only one becomes a supported v0.11 backend,
+and only if it has a measured advantage over `hf_cached` together with strict
+policy synchronization and lifecycle cleanup. Until then, both are
+**not measured** rather than recommended.
+
+The comparison workload, metrics and invalidation rules are preregistered in
+[`rollout-runtime-v2.yaml`](https://github.com/DaoyuanLi2816/mini-verl/blob/main/benchmarks/preregistration/rollout-runtime-v2.yaml).
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index cc47d10..838f5a6 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -1,12 +1,12 @@
{% extends "base.html" %}
{% block announce %}
-
+
Stable documentation
{% endblock %}
diff --git a/docs/release-checklist.md b/docs/release-checklist.md
index fa01131..6213883 100644
--- a/docs/release-checklist.md
+++ b/docs/release-checklist.md
@@ -4,7 +4,26 @@ 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.10.2 development
+## v0.11.0 development
+
+- [x] Advance the canonical development line to `0.11.0.dev0` while stable
+ release and documentation remain at immutable `v0.10.1`.
+- [x] Preregister the RTX 4080 Rollout Runtime v2 workload before measuring
+ the pre-v0.11 `hf_reference` baseline.
+- [ ] Freeze the `hf_reference` result before implementing `hf_cached`.
+- [ ] Add typed policy identity, lifecycle and strict synchronization contracts.
+- [ ] Qualify `hf_cached` at 64/256/512 response bounds and require at least 2x
+ speedup at 256 and 512 without exceeding 14.5 GiB peak reserved VRAM.
+- [ ] Add transactional `samples_per_prompt > 1` and exact no-skip/no-duplicate
+ resume semantics without changing the published `n=1` profiles.
+- [ ] Add the new deterministic task-reward plus distillation-advantage profile;
+ keep direct GKD and existing PG-k1 identities unchanged.
+- [ ] Measure SGLang and vLLM on the same WSL2 RTX 4080 workload and support at
+ most one external engine after policy-sync, cache and teardown gates pass.
+- [ ] Run exact-candidate-wheel full qualification, dry-run and publication
+ only after every v0.11 acceptance gate passes.
+
+## v0.10.2 development (superseded by v0.11 scope)
- [ ] Define and review the next focused release scope before changing product
behavior or scientific evidence.
diff --git a/mkdocs.yml b/mkdocs.yml
index 7cbfbcc..6b9f7b6 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -71,6 +71,9 @@ nav:
- Demo recording script: verl-bridge-demo.md
- Legacy environment/PPO bridge: legacy-verl-bridge.md
- Community benchmarks: community-benchmarks.md
+ - Rollout Runtime v2:
+ - Competitive landscape: competitive-landscape.md
+ - Benchmark method: benchmarks/rollout-runtime-v2-method.md
- Maintainer:
- Architecture: maintainer-architecture.md
- Upstream support policy: upstream-support-policy.md
diff --git a/release-state.yaml b/release-state.yaml
index 67a1f6a..9b54407 100644
--- a/release-state.yaml
+++ b/release-state.yaml
@@ -26,4 +26,4 @@ stable:
released_at: "2026-08-16"
development:
- version: "0.10.2.dev0"
+ version: "0.11.0.dev0"
diff --git a/scripts/benchmark_rollout_runtime.py b/scripts/benchmark_rollout_runtime.py
new file mode 100644
index 0000000..ba5d630
--- /dev/null
+++ b/scripts/benchmark_rollout_runtime.py
@@ -0,0 +1,495 @@
+#!/usr/bin/env python3
+"""Measure the preregistered pre-v0.11 Hugging Face rollout baseline.
+
+The baseline intentionally exercises the public ``generate_batch`` contract
+that existed before Rollout Runtime v2. It does not import or anticipate the
+new backend implementation.
+"""
+
+from __future__ import annotations
+
+import argparse
+import gc
+import hashlib
+import importlib.metadata
+import json
+import platform
+import statistics
+import subprocess
+import time
+from pathlib import Path
+from typing import Any
+
+import jsonschema
+import torch
+import yaml
+
+from miniverl import __version__
+from miniverl.config.models import StudentModelConfig
+from miniverl.models.hf import HFBackend
+from miniverl.models.tokenizers import HFTokenizerAdapter
+from miniverl.utils.runs import canonical_json, write_json
+
+ROOT = Path(__file__).resolve().parents[1]
+PREREGISTRATION = ROOT / "benchmarks/preregistration/rollout-runtime-v2.yaml"
+SCHEMA = ROOT / "benchmarks/schema/rollout-runtime-v2.schema.json"
+DEFAULT_OUTPUT = ROOT / "benchmarks/results/rollout-runtime-v2-hf-reference.json"
+FROZEN_CALCULATOR = ROOT / "benchmarks/results/gpu-calc-hard-equal-update-v2.json"
+FROZEN_CALCULATOR_SHA256 = "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc"
+
+
+def _sha256(path: Path) -> str:
+ digest = hashlib.sha256()
+ with path.open("rb") as handle:
+ for block in iter(lambda: handle.read(1024 * 1024), b""):
+ digest.update(block)
+ return digest.hexdigest()
+
+
+def _git(*args: str) -> str:
+ return subprocess.check_output(["git", *args], cwd=ROOT, text=True).strip()
+
+
+def _phase(
+ status: str,
+ *,
+ values: list[float] | None = None,
+ note: str = "",
+) -> dict[str, Any]:
+ payload: dict[str, Any] = {"status": status}
+ if values:
+ payload["median_seconds"] = float(statistics.median(values))
+ payload["minimum_seconds"] = float(min(values))
+ if note:
+ payload["note"] = note
+ return payload
+
+
+def _package_version(name: str) -> str | None:
+ try:
+ return importlib.metadata.version(name)
+ except importlib.metadata.PackageNotFoundError:
+ return None
+
+
+def _environment() -> dict[str, Any]:
+ return {
+ "platform": platform.platform(),
+ "python": platform.python_version(),
+ "gpu": torch.cuda.get_device_name(0),
+ "gpu_total_memory_bytes": int(torch.cuda.get_device_properties(0).total_memory),
+ "cuda_runtime": torch.version.cuda,
+ "packages": {
+ name: _package_version(name)
+ for name in ("torch", "transformers", "peft", "bitsandbytes", "accelerate")
+ },
+ }
+
+
+def _rss_bytes() -> int | None:
+ try:
+ import resource
+
+ return int(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * 1024)
+ except (ImportError, OSError):
+ return None
+
+
+def _fixed_prompt(tokenizer: Any, *, length: int, index: int) -> list[int]:
+ prefix = list(tokenizer.encode(f"System benchmark prompt {index}. Continue with text."))
+ filler = list(tokenizer.encode(" benchmark"))
+ if not filler:
+ raise RuntimeError("tokenizer produced no filler tokens")
+ while len(prefix) < length:
+ prefix.extend(filler)
+ prompt = prefix[:length]
+ if tokenizer.eos_token_id is not None and prompt[-1] == tokenizer.eos_token_id:
+ replacement = next(token for token in filler if token != tokenizer.eos_token_id)
+ prompt[-1] = replacement
+ if len(prompt) != length:
+ raise AssertionError("fixed prompt construction changed the requested token length")
+ return prompt
+
+
+def _digest_outputs(outputs: list[Any]) -> tuple[str, str]:
+ ids = [output.token_ids for output in outputs]
+ probabilities = [output.logprobs for output in outputs]
+ return (
+ hashlib.sha256(canonical_json(ids).encode("utf-8")).hexdigest(),
+ hashlib.sha256(canonical_json(probabilities).encode("utf-8")).hexdigest(),
+ )
+
+
+def _generate_once(
+ backend: HFBackend,
+ *,
+ prompts: list[list[int]],
+ seeds: list[int],
+ response_bound: int,
+ sampling: dict[str, Any],
+ physical_batch_size: int,
+) -> tuple[list[Any], int]:
+ outputs: list[Any] = []
+ physical_batches = 0
+ for start in range(0, len(prompts), physical_batch_size):
+ end = start + physical_batch_size
+ outputs.extend(
+ backend.generate_batch(
+ prompts[start:end],
+ max_new_tokens=response_bound,
+ temperature=float(sampling["temperature"]),
+ top_p=float(sampling["top_p"]),
+ top_k=int(sampling["top_k"]),
+ seeds=seeds[start:end],
+ record_logprobs=True,
+ )
+ )
+ physical_batches += 1
+ return outputs, physical_batches
+
+
+def _failed_cell(
+ *,
+ cell_id: str,
+ prompt_length: int,
+ response_bound: int,
+ samples_per_prompt: int,
+ sampling: str,
+ status: str,
+ error: str,
+) -> dict[str, Any]:
+ unavailable = _phase("failed", note=error)
+ return {
+ "cell_id": cell_id,
+ "prompt_length": prompt_length,
+ "response_bound": response_bound,
+ "samples_per_prompt": samples_per_prompt,
+ "sampling": sampling,
+ "status": status,
+ "counts": {
+ "logical_prompts": 0,
+ "generated_trajectories": 0,
+ "prompt_tokens": 0,
+ "generated_tokens": 0,
+ "physical_batches": 0,
+ },
+ "phases": {
+ name: dict(unavailable)
+ for name in (
+ "cold_start",
+ "prefill",
+ "decode",
+ "rollout_total",
+ "policy_sync",
+ "teacher_scoring",
+ "actor_update",
+ "full_cycle",
+ "teardown",
+ )
+ },
+ "rates": {
+ "time_to_first_token_seconds": None,
+ "prompt_tokens_per_second": None,
+ "output_tokens_per_second": None,
+ },
+ "memory": {
+ "peak_allocated_bytes": int(torch.cuda.max_memory_allocated()),
+ "peak_reserved_bytes": int(torch.cuda.max_memory_reserved()),
+ "process_rss_bytes": _rss_bytes(),
+ "teardown_residual_allocated_bytes": None,
+ },
+ "output_token_ids_sha256": None,
+ "sampled_logprobs_sha256": None,
+ "oom_downshifts": 0,
+ "error": error,
+ }
+
+
+def _cell(
+ backend: HFBackend,
+ *,
+ tokenizer: Any,
+ prompt_length: int,
+ response_bound: int,
+ samples_per_prompt: int,
+ sampling: dict[str, Any],
+ workload: dict[str, Any],
+ cold_start_seconds: float,
+) -> dict[str, Any]:
+ sampling_name = str(sampling["name"])
+ cell_id = f"p{prompt_length}-r{response_bound}-n{samples_per_prompt}-{sampling_name}"
+ logical_prompts = int(workload["logical_prompts"])
+ run_seed = int(workload["run_seed"])
+ base_prompts = [
+ _fixed_prompt(tokenizer, length=prompt_length, index=index)
+ for index in range(logical_prompts)
+ ]
+ prompts: list[list[int]] = []
+ seeds: list[int] = []
+ for prompt in base_prompts:
+ prompt_digest = hashlib.sha256(canonical_json(prompt).encode("utf-8")).hexdigest()
+ for sample_index in range(samples_per_prompt):
+ prompts.append(prompt)
+ seed_payload = f"rollout-runtime-v2-seed-v1:{run_seed}:{prompt_digest}:0:{sample_index}"
+ seeds.append(int(hashlib.sha256(seed_payload.encode("ascii")).hexdigest()[:16], 16))
+
+ physical_batch_size = min(4, len(prompts))
+ try:
+ for _ in range(int(workload["warmup_repetitions"])):
+ _generate_once(
+ backend,
+ prompts=prompts,
+ seeds=seeds,
+ response_bound=response_bound,
+ sampling=sampling,
+ physical_batch_size=physical_batch_size,
+ )
+ torch.cuda.synchronize()
+ torch.cuda.reset_peak_memory_stats()
+ measured_seconds: list[float] = []
+ output_digests: list[tuple[str, str]] = []
+ final_outputs: list[Any] = []
+ physical_batches = 0
+ for _ in range(int(workload["measured_repetitions"])):
+ started = time.perf_counter()
+ final_outputs, physical_batches = _generate_once(
+ backend,
+ prompts=prompts,
+ seeds=seeds,
+ response_bound=response_bound,
+ sampling=sampling,
+ physical_batch_size=physical_batch_size,
+ )
+ torch.cuda.synchronize()
+ measured_seconds.append(time.perf_counter() - started)
+ output_digests.append(_digest_outputs(final_outputs))
+ if len(set(output_digests)) != 1:
+ raise RuntimeError("seeded reference output changed across measured repetitions")
+ generated_tokens = sum(len(output.token_ids) for output in final_outputs)
+ prompt_tokens = sum(len(prompt) for prompt in prompts)
+ median_seconds = float(statistics.median(measured_seconds))
+ output_ids_digest, logprobs_digest = output_digests[0]
+ return {
+ "cell_id": cell_id,
+ "prompt_length": prompt_length,
+ "response_bound": response_bound,
+ "samples_per_prompt": samples_per_prompt,
+ "sampling": sampling_name,
+ "status": "completed",
+ "counts": {
+ "logical_prompts": logical_prompts,
+ "generated_trajectories": len(final_outputs),
+ "prompt_tokens": prompt_tokens,
+ "generated_tokens": generated_tokens,
+ "physical_batches": physical_batches,
+ },
+ "phases": {
+ "cold_start": _phase(
+ "measured",
+ values=[cold_start_seconds],
+ note="shared actor/tokenizer load measurement repeated on each cell",
+ ),
+ "prefill": _phase(
+ "not_measured",
+ note="the pre-v0.11 public backend does not expose a prefill boundary",
+ ),
+ "decode": _phase(
+ "not_measured",
+ note="the pre-v0.11 public backend does not expose a decode boundary",
+ ),
+ "rollout_total": _phase("measured", values=measured_seconds),
+ "policy_sync": _phase(
+ "not_applicable",
+ note="hf_reference uses the actor already loaded in the trainer process",
+ ),
+ "teacher_scoring": _phase(
+ "not_measured",
+ note="rollout-only baseline cell; full-cycle measurement is a separate gate",
+ ),
+ "actor_update": _phase(
+ "not_measured",
+ note="rollout-only baseline cell; full-cycle measurement is a separate gate",
+ ),
+ "full_cycle": _phase(
+ "not_measured",
+ note="rollout-only baseline cell; no phase is represented as zero",
+ ),
+ "teardown": _phase(
+ "not_measured",
+ note="filled after the shared backend is closed",
+ ),
+ },
+ "rates": {
+ "time_to_first_token_seconds": None,
+ "prompt_tokens_per_second": prompt_tokens / median_seconds,
+ "output_tokens_per_second": generated_tokens / median_seconds,
+ },
+ "memory": {
+ "peak_allocated_bytes": int(torch.cuda.max_memory_allocated()),
+ "peak_reserved_bytes": int(torch.cuda.max_memory_reserved()),
+ "process_rss_bytes": _rss_bytes(),
+ "teardown_residual_allocated_bytes": None,
+ },
+ "output_token_ids_sha256": output_ids_digest,
+ "sampled_logprobs_sha256": logprobs_digest,
+ "oom_downshifts": 0,
+ "error": None,
+ }
+ except torch.OutOfMemoryError as exc:
+ torch.cuda.empty_cache()
+ return _failed_cell(
+ cell_id=cell_id,
+ prompt_length=prompt_length,
+ response_bound=response_bound,
+ samples_per_prompt=samples_per_prompt,
+ sampling=sampling_name,
+ status="oom",
+ error=f"{type(exc).__name__}: {exc}",
+ )
+ except Exception as exc:
+ return _failed_cell(
+ cell_id=cell_id,
+ prompt_length=prompt_length,
+ response_bound=response_bound,
+ samples_per_prompt=samples_per_prompt,
+ sampling=sampling_name,
+ status="failed",
+ error=f"{type(exc).__name__}: {exc}",
+ )
+
+
+def run(*, wheel: Path, output: Path, expected_commit: str) -> dict[str, Any]:
+ if not torch.cuda.is_available():
+ raise RuntimeError("rollout-runtime-v2 baseline requires one CUDA GPU")
+ if platform.system() != "Linux" or "microsoft" not in platform.release().lower():
+ raise RuntimeError("formal rollout-runtime-v2 baseline requires WSL2/Linux")
+ if _sha256(FROZEN_CALCULATOR) != FROZEN_CALCULATOR_SHA256:
+ raise RuntimeError("frozen calculator benchmark hash changed")
+ commit = _git("rev-parse", "HEAD")
+ if commit != expected_commit:
+ raise RuntimeError(f"expected source commit {expected_commit}, found {commit}")
+ if _git("status", "--porcelain"):
+ raise RuntimeError("formal baseline requires a clean worktree")
+ if not wheel.is_file():
+ raise FileNotFoundError(wheel)
+
+ prereg = yaml.safe_load(PREREGISTRATION.read_text(encoding="utf-8"))
+ if prereg["status"] != "preregistered_before_baseline_measurement":
+ raise RuntimeError("rollout runtime preregistration is not in its frozen initial state")
+ actor = prereg["models"]["actor"]
+ spec = StudentModelConfig(
+ model_id=actor["id"],
+ revision=actor["revision"],
+ tokenizer_revision=actor["tokenizer_revision"],
+ dtype=prereg["models"]["dtype"],
+ quantization=prereg["models"]["quantization"],
+ attn_implementation=prereg["models"]["attention_implementation"],
+ gradient_checkpointing=False,
+ )
+
+ started = time.perf_counter()
+ tokenizer = HFTokenizerAdapter.load(
+ spec.tokenizer_id or spec.model_id,
+ revision=spec.tokenizer_revision or spec.revision,
+ trust_remote_code=spec.trust_remote_code,
+ local_files_only=False,
+ )
+ backend = HFBackend.load(
+ spec,
+ device="cuda",
+ tokenizer=tokenizer,
+ trainable=False,
+ local_files_only=False,
+ )
+ torch.cuda.synchronize()
+ cold_start_seconds = time.perf_counter() - started
+ workload = prereg["workload"]
+ cells: list[dict[str, Any]] = []
+ for prompt_length in workload["prompt_lengths"]:
+ for response_bound in workload["response_bounds"]:
+ for samples_per_prompt in workload["samples_per_prompt"]:
+ for sampling in workload["sampling"]:
+ cells.append(
+ _cell(
+ backend,
+ tokenizer=tokenizer,
+ prompt_length=int(prompt_length),
+ response_bound=int(response_bound),
+ samples_per_prompt=int(samples_per_prompt),
+ sampling=sampling,
+ workload=workload,
+ cold_start_seconds=cold_start_seconds,
+ )
+ )
+
+ teardown_started = time.perf_counter()
+ backend.release()
+ del backend
+ del tokenizer
+ gc.collect()
+ torch.cuda.empty_cache()
+ torch.cuda.synchronize()
+ teardown_seconds = time.perf_counter() - teardown_started
+ residual = int(torch.cuda.memory_allocated())
+ for cell in cells:
+ cell["phases"]["teardown"] = _phase(
+ "measured",
+ values=[teardown_seconds],
+ note="shared backend teardown measurement repeated on each cell",
+ )
+ cell["memory"]["teardown_residual_allocated_bytes"] = residual
+
+ failures = [f"{cell['cell_id']}: {cell['error']}" for cell in cells if cell["error"]]
+ result = {
+ "schema_version": 1,
+ "name": "rollout-runtime-v2-hf-reference",
+ "measurement_status": "completed_with_failures" if failures else "measured_baseline",
+ "source": {
+ "commit": commit,
+ "dirty": False,
+ "miniverl_version": __version__,
+ "wheel_sha256": _sha256(wheel),
+ },
+ "preregistration_sha256": _sha256(PREREGISTRATION),
+ "workload_manifest_sha256": hashlib.sha256(
+ canonical_json(workload).encode("utf-8")
+ ).hexdigest(),
+ "frozen_calculator_sha256": FROZEN_CALCULATOR_SHA256,
+ "environment": _environment(),
+ "models": {
+ "actor": actor,
+ "teacher": prereg["models"]["teacher"],
+ "dtype": prereg["models"]["dtype"],
+ "quantization": prereg["models"]["quantization"],
+ },
+ "backend": {
+ "name": "hf_reference",
+ "version": str(_package_version("transformers")),
+ "reproducibility_class": "same_process_seeded_reference",
+ },
+ "cells": cells,
+ "failures": failures,
+ }
+ schema = json.loads(SCHEMA.read_text(encoding="utf-8"))
+ jsonschema.validate(result, schema)
+ write_json(output, result)
+ return result
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--wheel", type=Path, required=True)
+ parser.add_argument("--expected-commit", required=True)
+ parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT)
+ args = parser.parse_args()
+ result = run(
+ wheel=args.wheel.resolve(),
+ output=args.output.resolve(),
+ expected_commit=args.expected_commit,
+ )
+ print(json.dumps({"status": result["measurement_status"], "cells": len(result["cells"])}))
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/src/miniverl/__init__.py b/src/miniverl/__init__.py
index b7e2ecb..32749a4 100644
--- a/src/miniverl/__init__.py
+++ b/src/miniverl/__init__.py
@@ -14,6 +14,6 @@
from __future__ import annotations
-__version__ = "0.10.2.dev0"
+__version__ = "0.11.0.dev0"
__all__ = ["__version__"]
diff --git a/tests/unit/test_release_assets.py b/tests/unit/test_release_assets.py
index 75c661a..034f4dd 100644
--- a/tests/unit/test_release_assets.py
+++ b/tests/unit/test_release_assets.py
@@ -24,7 +24,7 @@ def _fixture(tmp_path: Path) -> tuple[Path, Path, Path, Path]:
qualification = tmp_path / "qualification"
candidate.mkdir(parents=True)
qualification.mkdir(parents=True)
- version = "0.10.2.dev0"
+ version = "0.11.0.dev0"
commit = "a" * 40
wheel = candidate / f"miniverl-{version}-py3-none-any.whl"
sdist = candidate / f"miniverl-{version}.tar.gz"
@@ -219,8 +219,8 @@ def test_builds_exact_canonical_layout_and_checks_it(tmp_path: Path) -> None:
output = _build(tmp_path)
expected = {
- "dist/miniverl-0.10.2.dev0-py3-none-any.whl",
- "dist/miniverl-0.10.2.dev0.tar.gz",
+ "dist/miniverl-0.11.0.dev0-py3-none-any.whl",
+ "dist/miniverl-0.11.0.dev0.tar.gz",
"SHA256SUMS",
"candidate-manifest.json",
"release-verification.json",
diff --git a/tests/unit/test_rollout_runtime_v2_benchmark.py b/tests/unit/test_rollout_runtime_v2_benchmark.py
new file mode 100644
index 0000000..83e72a1
--- /dev/null
+++ b/tests/unit/test_rollout_runtime_v2_benchmark.py
@@ -0,0 +1,136 @@
+"""Preregistration and result contracts for Rollout Runtime v2."""
+
+from __future__ import annotations
+
+import hashlib
+import json
+from pathlib import Path
+
+import jsonschema
+import yaml
+
+ROOT = Path(__file__).resolve().parents[2]
+PREREGISTRATION = ROOT / "benchmarks/preregistration/rollout-runtime-v2.yaml"
+SCHEMA = ROOT / "benchmarks/schema/rollout-runtime-v2.schema.json"
+FROZEN = ROOT / "benchmarks/results/gpu-calc-hard-equal-update-v2.json"
+
+
+def test_rollout_runtime_v2_workload_is_preregistered_before_baseline() -> None:
+ payload = yaml.safe_load(PREREGISTRATION.read_text(encoding="utf-8"))
+
+ assert payload["status"] == "preregistered_before_baseline_measurement"
+ assert payload["models"]["actor"]["revision"] == ("c1899de289a04d12100db370d81485cdf75e47ca")
+ assert payload["models"]["teacher"]["revision"] == ("70d244cc86ccca08cf5af4e1e306ecf908b1ad5e")
+ assert payload["workload"]["prompt_lengths"] == [128, 512]
+ assert payload["workload"]["response_bounds"] == [64, 256, 512]
+ assert payload["workload"]["samples_per_prompt"] == [1, 4]
+ assert {row["name"] for row in payload["workload"]["sampling"]} == {
+ "greedy",
+ "seeded_stochastic",
+ }
+ assert payload["performance_gates"]["hf_cached_speedup_over_hf_reference"] == {
+ "response_256": 2.0,
+ "response_512": 2.0,
+ }
+
+
+def test_rollout_runtime_v2_preserves_frozen_calculator() -> None:
+ assert hashlib.sha256(FROZEN.read_bytes()).hexdigest() == (
+ "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc"
+ )
+
+
+def _phase(status: str, measured: bool = False) -> dict[str, object]:
+ payload: dict[str, object] = {"status": status}
+ if measured:
+ payload.update({"median_seconds": 1.0, "minimum_seconds": 0.9})
+ return payload
+
+
+def test_rollout_runtime_v2_schema_keeps_unavailable_phases_distinct_from_zero() -> None:
+ phases = {
+ "cold_start": _phase("measured", measured=True),
+ "prefill": _phase("not_measured"),
+ "decode": _phase("not_measured"),
+ "rollout_total": _phase("measured", measured=True),
+ "policy_sync": _phase("not_applicable"),
+ "teacher_scoring": _phase("not_measured"),
+ "actor_update": _phase("not_measured"),
+ "full_cycle": _phase("not_measured"),
+ "teardown": _phase("measured", measured=True),
+ }
+ result = {
+ "schema_version": 1,
+ "name": "rollout-runtime-v2-hf-reference",
+ "measurement_status": "measured_baseline",
+ "source": {
+ "commit": "a" * 40,
+ "dirty": False,
+ "miniverl_version": "0.11.0.dev0",
+ "wheel_sha256": "b" * 64,
+ },
+ "preregistration_sha256": "c" * 64,
+ "workload_manifest_sha256": "d" * 64,
+ "frozen_calculator_sha256": (
+ "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc"
+ ),
+ "environment": {},
+ "models": {
+ "actor": {
+ "id": "Qwen/Qwen3-0.6B",
+ "revision": "e" * 40,
+ "tokenizer_revision": "e" * 40,
+ },
+ "teacher": {
+ "id": "Qwen/Qwen3-1.7B",
+ "revision": "f" * 40,
+ "tokenizer_revision": "f" * 40,
+ },
+ "dtype": "bfloat16",
+ "quantization": "nf4",
+ },
+ "backend": {
+ "name": "hf_reference",
+ "version": "5.14.1",
+ "reproducibility_class": "same_process_seeded_reference",
+ },
+ "cells": [
+ {
+ "cell_id": "p128-r64-n1-greedy",
+ "prompt_length": 128,
+ "response_bound": 64,
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed",
+ "counts": {
+ "logical_prompts": 4,
+ "generated_trajectories": 4,
+ "prompt_tokens": 512,
+ "generated_tokens": 256,
+ "physical_batches": 1,
+ },
+ "phases": phases,
+ "rates": {
+ "time_to_first_token_seconds": None,
+ "prompt_tokens_per_second": 512.0,
+ "output_tokens_per_second": 256.0,
+ },
+ "memory": {
+ "peak_allocated_bytes": 1,
+ "peak_reserved_bytes": 2,
+ "process_rss_bytes": 3,
+ "teardown_residual_allocated_bytes": 0,
+ },
+ "output_token_ids_sha256": "1" * 64,
+ "sampled_logprobs_sha256": "2" * 64,
+ "oom_downshifts": 0,
+ "error": None,
+ }
+ ],
+ "failures": [],
+ }
+
+ schema = json.loads(SCHEMA.read_text(encoding="utf-8"))
+ jsonschema.validate(result, schema)
+ for name in ("prefill", "decode", "teacher_scoring", "actor_update", "full_cycle"):
+ assert "median_seconds" not in phases[name]
diff --git a/tests/unit/test_v1_readiness.py b/tests/unit/test_v1_readiness.py
index dc06e2c..ad26a61 100644
--- a/tests/unit/test_v1_readiness.py
+++ b/tests/unit/test_v1_readiness.py
@@ -42,5 +42,5 @@ def test_polish_does_not_change_version_or_beta_classifier() -> None:
state = yaml.safe_load((ROOT / "release-state.yaml").read_text(encoding="utf-8"))
pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
assert state["stable"]["version"] == "0.10.1"
- assert state["development"]["version"] == "0.10.2.dev0"
+ assert state["development"]["version"] == "0.11.0.dev0"
assert "Development Status :: 4 - Beta" in pyproject
From 8e5ebdadf9accf13e17418260092a8917067e386 Mon Sep 17 00:00:00 2001
From: Daoyuan Li <94409450+DaoyuanLi2816@users.noreply.github.com>
Date: Sat, 29 Aug 2026 03:22:49 -0700
Subject: [PATCH 2/2] Freeze the HF rollout reference baseline
---
CHANGELOG.md | 2 +
benchmarks/README.md | 1 +
.../rollout-runtime-v2/hf-reference-raw.json | 1802 ++++++++++++++++
.../rollout-runtime-v2-hf-reference.json | 1812 +++++++++++++++++
.../schema/rollout-runtime-v2.schema.json | 23 +
docs/benchmarks/rollout-runtime-v2.md | 72 +
docs/release-checklist.md | 5 +-
mkdocs.yml | 1 +
scripts/finalize_rollout_runtime_baseline.py | 144 ++
tests/unit/test_packaging.py | 1 +
.../unit/test_rollout_runtime_v2_benchmark.py | 65 +
11 files changed, 3927 insertions(+), 1 deletion(-)
create mode 100644 benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json
create mode 100644 benchmarks/results/rollout-runtime-v2-hf-reference.json
create mode 100644 docs/benchmarks/rollout-runtime-v2.md
create mode 100644 scripts/finalize_rollout_runtime_baseline.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f5dee61..a06bcd3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@ All notable changes to miniVERL are recorded here. The format follows
RTX 4080 rollout workload before changing generation behavior.
- Added an exact-source competitive landscape that separates upstream claims,
miniVERL's current state and measurements that have not yet been run.
+- Froze the 24-cell pre-v0.11 `hf_reference` actor-rollout baseline on the WSL2
+ RTX 4080, with exact wheel, weight, policy and raw-measurement identity.
### Documentation narrative
diff --git a/benchmarks/README.md b/benchmarks/README.md
index 8faecbc..9a11731 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -80,6 +80,7 @@ Listed so you can check that this repository does not.
| File | Hardware | What it shows |
| --- | --- | --- |
+| `results/rollout-runtime-v2-hf-reference.json` | WSL2 RTX 4080 16 GB | Pre-v0.11 actor-rollout systems baseline: all 24 preregistered prompt/response/n/sampling cells completed. It freezes throughput and memory for the future `hf_cached` comparison; teacher scoring, updates, full-cycle timing and typed grouped semantics are not measured here. [Method, table and boundaries.](../docs/benchmarks/rollout-runtime-v2.md) |
| `results/alignment-external-v1.json` | RTX 4080 16 GB | **Preregistered early stop, not a method comparison.** Two declared lineages and eight candidates all measured 0/64 retained JSONNav utility against an unchanged 20% floor. No checkpoint, teacher, continuation arm or final-test result exists. [Study, correction provenance and evaluator boundary.](../docs/alignment-external/alignment-external-v1.md) |
| `results/alignment-lab-v1.json` | RTX 4080 16 GB | Alignment Lab v1: six methods from one Qwen3-0.6B SFT checkpoint, three seeds and 48 paired policy tasks per arm. The SFT start saturated alignment and utility; no continuation method improved it, so the pilot recommends no online teacher querying. [Report, figures and caveats.](../docs/alignment-lab/alignment-lab-v1.md) |
| `results/consumer-runtime-v1.json` | RTX 4080 16 GB | Preregistered eight-cell systems matrix for sequential/batch-2/batch-4/auto updates under dual-model and shared-backbone ownership. Batch-4 reached 3.866 and 3.475 trajectories/s at 3.035 and 2.227 GiB reserved; all equivalence gates passed. [Figure, method and caveats.](../docs/consumer-runtime-v1.md) |
diff --git a/benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json b/benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json
new file mode 100644
index 0000000..67093c5
--- /dev/null
+++ b/benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json
@@ -0,0 +1,1802 @@
+{
+ "backend": {
+ "name": "hf_reference",
+ "reproducibility_class": "same_process_seeded_reference",
+ "version": "5.14.1"
+ },
+ "cells": [
+ {
+ "cell_id": "p128-r64-n1-greedy",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 572068864,
+ "peak_reserved_bytes": 1109393408,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 2.682791788000003,
+ "minimum_seconds": 2.658286367999999,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 95.42298479705937,
+ "prompt_tokens_per_second": 190.84596959411874,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "1e08a89c7b3790ce57c3f26d242c0cc91c11df1eeec95b2a2a00ad2afd17d746",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 576205312,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 8.552983923,
+ "minimum_seconds": 8.483651064,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.931074617314,
+ "prompt_tokens_per_second": 59.862149234628,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "ba2f11193cd4eecb8e13f902cb1f94be663a23fa8604436173c7e8ac96885339",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n4-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 572068864,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 10.549273207999988,
+ "minimum_seconds": 10.186481839999999,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 97.06829843248867,
+ "prompt_tokens_per_second": 194.13659686497735,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "ac873b82dc6266f08d49daa8851ae5ff969a9502fc09d0c46f0f11ef3fc7a983",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 576205312,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 34.194360034,
+ "minimum_seconds": 33.98181499500001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.94645897691375,
+ "prompt_tokens_per_second": 59.8929179538275,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "791ccbc8d12dd8173081df20a215540d059386148e537b585a9d189b1753880b",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n1-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 590592000,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 10.681579509000017,
+ "minimum_seconds": 10.601817451000045,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 95.86597180100608,
+ "prompt_tokens_per_second": 47.93298590050304,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "f0934e8f8a655f7db7a6c5fe450685ae02a92becbe1a11963b3178b5f991921b",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 598225408,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 34.191396914999984,
+ "minimum_seconds": 34.07746694100001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.949054218102585,
+ "prompt_tokens_per_second": 14.974527109051293,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "103374fb70459e305d3e95b24cede77ebe45c02c5f6235ee07972ccbe164c934",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n4-greedy",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 590592000,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 44.35223904600002,
+ "minimum_seconds": 41.96331140099994,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 92.3515946004851,
+ "prompt_tokens_per_second": 46.17579730024255,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "e5c0366e55822136810646af6f6a2ec1de385daf66816217678c76dc09145d88",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 598225408,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 136.20863945600013,
+ "minimum_seconds": 136.123254523,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.07151393890211,
+ "prompt_tokens_per_second": 15.035756969451056,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "facbbe2eb781282a5e9dc8b3667f98828457f64d3e222c6aec076a88ec5ff1d1",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n1-greedy",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 618349568,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 21.984175283000013,
+ "minimum_seconds": 21.751613103999944,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 93.15791807681244,
+ "prompt_tokens_per_second": 23.28947951920311,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "044bcce426878c05d803111ef04848dc025b84d1f46a0001838fecad8ace7792",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 67.754382588,
+ "minimum_seconds": 67.33902477300012,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.226826985546495,
+ "prompt_tokens_per_second": 7.556706746386624,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "d68a712f6a3a96e323d054d7918943fc9397399a6a0cc18628947a4749034719",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n4-greedy",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 618349568,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 88.1730873009999,
+ "minimum_seconds": 86.93808670099997,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 92.90816790881611,
+ "prompt_tokens_per_second": 23.227041977204028,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "fa8462caa7158d8ca5322eabd4df3c9a82db7be5f87a2952a93af96572a23606",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 270.3976930829999,
+ "minimum_seconds": 270.2917211260001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.296116459416037,
+ "prompt_tokens_per_second": 7.574029114854009,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "269cef51deb330312a1e377689cd9d4c40a7a3af3f494cf5712c49e14026fa82",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n1-greedy",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 611695104,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 2.7622460959996715,
+ "minimum_seconds": 2.755931521000093,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 92.67820139948546,
+ "prompt_tokens_per_second": 741.4256111958837,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "1295404c7e252083aaad1026b97935061f37c40d2cad4675a1fc154e5a4fbba9",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 8.455835185000069,
+ "minimum_seconds": 8.422462780999922,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.27495148606044,
+ "prompt_tokens_per_second": 242.19961188848353,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "b9ea95432739b2d0767f01ff6803048228f69992364297066cfcd4133000db3e",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n4-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 611695104,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 12.218045545999757,
+ "minimum_seconds": 11.155840058000194,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 83.81045856677643,
+ "prompt_tokens_per_second": 670.4836685342115,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "57edec6395dd88abd24e70047e0adca43f8a58876781092fa51c3c00e7518b36",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 33.8932466629999,
+ "minimum_seconds": 33.6279644719998,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.212508414482045,
+ "prompt_tokens_per_second": 241.70006731585636,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "b75bb614200673299c50f5478413793e3ae9f1ddf2f427c5b12d8dd78500af8d",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n1-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 631888384,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 12.784149807999711,
+ "minimum_seconds": 12.757599734999985,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 80.09918652230043,
+ "prompt_tokens_per_second": 160.19837304460086,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "a57f17956fe28fce722be3d3848cc15a065c03f9eb250f204ec2c421f9faeb77",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 643374592,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 33.78232267999965,
+ "minimum_seconds": 33.667141740999796,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.31171094124457,
+ "prompt_tokens_per_second": 60.62342188248914,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "3a7abb1408460217b6ce6cf4fd0621da14eeeead1407e00d1b44822d01bcec68",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n4-greedy",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 631888384,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 53.027317352999944,
+ "minimum_seconds": 51.61795949599991,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 77.24320603912795,
+ "prompt_tokens_per_second": 154.4864120782559,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "bb3fdbcfde4e043322d0706454f7b8fa31ca65df6ae80ce5065875624d3af8ff",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 643374592,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 136.25704416500002,
+ "minimum_seconds": 135.77568775700001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.060831167304364,
+ "prompt_tokens_per_second": 60.12166233460873,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "ed2ba774a231432d735974874af89dfbab5b9929ab5cc7caa8f455be5b18743f",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n1-greedy",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 659321344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 30.89718044900019,
+ "minimum_seconds": 30.822854752999774,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 66.28436544171045,
+ "prompt_tokens_per_second": 66.28436544171045,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "6859cbfc45117100cd52c0ef371e004ee43bf3b5fa0e3e84d763936648f0b84b",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 671865344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 68.44970350299991,
+ "minimum_seconds": 67.86870040000031,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 29.919778979177657,
+ "prompt_tokens_per_second": 29.919778979177657,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "7429ca8d21a239f77f986b028f5bf6b43aa75b7300aedbc644be9b3d65dda822",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n4-greedy",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 659321344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 123.62770391200047,
+ "minimum_seconds": 122.53081656099948,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 66.26346474760345,
+ "prompt_tokens_per_second": 66.26346474760345,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "d9059ffe4d8ef9786d3889a6873903ffef715882fd97f1a574c1e79b417f048d",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 671865344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 270.23090325500016,
+ "minimum_seconds": 270.1274789749996,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.31481559409109,
+ "prompt_tokens_per_second": 30.31481559409109,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "23fa6e0641892260aabc0d17d8ff67d0d90d2a13bf1159d03b7b8ca5b773d024",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ }
+ ],
+ "environment": {
+ "cuda_runtime": "13.0",
+ "gpu": "NVIDIA GeForce RTX 4080",
+ "gpu_total_memory_bytes": 17170956288,
+ "packages": {
+ "accelerate": "1.14.0",
+ "bitsandbytes": "0.50.0",
+ "peft": "0.18.0",
+ "torch": "2.13.0+cu130",
+ "transformers": "5.14.1"
+ },
+ "platform": "Linux-6.18.33.2-microsoft-standard-WSL2-x86_64-with-glibc2.43",
+ "python": "3.12.13"
+ },
+ "failures": [],
+ "frozen_calculator_sha256": "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc",
+ "measurement_status": "measured_baseline",
+ "models": {
+ "actor": {
+ "id": "Qwen/Qwen3-0.6B",
+ "revision": "c1899de289a04d12100db370d81485cdf75e47ca",
+ "tokenizer_revision": "c1899de289a04d12100db370d81485cdf75e47ca"
+ },
+ "dtype": "bfloat16",
+ "quantization": "nf4",
+ "teacher": {
+ "id": "Qwen/Qwen3-1.7B",
+ "revision": "70d244cc86ccca08cf5af4e1e306ecf908b1ad5e",
+ "tokenizer_revision": "70d244cc86ccca08cf5af4e1e306ecf908b1ad5e"
+ }
+ },
+ "name": "rollout-runtime-v2-hf-reference",
+ "preregistration_sha256": "8cc3ba738c69b59ed19c22c1de874fd00249404198a3e05983477dc8899bb7e5",
+ "schema_version": 1,
+ "source": {
+ "commit": "0d6e0070ae73ef35f718aec3624ee5263ac96e3a",
+ "dirty": false,
+ "miniverl_version": "0.11.0.dev0",
+ "wheel_sha256": "0256bd9e63ca6ed52999a5073a3577a008581a8d4418062314750d86f21cd5fe"
+ },
+ "workload_manifest_sha256": "9157dcdc84545d4c4e55b97084c2a93b5bc0f55d7188f36b77389b4356c09c68"
+}
diff --git a/benchmarks/results/rollout-runtime-v2-hf-reference.json b/benchmarks/results/rollout-runtime-v2-hf-reference.json
new file mode 100644
index 0000000..ebba731
--- /dev/null
+++ b/benchmarks/results/rollout-runtime-v2-hf-reference.json
@@ -0,0 +1,1812 @@
+{
+ "backend": {
+ "name": "hf_reference",
+ "reproducibility_class": "same_process_seeded_reference",
+ "version": "5.14.1"
+ },
+ "cells": [
+ {
+ "cell_id": "p128-r64-n1-greedy",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 572068864,
+ "peak_reserved_bytes": 1109393408,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 2.682791788000003,
+ "minimum_seconds": 2.658286367999999,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 95.42298479705937,
+ "prompt_tokens_per_second": 190.84596959411874,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "1e08a89c7b3790ce57c3f26d242c0cc91c11df1eeec95b2a2a00ad2afd17d746",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 576205312,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 8.552983923,
+ "minimum_seconds": 8.483651064,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.931074617314,
+ "prompt_tokens_per_second": 59.862149234628,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "ba2f11193cd4eecb8e13f902cb1f94be663a23fa8604436173c7e8ac96885339",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n4-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 572068864,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 10.549273207999988,
+ "minimum_seconds": 10.186481839999999,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 97.06829843248867,
+ "prompt_tokens_per_second": 194.13659686497735,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "ac873b82dc6266f08d49daa8851ae5ff969a9502fc09d0c46f0f11ef3fc7a983",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r64-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 576205312,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 34.194360034,
+ "minimum_seconds": 33.98181499500001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.94645897691375,
+ "prompt_tokens_per_second": 59.8929179538275,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "791ccbc8d12dd8173081df20a215540d059386148e537b585a9d189b1753880b",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n1-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 590592000,
+ "peak_reserved_bytes": 1130364928,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 10.681579509000017,
+ "minimum_seconds": 10.601817451000045,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 95.86597180100608,
+ "prompt_tokens_per_second": 47.93298590050304,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "f0934e8f8a655f7db7a6c5fe450685ae02a92becbe1a11963b3178b5f991921b",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 598225408,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 34.191396914999984,
+ "minimum_seconds": 34.07746694100001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 29.949054218102585,
+ "prompt_tokens_per_second": 14.974527109051293,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "103374fb70459e305d3e95b24cede77ebe45c02c5f6235ee07972ccbe164c934",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n4-greedy",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 590592000,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 44.35223904600002,
+ "minimum_seconds": 41.96331140099994,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 92.3515946004851,
+ "prompt_tokens_per_second": 46.17579730024255,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "e5c0366e55822136810646af6f6a2ec1de385daf66816217678c76dc09145d88",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r256-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 598225408,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 136.20863945600013,
+ "minimum_seconds": 136.123254523,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.07151393890211,
+ "prompt_tokens_per_second": 15.035756969451056,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "facbbe2eb781282a5e9dc8b3667f98828457f64d3e222c6aec076a88ec5ff1d1",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n1-greedy",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 618349568,
+ "peak_reserved_bytes": 1163919360,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 21.984175283000013,
+ "minimum_seconds": 21.751613103999944,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 93.15791807681244,
+ "prompt_tokens_per_second": 23.28947951920311,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "044bcce426878c05d803111ef04848dc025b84d1f46a0001838fecad8ace7792",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 512
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 67.754382588,
+ "minimum_seconds": 67.33902477300012,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.226826985546495,
+ "prompt_tokens_per_second": 7.556706746386624,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "d68a712f6a3a96e323d054d7918943fc9397399a6a0cc18628947a4749034719",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n4-greedy",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 618349568,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 88.1730873009999,
+ "minimum_seconds": 86.93808670099997,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 92.90816790881611,
+ "prompt_tokens_per_second": 23.227041977204028,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "fa8462caa7158d8ca5322eabd4df3c9a82db7be5f87a2952a93af96572a23606",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p128-r512-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 270.3976930829999,
+ "minimum_seconds": 270.2917211260001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 128,
+ "rates": {
+ "output_tokens_per_second": 30.296116459416037,
+ "prompt_tokens_per_second": 7.574029114854009,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "269cef51deb330312a1e377689cd9d4c40a7a3af3f494cf5712c49e14026fa82",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n1-greedy",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 611695104,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 2.7622460959996715,
+ "minimum_seconds": 2.755931521000093,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 92.67820139948546,
+ "prompt_tokens_per_second": 741.4256111958837,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "1295404c7e252083aaad1026b97935061f37c40d2cad4675a1fc154e5a4fbba9",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 256,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "cd9f13d9e943573baeb2d4e1dd04b122c4faceda6069544c4a48df4a673d8643",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 8.455835185000069,
+ "minimum_seconds": 8.422462780999922,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.27495148606044,
+ "prompt_tokens_per_second": 242.19961188848353,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "b9ea95432739b2d0767f01ff6803048228f69992364297066cfcd4133000db3e",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n4-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 611695104,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 12.218045545999757,
+ "minimum_seconds": 11.155840058000194,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 83.81045856677643,
+ "prompt_tokens_per_second": 670.4836685342115,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "57edec6395dd88abd24e70047e0adca43f8a58876781092fa51c3c00e7518b36",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r64-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 641536512,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "3b4b83de35b1d649fe3f49cf2489de7a434a97304abb50ee7ef985da4ea3b328",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 33.8932466629999,
+ "minimum_seconds": 33.6279644719998,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.212508414482045,
+ "prompt_tokens_per_second": 241.70006731585636,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 64,
+ "sampled_logprobs_sha256": "b75bb614200673299c50f5478413793e3ae9f1ddf2f427c5b12d8dd78500af8d",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n1-greedy",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 631888384,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 12.784149807999711,
+ "minimum_seconds": 12.757599734999985,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 80.09918652230043,
+ "prompt_tokens_per_second": 160.19837304460086,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "a57f17956fe28fce722be3d3848cc15a065c03f9eb250f204ec2c421f9faeb77",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 1024,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 643374592,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "711427fff6e3d357944a8bc254ed4cae8b33627122172a8d8e0d7724dc22c321",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 33.78232267999965,
+ "minimum_seconds": 33.667141740999796,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.31171094124457,
+ "prompt_tokens_per_second": 60.62342188248914,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "3a7abb1408460217b6ce6cf4fd0621da14eeeead1407e00d1b44822d01bcec68",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n4-greedy",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 631888384,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 53.027317352999944,
+ "minimum_seconds": 51.61795949599991,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 77.24320603912795,
+ "prompt_tokens_per_second": 154.4864120782559,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "bb3fdbcfde4e043322d0706454f7b8fa31ca65df6ae80ce5065875624d3af8ff",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r256-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 4096,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 643374592,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "eef961f1441414411acf4c676a6720a72986f1a635f4c62431adf91b9b288d13",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 136.25704416500002,
+ "minimum_seconds": 135.77568775700001,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.060831167304364,
+ "prompt_tokens_per_second": 60.12166233460873,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 256,
+ "sampled_logprobs_sha256": "ed2ba774a231432d735974874af89dfbab5b9929ab5cc7caa8f455be5b18743f",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n1-greedy",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 659321344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 30.89718044900019,
+ "minimum_seconds": 30.822854752999774,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 66.28436544171045,
+ "prompt_tokens_per_second": 66.28436544171045,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "6859cbfc45117100cd52c0ef371e004ee43bf3b5fa0e3e84d763936648f0b84b",
+ "samples_per_prompt": 1,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n1-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 2048,
+ "generated_trajectories": 4,
+ "logical_prompts": 4,
+ "physical_batches": 1,
+ "prompt_tokens": 2048
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 671865344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "fdf6053d6a62183ea73d5a3e6da66538b71bcae75835bd826ecf81ddefa4a1b5",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 68.44970350299991,
+ "minimum_seconds": 67.86870040000031,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 29.919778979177657,
+ "prompt_tokens_per_second": 29.919778979177657,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "7429ca8d21a239f77f986b028f5bf6b43aa75b7300aedbc644be9b3d65dda822",
+ "samples_per_prompt": 1,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n4-greedy",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 659321344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 123.62770391200047,
+ "minimum_seconds": 122.53081656099948,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 66.26346474760345,
+ "prompt_tokens_per_second": 66.26346474760345,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "d9059ffe4d8ef9786d3889a6873903ffef715882fd97f1a574c1e79b417f048d",
+ "samples_per_prompt": 4,
+ "sampling": "greedy",
+ "status": "completed"
+ },
+ {
+ "cell_id": "p512-r512-n4-seeded_stochastic",
+ "counts": {
+ "generated_tokens": 8192,
+ "generated_trajectories": 16,
+ "logical_prompts": 4,
+ "physical_batches": 4,
+ "prompt_tokens": 8192
+ },
+ "error": null,
+ "memory": {
+ "peak_allocated_bytes": 671865344,
+ "peak_reserved_bytes": 1166016512,
+ "process_rss_bytes": 2620805120,
+ "teardown_residual_allocated_bytes": 8520704
+ },
+ "oom_downshifts": 0,
+ "output_token_ids_sha256": "9d36364e8c8bb02886b0de3de5708858843f570413918901df1afe2fcebaf47d",
+ "phases": {
+ "actor_update": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "cold_start": {
+ "median_seconds": 8.762755541000004,
+ "minimum_seconds": 8.762755541000004,
+ "note": "shared actor/tokenizer load measurement repeated on each cell",
+ "status": "measured"
+ },
+ "decode": {
+ "note": "the pre-v0.11 public backend does not expose a decode boundary",
+ "status": "not_measured"
+ },
+ "full_cycle": {
+ "note": "rollout-only baseline cell; no phase is represented as zero",
+ "status": "not_measured"
+ },
+ "policy_sync": {
+ "note": "hf_reference uses the actor already loaded in the trainer process",
+ "status": "not_applicable"
+ },
+ "prefill": {
+ "note": "the pre-v0.11 public backend does not expose a prefill boundary",
+ "status": "not_measured"
+ },
+ "rollout_total": {
+ "median_seconds": 270.23090325500016,
+ "minimum_seconds": 270.1274789749996,
+ "status": "measured"
+ },
+ "teacher_scoring": {
+ "note": "rollout-only baseline cell; full-cycle measurement is a separate gate",
+ "status": "not_measured"
+ },
+ "teardown": {
+ "median_seconds": 0.2742385410001589,
+ "minimum_seconds": 0.2742385410001589,
+ "note": "shared backend teardown measurement repeated on each cell",
+ "status": "measured"
+ }
+ },
+ "prompt_length": 512,
+ "rates": {
+ "output_tokens_per_second": 30.31481559409109,
+ "prompt_tokens_per_second": 30.31481559409109,
+ "time_to_first_token_seconds": null
+ },
+ "response_bound": 512,
+ "sampled_logprobs_sha256": "23fa6e0641892260aabc0d17d8ff67d0d90d2a13bf1159d03b7b8ca5b773d024",
+ "samples_per_prompt": 4,
+ "sampling": "seeded_stochastic",
+ "status": "completed"
+ }
+ ],
+ "environment": {
+ "cuda_runtime": "13.0",
+ "driver_version": "596.49",
+ "gpu": "NVIDIA GeForce RTX 4080",
+ "gpu_total_memory_bytes": 17170956288,
+ "packages": {
+ "accelerate": "1.14.0",
+ "bitsandbytes": "0.50.0",
+ "peft": "0.18.0",
+ "torch": "2.13.0+cu130",
+ "transformers": "5.14.1"
+ },
+ "platform": "Linux-6.18.33.2-microsoft-standard-WSL2-x86_64-with-glibc2.43",
+ "python": "3.12.13"
+ },
+ "failures": [],
+ "frozen_calculator_sha256": "53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc",
+ "measurement_status": "measured_baseline",
+ "models": {
+ "actor": {
+ "id": "Qwen/Qwen3-0.6B",
+ "revision": "c1899de289a04d12100db370d81485cdf75e47ca",
+ "tokenizer_revision": "c1899de289a04d12100db370d81485cdf75e47ca"
+ },
+ "dtype": "bfloat16",
+ "quantization": "nf4",
+ "teacher": {
+ "id": "Qwen/Qwen3-1.7B",
+ "revision": "70d244cc86ccca08cf5af4e1e306ecf908b1ad5e",
+ "tokenizer_revision": "70d244cc86ccca08cf5af4e1e306ecf908b1ad5e"
+ }
+ },
+ "name": "rollout-runtime-v2-hf-reference",
+ "policy_identity": {
+ "adapter_digest_sha256": null,
+ "base_revision": "c1899de289a04d12100db370d81485cdf75e47ca",
+ "base_weight_digest_sha256": "b29cd98b83f9bddc7ec8943be5f142243e956f448f13456847849e5b8615b413",
+ "identity_digest_sha256": "926e099c2bfd349c1738cc81adc657d16604f86e7fabbe49d37d335a906c84de",
+ "policy_version": 0,
+ "profile_identity": "rollout-runtime-v2-hf-reference-baseline-v1"
+ },
+ "preregistration_sha256": "8cc3ba738c69b59ed19c22c1de874fd00249404198a3e05983477dc8899bb7e5",
+ "raw_measurement_sha256": "2e303eabb559b843d25377a7c72e0aeb0219eec7eb8bc109c0419839b3251170",
+ "schema_version": 1,
+ "source": {
+ "commit": "0d6e0070ae73ef35f718aec3624ee5263ac96e3a",
+ "dirty": false,
+ "miniverl_version": "0.11.0.dev0",
+ "wheel_sha256": "0256bd9e63ca6ed52999a5073a3577a008581a8d4418062314750d86f21cd5fe"
+ },
+ "workload_manifest_sha256": "9157dcdc84545d4c4e55b97084c2a93b5bc0f55d7188f36b77389b4356c09c68"
+}
diff --git a/benchmarks/schema/rollout-runtime-v2.schema.json b/benchmarks/schema/rollout-runtime-v2.schema.json
index f8bd3ef..e339d58 100644
--- a/benchmarks/schema/rollout-runtime-v2.schema.json
+++ b/benchmarks/schema/rollout-runtime-v2.schema.json
@@ -9,12 +9,14 @@
"name",
"measurement_status",
"source",
+ "raw_measurement_sha256",
"preregistration_sha256",
"workload_manifest_sha256",
"frozen_calculator_sha256",
"environment",
"models",
"backend",
+ "policy_identity",
"cells",
"failures"
],
@@ -25,6 +27,7 @@
"enum": ["measured_baseline", "completed_with_failures"]
},
"source": {"$ref": "#/$defs/source"},
+ "raw_measurement_sha256": {"$ref": "#/$defs/sha256"},
"preregistration_sha256": {"$ref": "#/$defs/sha256"},
"workload_manifest_sha256": {"$ref": "#/$defs/sha256"},
"frozen_calculator_sha256": {
@@ -52,6 +55,26 @@
"reproducibility_class": {"const": "same_process_seeded_reference"}
}
},
+ "policy_identity": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "policy_version",
+ "profile_identity",
+ "base_revision",
+ "base_weight_digest_sha256",
+ "adapter_digest_sha256",
+ "identity_digest_sha256"
+ ],
+ "properties": {
+ "policy_version": {"const": 0},
+ "profile_identity": {"const": "rollout-runtime-v2-hf-reference-baseline-v1"},
+ "base_revision": {"type": "string", "pattern": "^[0-9a-f]{40}$"},
+ "base_weight_digest_sha256": {"$ref": "#/$defs/sha256"},
+ "adapter_digest_sha256": {"type": "null"},
+ "identity_digest_sha256": {"$ref": "#/$defs/sha256"}
+ }
+ },
"cells": {
"type": "array",
"minItems": 1,
diff --git a/docs/benchmarks/rollout-runtime-v2.md b/docs/benchmarks/rollout-runtime-v2.md
new file mode 100644
index 0000000..69321fe
--- /dev/null
+++ b/docs/benchmarks/rollout-runtime-v2.md
@@ -0,0 +1,72 @@
+# Rollout Runtime v2: frozen HF reference baseline
+
+The pre-v0.11 Hugging Face path is now frozen as the compatibility and
+performance baseline for Rollout Runtime v2. All 24 preregistered cells
+completed on one WSL2 RTX 4080 without an OOM or discarded cell.
+
+This result measures actor rollout only. It is not a task-quality experiment,
+does not include teacher scoring or an optimizer update, and does not yet
+exercise typed grouped-sample semantics.
+
+## Frozen setup
+
+| Item | Exact value |
+| --- | --- |
+| Source | `0d6e0070ae73ef35f718aec3624ee5263ac96e3a` |
+| Candidate wheel | `0256bd9e63ca6ed52999a5073a3577a008581a8d4418062314750d86f21cd5fe` |
+| Actor | `Qwen/Qwen3-0.6B` at `c1899de289a04d12100db370d81485cdf75e47ca` |
+| Weight payload digest | `b29cd98b83f9bddc7ec8943be5f142243e956f448f13456847849e5b8615b413` |
+| Runtime | Python 3.12.13, Torch 2.13.0+cu130, Transformers 5.14.1, NF4/BF16 |
+| GPU / driver | NVIDIA GeForce RTX 4080 16 GiB / 596.49 |
+| Workload | 4 logical prompts; prompt 128/512; response 64/256/512; `n=1/4`; greedy and seeded stochastic |
+
+## Measured rollout throughput
+
+Every row generated the full configured response bound. Rates use actual
+generated tokens and median wall time over three measured repetitions after
+one warmup.
+
+| Prompt | Response | Samples/prompt | Greedy tokens/s | Seeded stochastic tokens/s | Peak reserved GiB |
+| ---: | ---: | ---: | ---: | ---: | ---: |
+| 128 | 64 | 1 | 95.42 | 29.93 | 1.053 |
+| 128 | 64 | 4 | 97.07 | 29.95 | 1.053 |
+| 128 | 256 | 1 | 95.87 | 29.95 | 1.084 |
+| 128 | 256 | 4 | 92.35 | 30.07 | 1.084 |
+| 128 | 512 | 1 | 93.16 | 30.23 | 1.086 |
+| 128 | 512 | 4 | 92.91 | 30.30 | 1.086 |
+| 512 | 64 | 1 | 92.68 | 30.28 | 1.086 |
+| 512 | 64 | 4 | 83.81 | 30.21 | 1.086 |
+| 512 | 256 | 1 | 80.10 | 30.31 | 1.086 |
+| 512 | 256 | 4 | 77.24 | 30.06 | 1.086 |
+| 512 | 512 | 1 | 66.28 | 29.92 | 1.086 |
+| 512 | 512 | 4 | 66.26 | 30.31 | 1.086 |
+
+The two sampling paths have different pre-v0.11 implementations. Greedy uses
+one padded batch but recomputes the full prefix at each step; seeded stochastic
+preserves per-request RNG by running the established sequential KV-cache path.
+These measurements are therefore separate baselines, not an algorithm ranking.
+
+## What remains unmeasured
+
+The legacy public backend does not expose clean prefill, decode or time-to-first
+token boundaries, so those fields are `not_measured`, not zero. Policy sync is
+`not_applicable` for an actor already loaded in the same process. Teacher
+scoring, actor update and full-cycle time are also `not_measured` in this
+rollout-only baseline and remain required before v0.11 release.
+
+`n=4` here is four independently repeated requests per prompt. Transactional
+group identity, grouped resume and reward composition do not exist in this
+baseline and cannot be inferred from it.
+
+## Artifact integrity
+
+| Artifact | SHA-256 |
+| --- | --- |
+| Preregistration | `8cc3ba738c69b59ed19c22c1de874fd00249404198a3e05983477dc8899bb7e5` |
+| Raw measurement | `2e303eabb559b843d25377a7c72e0aeb0219eec7eb8bc109c0419839b3251170` |
+| Final identity-bound result | `b25daee7ee726b7a7be18d7dbe26590fb61325bf212cfd9e7110b69f5fa8889c` |
+| Frozen calculator benchmark | `53fc1d4d5b7adee09618d77ad62d4086ba56b78569832d6fc7c3bcd5c2695bbc` |
+
+See the [method](rollout-runtime-v2-method.md) for timing and invalidation
+rules. The next backend must use this workload unchanged and pass the
+preregistered correctness, memory and 256/512-token speedup gates.
diff --git a/docs/release-checklist.md b/docs/release-checklist.md
index 6213883..9d0a5bd 100644
--- a/docs/release-checklist.md
+++ b/docs/release-checklist.md
@@ -10,7 +10,10 @@ after the exact release commit and its remote checks are green.
release and documentation remain at immutable `v0.10.1`.
- [x] Preregister the RTX 4080 Rollout Runtime v2 workload before measuring
the pre-v0.11 `hf_reference` baseline.
-- [ ] Freeze the `hf_reference` result before implementing `hf_cached`.
+- [x] Freeze the 24-cell `hf_reference` result from exact source commit
+ `0d6e0070ae73ef35f718aec3624ee5263ac96e3a` and candidate wheel
+ `0256bd9e63ca6ed52999a5073a3577a008581a8d4418062314750d86f21cd5fe`
+ before implementing `hf_cached`.
- [ ] Add typed policy identity, lifecycle and strict synchronization contracts.
- [ ] Qualify `hf_cached` at 64/256/512 response bounds and require at least 2x
speedup at 256 and 512 without exceeding 14.5 GiB peak reserved VRAM.
diff --git a/mkdocs.yml b/mkdocs.yml
index 6b9f7b6..67ac454 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -74,6 +74,7 @@ nav:
- Rollout Runtime v2:
- Competitive landscape: competitive-landscape.md
- Benchmark method: benchmarks/rollout-runtime-v2-method.md
+ - Frozen HF baseline: benchmarks/rollout-runtime-v2.md
- Maintainer:
- Architecture: maintainer-architecture.md
- Upstream support policy: upstream-support-policy.md
diff --git a/scripts/finalize_rollout_runtime_baseline.py b/scripts/finalize_rollout_runtime_baseline.py
new file mode 100644
index 0000000..08a37d9
--- /dev/null
+++ b/scripts/finalize_rollout_runtime_baseline.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python3
+"""Bind immutable identity metadata to a completed rollout baseline.
+
+This finalization step never changes a measured cell. It preserves the raw
+measurement bytes, adds the exact base-weight digest and policy identity, then
+validates and atomically publishes the public result.
+"""
+
+from __future__ import annotations
+
+import argparse
+import hashlib
+import json
+import os
+import subprocess
+import tempfile
+from pathlib import Path
+from typing import Any
+
+import jsonschema
+from huggingface_hub import snapshot_download
+
+from miniverl.utils.runs import canonical_json, write_json
+
+ROOT = Path(__file__).resolve().parents[1]
+SCHEMA = ROOT / "benchmarks/schema/rollout-runtime-v2.schema.json"
+
+
+def _sha256_bytes(payload: bytes) -> str:
+ return hashlib.sha256(payload).hexdigest()
+
+
+def _weight_digest(model_id: str, revision: str) -> str:
+ snapshot = Path(
+ snapshot_download(
+ repo_id=model_id,
+ revision=revision,
+ allow_patterns=["*.safetensors"],
+ local_files_only=True,
+ )
+ )
+ weights = sorted(snapshot.rglob("*.safetensors"), key=lambda path: path.as_posix())
+ if not weights:
+ raise RuntimeError(f"cached snapshot {model_id}@{revision} has no safetensors weights")
+ digest = hashlib.sha256()
+ for path in weights:
+ relative = path.relative_to(snapshot).as_posix()
+ digest.update(relative.encode("utf-8"))
+ digest.update(b"\0")
+ with path.open("rb") as handle:
+ for block in iter(lambda: handle.read(1024 * 1024), b""):
+ digest.update(block)
+ return digest.hexdigest()
+
+
+def _driver_version() -> str:
+ return (
+ subprocess.check_output(
+ [
+ "nvidia-smi",
+ "--query-gpu=driver_version",
+ "--format=csv,noheader,nounits",
+ ],
+ text=True,
+ )
+ .splitlines()[0]
+ .strip()
+ )
+
+
+def _write_bytes_atomic(path: Path, payload: bytes) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ descriptor, temporary_name = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent)
+ temporary = Path(temporary_name)
+ try:
+ with os.fdopen(descriptor, "wb") as handle:
+ handle.write(payload)
+ handle.flush()
+ os.fsync(handle.fileno())
+ temporary.replace(path)
+ finally:
+ temporary.unlink(missing_ok=True)
+
+
+def finalize(*, measured: Path, raw_output: Path, result_output: Path) -> dict[str, Any]:
+ raw = measured.read_bytes()
+ payload = json.loads(raw)
+ if payload.get("measurement_status") not in {"measured_baseline", "completed_with_failures"}:
+ raise RuntimeError("input is not a completed rollout baseline")
+ if "raw_measurement_sha256" in payload or "policy_identity" in payload:
+ raise RuntimeError("input already contains finalization metadata")
+ source_commit = payload.get("source", {}).get("commit")
+ if not isinstance(source_commit, str) or len(source_commit) != 40:
+ raise RuntimeError("raw measurement has no exact source commit")
+
+ actor = payload["models"]["actor"]
+ policy_identity = {
+ "policy_version": 0,
+ "profile_identity": "rollout-runtime-v2-hf-reference-baseline-v1",
+ "base_revision": actor["revision"],
+ "base_weight_digest_sha256": _weight_digest(actor["id"], actor["revision"]),
+ "adapter_digest_sha256": None,
+ }
+ policy_identity["identity_digest_sha256"] = hashlib.sha256(
+ canonical_json(policy_identity).encode("utf-8")
+ ).hexdigest()
+ payload["raw_measurement_sha256"] = _sha256_bytes(raw)
+ payload["policy_identity"] = policy_identity
+ payload["environment"]["driver_version"] = _driver_version()
+
+ schema = json.loads(SCHEMA.read_text(encoding="utf-8"))
+ jsonschema.validate(payload, schema)
+ result_output.parent.mkdir(parents=True, exist_ok=True)
+ _write_bytes_atomic(raw_output, raw)
+ write_json(result_output, payload)
+ return payload
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--measured", type=Path, required=True)
+ parser.add_argument("--raw-output", type=Path, required=True)
+ parser.add_argument("--result-output", type=Path, required=True)
+ args = parser.parse_args()
+ payload = finalize(
+ measured=args.measured.resolve(),
+ raw_output=args.raw_output.resolve(),
+ result_output=args.result_output.resolve(),
+ )
+ print(
+ json.dumps(
+ {
+ "status": payload["measurement_status"],
+ "raw_measurement_sha256": payload["raw_measurement_sha256"],
+ "policy_identity": payload["policy_identity"]["identity_digest_sha256"],
+ },
+ sort_keys=True,
+ )
+ )
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/tests/unit/test_packaging.py b/tests/unit/test_packaging.py
index b3a4c89..bf41dc8 100644
--- a/tests/unit/test_packaging.py
+++ b/tests/unit/test_packaging.py
@@ -298,6 +298,7 @@ def test_every_published_benchmark_result_validates_against_the_schema():
"alignment-lab-v1.json",
"alignment-lab-v1-state-supervision.json",
"alignment-external-v1.json",
+ "rollout-runtime-v2-hf-reference.json",
"rtx4080-verl-opd-runtime-v1.json",
"rtx4080-verl-opd-developer-v1.json",
"rtx4080-smollm2-opd-family-smoke-v1.json",
diff --git a/tests/unit/test_rollout_runtime_v2_benchmark.py b/tests/unit/test_rollout_runtime_v2_benchmark.py
index 83e72a1..1585c0f 100644
--- a/tests/unit/test_rollout_runtime_v2_benchmark.py
+++ b/tests/unit/test_rollout_runtime_v2_benchmark.py
@@ -40,6 +40,62 @@ def test_rollout_runtime_v2_preserves_frozen_calculator() -> None:
)
+def test_measured_hf_reference_baseline_is_exact_and_schema_valid() -> None:
+ expected = {
+ "benchmarks/preregistration/rollout-runtime-v2.yaml": (
+ "8cc3ba738c69b59ed19c22c1de874fd00249404198a3e05983477dc8899bb7e5"
+ ),
+ "benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json": (
+ "2e303eabb559b843d25377a7c72e0aeb0219eec7eb8bc109c0419839b3251170"
+ ),
+ "benchmarks/results/rollout-runtime-v2-hf-reference.json": (
+ "b25daee7ee726b7a7be18d7dbe26590fb61325bf212cfd9e7110b69f5fa8889c"
+ ),
+ }
+ for relative, digest in expected.items():
+ assert hashlib.sha256((ROOT / relative).read_bytes()).hexdigest() == digest
+
+ payload = json.loads(
+ (ROOT / "benchmarks/results/rollout-runtime-v2-hf-reference.json").read_text(
+ encoding="utf-8"
+ )
+ )
+ schema = json.loads(SCHEMA.read_text(encoding="utf-8"))
+ jsonschema.validate(payload, schema)
+ assert payload["measurement_status"] == "measured_baseline"
+ assert payload["failures"] == []
+ assert len(payload["cells"]) == 24
+ assert all(cell["status"] == "completed" for cell in payload["cells"])
+ assert payload["source"] == {
+ "commit": "0d6e0070ae73ef35f718aec3624ee5263ac96e3a",
+ "dirty": False,
+ "miniverl_version": "0.11.0.dev0",
+ "wheel_sha256": "0256bd9e63ca6ed52999a5073a3577a008581a8d4418062314750d86f21cd5fe",
+ }
+ assert payload["policy_identity"]["base_weight_digest_sha256"] == (
+ "b29cd98b83f9bddc7ec8943be5f142243e956f448f13456847849e5b8615b413"
+ )
+ assert max(cell["memory"]["peak_reserved_bytes"] for cell in payload["cells"]) == (1166016512)
+ raw_payload = json.loads(
+ (ROOT / "benchmarks/evidence/rollout-runtime-v2/hf-reference-raw.json").read_text(
+ encoding="utf-8"
+ )
+ )
+ measurement_view = dict(payload)
+ measurement_view.pop("raw_measurement_sha256")
+ measurement_view.pop("policy_identity")
+ measurement_view["environment"] = dict(measurement_view["environment"])
+ measurement_view["environment"].pop("driver_version")
+ assert measurement_view == raw_payload
+ for cell in payload["cells"]:
+ assert cell["counts"]["generated_tokens"] == (
+ 4 * cell["samples_per_prompt"] * cell["response_bound"]
+ )
+ for phase in ("prefill", "decode", "teacher_scoring", "actor_update", "full_cycle"):
+ assert cell["phases"][phase]["status"] == "not_measured"
+ assert "median_seconds" not in cell["phases"][phase]
+
+
def _phase(status: str, measured: bool = False) -> dict[str, object]:
payload: dict[str, object] = {"status": status}
if measured:
@@ -69,6 +125,7 @@ def test_rollout_runtime_v2_schema_keeps_unavailable_phases_distinct_from_zero()
"miniverl_version": "0.11.0.dev0",
"wheel_sha256": "b" * 64,
},
+ "raw_measurement_sha256": "9" * 64,
"preregistration_sha256": "c" * 64,
"workload_manifest_sha256": "d" * 64,
"frozen_calculator_sha256": (
@@ -94,6 +151,14 @@ def test_rollout_runtime_v2_schema_keeps_unavailable_phases_distinct_from_zero()
"version": "5.14.1",
"reproducibility_class": "same_process_seeded_reference",
},
+ "policy_identity": {
+ "policy_version": 0,
+ "profile_identity": "rollout-runtime-v2-hf-reference-baseline-v1",
+ "base_revision": "e" * 40,
+ "base_weight_digest_sha256": "8" * 64,
+ "adapter_digest_sha256": None,
+ "identity_digest_sha256": "7" * 64,
+ },
"cells": [
{
"cell_id": "p128-r64-n1-greedy",