A general-purpose value foundation model for robot manipulation — and the full toolchain to evaluate it and use it for reinforcement learning of VLA policies.
RynnValue is a RynnBrain-based vision-language model (implemented on the Qwen3-VL architecture) that watches a robot video together with a task instruction and predicts, for every frame, the temporal distance — the remaining time (in seconds) until the task is completed — alongside a natural-language analysis of the trajectory (video description, instruction–video match, task success). Because temporal-distance labels are derived directly from timestamps, RynnValue scales to 7,000+ hours of heterogeneous embodied data (~3M instruction-conditioned clips) without any preference or progress annotations. The predicted time-to-completion is a dense, task-grounded value signal that can be used directly as a progress estimator, a reward model for policy evaluation and ranking, or a critic for reinforcement learning of vision-language-action (VLA) policies.
RynnValue overview
Overview. Given a language instruction and a sequence of sampled observations, RynnValue builds an interleaved multimodal sequence of repeated absolute-value (<value>) and relative-value (<relative_value>) query groups, encoded by the RynnBrain backbone in a single forward pass. Two distributional heads predict the absolute temporal distance to task completion and the signed relative temporal displacement between observations, while the LM head produces video analysis and task verification. The resulting temporal values serve as a unified interface for progress estimation, failure detection, and reward specification in robotic RL.
Fork of openpi (π₀ / π₀-FAST / π₀.₅) extended with offline IQL fine-tuning and online DSRL-style SAC latent steering, on LIBERO, RoboTwin, and real Franka robots
Temporal distance as the scaling target. Instead of preferences or normalized [0,1] progress, RynnValue predicts the goal-conditioned cost-to-go in physical seconds. Labels come directly from timestamps (plus subtask segmentation and cutoff relabeling), so supervision scales to 7,000+ hours / ~3M clips across 10 heterogeneous data sources (AgiBot, EgoDex, Open X-Embodiment, RoboMIND, RoboTwin, …) without a single preference or progress annotation.
State-of-the-art without preference labels. RynnValue-8B attains an average Kendall's τₐ of 0.675 on RBM-EVAL-OOD, surpassing the fully preference-supervised state of the art (0.655) and more than doubling a progress-only counterpart (0.292), while generalizing zero-shot to unseen tasks, embodiments, and viewpoints.
Shortcut-suppression by design.Random temporal sampling and temporal-order shuffling break the correspondence between sequence position / sampling interval and task progress; value-isolation attention (pred_slot_isolated_eager) keeps each value-query group visible only to its own language–visual context, so predictions can't extrapolate from other value tokens. Ablations: removing shuffling drops τₐ from 0.675 → 0.189, removing isolation → 0.482, uniform sampling → 0.379.
Distributional value heads. Absolute ([0, 512] s) and relative ([−256, 256] s) temporal targets are discretized into 256 symlog-spaced bins with two-hot encodings, decoded back to continuous seconds at inference — stable regression over the long-tailed duration distribution of multi-embodiment data.
Language-grounded analysis. The model also generates an Analysis block: a video description, a Match: Yes/No verdict (does the video match the instruction?), and a Success: Yes/No verdict. Instruction-mismatch augmentation (10% of training samples) teaches the model to detect instruction–video mismatches instead of always reporting smooth progress.
A practical reward interface for real robots. Converted into dense rewards via potential-based shaping (Φ_t = −v_t), RynnValue raises real-world dual-arm Franka policy success from 52.5% → 72.5% online and 63.8% → 82.5% offline over the strongest reward-model baseline.
Full evaluation + RL loop. The bundled Robometer fork benchmarks RynnValue against 10+ reward-model baselines (RBM, GVL, ReWiND, RFM, RL-VLM-F, Robo-Dopamine, RoboReward, TopReward, VLAC, …); the pi-rl fork closes the loop by improving π₀.₅ policies with value-driven offline IQL and online SAC.
How RynnValue Works
┌────────────────────────────────────────────────────────┐
Instruction ───►│ │
Metadata ─────►│ RynnBrain backbone (RynnValueLangModel) │──► Analysis text
Frames ───────►│ │ (description / Match / Success)
│ hidden states at repeated query-token positions │
└───────┬──────────────────────────────┬─────────────────┘
│ <value> group (×N) │ <relative_value> group (×N)
▼ ▼
absolute value head relative value head
(256 symlog bins, two-hot) (256 symlog bins, two-hot)
│ │
▼ ▼
remaining time per frame signed Δt between adjacent frames
The architecture follows the paper (§2, Model Architecture):
Grouped temporal queries. A single query token is an information bottleneck; each temporal prediction instead uses a group of N = 8 repeated query tokens whose hidden states are concatenated (not averaged) before the head, preserving complementary visual cues (object configuration, robot–object interaction, task stage, completion evidence).
Dual distributional heads. The absolute head predicts the remaining time to the (relabeled) completion cutoff; the relative head predicts the signed temporal displacement between consecutively presented observations. Both are 256-bin symlog-spaced two-hot classifiers, decoded at inference by taking the expected bin center in symlog space and applying symexp.
Value-isolation attention. Query groups belonging to different observations cannot attend to each other, and context tokens cannot attend to query tokens — each temporal estimate must be grounded in the instruction and visual evidence, and value prediction never contaminates language generation.
Language analysis & verification. A verification prompt after the last query group triggers autoregressive generation of Video Description → Match → Success through the original (frozen) LM head.
The prompt (built by rynn_value/conversations.py) interleaves an optional embodiment/camera meta block, the task instruction, the two value questions, per-frame images followed by their <relative_value> / <value> token slots, and finally the analysis request. The processor (rynn_value/processing_rynn_value_lang.py) exposes a single-call inference API, process_episode(instruction, images, robot_description, camera_description).
Processor: special tokens, training target construction, process_episode inference API
The package self-registers with HuggingFace Auto classes (AutoConfig / AutoModel / AutoProcessor under model type rynn_value_lang), so exported checkpoints load with trust_remote_code=True and nothing else.
Training Recipe
RynnValue training pipeline and value-isolation attention
(a) Training strategy. Random temporal sampling and temporal-order shuffling suppress shortcuts tied to sampling intervals and sequence position, while instruction-mismatch augmentation strengthens language–visual grounding. (b) Value-isolation attention. Within each value-query group, repeated queries attend to one another and to the language–visual context, while remaining isolated from other value-query groups.
Data. RynnValue is trained on a heterogeneous mixture of real-world, simulated, and egocentric trajectories — 1.67M original episodes expanded into 3.09M instruction-conditioned segments (7,000+ hours, 223K unique instructions) via subtask segmentation and cutoff relabeling:
Data Source
# Original Episodes
# Segmentations
Open X-Embodiment
693,037
693,037
EgoDex
338,234
338,234
InternData-A1
320,905
320,905
AgiBot
167,535
1,166,042
RoboCOIN
67,420
410,877
RoboMIND
32,138
32,138
RoboTwin
27,414
27,414
Galaxea Open-World
16,979
95,671
RDT
6,109
6,109
Soft-FOLD
1,542
1,542
Total
1,671,313
3,091,969
Temporal-distance labels are generated directly from timestamps: observations before the completion cutoff are labeled with their remaining time; observations at or after the cutoff receive zero. Qwen3-VL-27B captions supervise the Video Description output.
Objectives. Three jointly optimized cross-entropy losses: (1) absolute temporal-distance loss over two-hot bin targets (masked for instruction-mismatched samples); (2) relative temporal-distance loss (instruction-independent, kept for mismatched samples); (3) causal LM loss over the Video Description / Match / Success tokens (weight λ = 2, LM output projection frozen).
Shortcut suppression. For each clip, K = 8 observations are sampled at irregular timestamps (random temporal sampling); half of the sequences are unsorted, the rest follow a forward-biased temporal walk with occasional rewinds (temporal-order shuffling) — so relative targets can be negative. Together with value-isolation attention, this forces every prediction to be grounded in the corresponding observation and task semantics. For 10% of samples the instruction is swapped with one from a different trajectory (instruction-mismatch augmentation) and supervised toward Match: No / Success: No.
Reward interface. At inference, frames are fed chronologically and decoded into remaining time v_t. The potential Φ_t = −v_t yields dense rewards via potential-based shaping (r_t = γ^H Φ_{t+H} − Φ_t), preserving the physical temporal scale rather than normalizing to a task-specific [0,1] interval.
Results
Policy ranking (RBM-EVAL-OOD). Trained without preference labels, RynnValue-8B reaches an average Kendall's τₐ of 0.675, surpassing the fully preference-supervised state of the art (0.655) and more than doubling a progress-only counterpart (0.292).
Instruction–trajectory alignment. Scoring every instruction against every trajectory, RynnValue produces the clearest diagonal structure with the highest normalized diagonal margin (0.79 vs. 0.67 for the strongest baseline):
Instruction-trajectory confusion matrices
Value-curve quality. On real-world trajectories, RynnValue reacts sharply to task regressions and recoveries where normalized-progress baselines stay flat:
Temporal-value curve comparison on a real-world trajectory
Scaling behavior. Task diversity — not episode volume — drives generalization: scaling episode count within fixed tasks saturates almost immediately, while adding tasks monotonically reduces temporal-distance error on unseen tasks:
Scaling episode volume vs. task diversity
Real-world policy learning. Used as a zero-shot reward annotator (none of the tasks, objects, or scenes appear in training) on a dual-arm Franka across four manipulation tasks, RynnValue-shaped rewards raise average success from 52.5% → 72.5% (online RL) and 63.8% → 82.5% (offline RL) over the strongest reward-model baseline:
A recent transformers with Qwen3-VL support is required (pinned in pyproject.toml). A single GPU with ≥ 24 GB memory comfortably runs the 8B model in bf16.
See robometer/README.md and robometer/FINETUNE_ROBOMETER.md for dataset download, reward-model fine-tuning (LoRA + FSDP), and the full baseline matrix.
GPU requirements follow upstream openpi: > 8 GB for inference, > 22.5 GB for LoRA fine-tuning, > 70 GB (A100/H100) for full fine-tuning. See pi-rl/README.md.
Quickstart: Inference
Run RynnValue on the bundled example video:
bash
1cd rynn_infer
2uv run python inference.py \3 --model_path /path/to/RynnValue-8B \4 --video_path ../example/Put_the_box_in_the_drawer_and_close_it.mp4 \5 --instruction "Put the box in the drawer and close it"\6 --num_frames 64\7 --output_path ./outputs
Useful flags:
Flag
Default
Meaning
--num_frames
64
Frames uniformly sampled from the video (0 = all frames)
--robot_description / --camera_description
None
Embodiment/camera meta block (required for models trained with use_meta=True)
--max_new_tokens
128
Token budget for the Analysis block
--fps
30
FPS of the rendered trend video
The script produces, in a timestamped output directory:
output_with_trend.mp4 — the input video with a synchronized Remaining Time (s) curve;
the parsed Analysis (video description, Match: Yes/No, Success: Yes/No) and per-frame values.
Using RynnValue Programmatically
python
1import torch
2from transformers import AutoConfig, AutoModel, AutoProcessor
34model_path ="/path/to/RynnValue-8B"56config = AutoConfig.from_pretrained(model_path, trust_remote_code=True)7config._attn_implementation ="pred_slot_isolated_eager"89model = AutoModel.from_pretrained(10 model_path, config=config, torch_dtype=torch.bfloat16,11 trust_remote_code=True, device_map="cuda",12).eval()13processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)1415# `images`: list of PIL.Image frames sampled from the trajectory video16inputs = processor.process_episode(17 instruction="Put the box in the drawer and close it",18 images=images,19).to(model.device)2021with torch.no_grad():22 out = model(**inputs)2324remaining_time = out.value.pred_value.float().mean(dim=-1)# (num_frames,) seconds, head-ensemble mean25delta_time = out.relative.pred_value # per-step time deltas26entropy = out.value.entropy # per-frame uncertainty
Evaluation with Robometer
The robometer/ fork adds RynnValue as a first-class baseline (robometer/robometer/evals/baselines/rynnvalue.py, Hydra config reward_model=rynnvalue). Ready-made launchers live in robometer/rynnvalue_eval/.
Policy ranking (does the value model rank better policies higher?):
See robometer/rynnvalue_eval/*.sh for complete examples and robometer/eval_commands/ for the other baselines. Dataset converters for LIBERO, AgiBotWorld, and custom datasets (DROID / Bridge style) live in robometer/dataset_upload/.
Reward Server
Serve RynnValue as an HTTP reward model (used by policy evaluation and online RL clients):
The server (robometer/robometer/evals/baseline_eval_server.py) accepts frame sequences + instructions and returns per-frame values / rewards. --checkpoint-path alternatively loads a raw training checkpoint (model.pt with a sibling huggingface/ snapshot). --mode absolute selects the remaining-time head; --debug attaches debugpy on :5678.
Policy RL with pi-rl
pi-rl/ is a fork of openpi that turns value/reward signals into better VLA policies. On top of upstream π₀ / π₀-FAST / π₀.₅ SFT (JAX and PyTorch), it adds:
Offline IQL fine-tuning (scripts/train_iql.py): each step (1) updates a jaxrl2 PixelIQL critic/value, (2) computes the IQL advantage, (3) updates the π₀.₅ flow-matching policy with advantage-weighted BC (exp(A_scaling · adv)). RL-aware plumbing lives in src/openpi/training/{rl_data_loader,iql_checkpoints,episode_filter}.py. Registered configs include pi05_robotwin_iql, pi05_franka_single_iql, pi05_franka_dual_iql, and variants.
Online DSRL-style SAC latent steering: a small PixelSAC agent steers the frozen π₀.₅ policy's latent noise online — in simulation (examples/dsrl_sim/, LIBERO OffScreenRenderEnv) and on a real Franka over WebSocket (examples/dsrl_franka/).
Benchmarks & robots: LIBERO, RoboTwin, ALOHA sim, DROID, and a full real-Franka pipeline (examples/franka/: serving, fine-tuning, async online LoRA training) with LeRobot-format data converters (scripts/convert_franka_data_to_lerobot.py).
Representative commands:
bash
1cd pi-rl
23# supervised fine-tuning on RoboTwin4FSDP_DEVICES=2bash scripts/train_pi05_robotwin.sh adjust_bottle-demo_clean_collect_200-50
56# offline IQL on RoboTwin7bash scripts/train_iql_robotwin.sh
DSRL Online RL on a Real Franka
examples/dsrl_franka/ runs online SAC latent steering on a real (single- or dual-arm) Franka, optionally shaped by a RynnValue reward server. The launcher template is examples/dsrl_franka/scripts/run_train_franka.sh; the flow is:
1. (Optional) Start the RynnValue reward server for reward shaping (see Reward Server):
cd robometer && bash rynnvalue_eval/start_server.sh --model-path /path/to/RynnValue-8B --port 8000
2. Start the robot environment server (WebSocket) on the machine controlling the Franka, or skip this and use --fake_env for a quick dry run without hardware.
3. Launch online training. Point it at an IQL-initialized checkpoint (FRANKA_SFT_CKPT_BASE) and the env/reward servers:
bash
1cd pi-rl
2exportFRANKA_SFT_CKPT_BASE=/path/to/iql_checkpoint/10000 # offline-IQL warm start3exportXLA_PYTHON_CLIENT_PREALLOCATE=false
45python examples/dsrl_franka/launch_train_franka.py \6 --arm_mode dual \7 --policy_config pi05_franka_dual_iql_optimized_v2 \8 --update_type episode --utd_ratio 100 --publish_hz 10.0\9 --client_host localhost --client_port 8101\10 --pi0_action_horizon 16\11 --franka_norm_stats_asset_id pick_up_the_box \12 --max_episodes 500 --franka_max_timesteps 600\13 --start_online_updates 200\14 --noise_episodes 2 --noise_std 0.1\15 --score_server "http://localhost:8000"\16 --shaping_weight 1.0 --shaping_gamma 0.999\17 --task_description "Move the box from the right side to the left side."\18 --checkpoint_interval 200 --checkpoint_dir ./experiments/dual_reward_shaping \19 --wandb_project dsrl_franka --seed 42
Key knobs:
Flag
Meaning
--arm_mode single/dual (+ --side left/right)
Single- or dual-arm Franka
--fake_env
Local fake environment — verify the training loop without a robot
--client_host / --client_port
WebSocket address of the robot env server
--score_server
RynnValue/Robometer reward server URL; enables potential-based reward shaping (--shaping_weight, --shaping_gamma)
--update_type episode / --utd_ratio
Update after each episode with the given update-to-data ratio
--noise_episodes / --noise_std
Initial exploration episodes with Gaussian latent noise
--start_online_updates
Warm-up steps collected before SAC updates begin
The same recipe runs in simulation via examples/dsrl_sim/launch_train_sim.py (LIBERO OffScreenRenderEnv).
See pi-rl/README.md for upstream documentation (checkpoints under gs://openpi-assets/checkpoints/: pi05_base, pi05_libero, pi05_droid, …), norm-stat computation, and policy serving.
Checkpoint Conversion
Export a raw training checkpoint to a standalone HuggingFace model directory (embeds the modeling code for trust_remote_code loading):
The RynnValue components (rynn_value/, rynn_infer/, tools/) are distributed under the Apache License 2.0 (see LICENSE).
pi-rl/ is distributed under the Apache License 2.0 (see pi-rl/LICENSE) with additional Gemma terms in pi-rl/LICENSE_GEMMA.txt.
robometer/ follows the upstream Robometer project under the MIT License (see robometer/LICENSE). It additionally vendors FSDP utilities derived from ByteDance's verl project (Apache-2.0; original copyright headers retained in robometer/robometer/utils/fsdp/).
Citation
If you find RynnValue useful, please cite:
bibtex
1@article{rynnvalue2026,
2 title = {RynnValue: Scaling Robotic Value Foundation Models with Temporal Distance},
3 author = {Dongchi Huang and Hongyin Zhang and Bohan Hou and Siteng Huang and Zhian Su and Hang Guo and Tong Lu and Zhaofeng Xu and Jiahao Tang and Jianfei Yang and Donglin Wang and Peixi Peng and Mingxiu Chen and Deli Zhao and Xin Li},
4 journal= {arXiv preprint arXiv:2608.09853},
5 year = {2026},
6}