LeRobot documentation

TOPReward

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

TOPReward

TOPReward est un modèle de récompense en zéro tirage qui extrait les log-probabilités des jetons d'un modèle de vision-langage (VLM) existant pour servir de signal de récompense robotique. À partir d'une trajectoire vidéo et d'une instruction de tâche, il renvoie la log-vraisemblance du VLM que l'instruction est vraie — sans nécessité de fine-tuning.

Article : TOPReward: Token Probabilities as Hidden Zero-Shot Rewards for Robotics Projet : topreward.github.io Code original : github.com/TOPReward/TOPReward Backbone par défaut : Qwen/Qwen3-VL-8B-Instruct

Aperçu

TOPReward demande à un VLM générique quelle est la probabilité d'une instruction de tâche, conditionnée par la vidéo d'un robot tentant de réaliser cette tâche. Concrètement, étant donné :

  • Une vidéo de trajectoire (une séquence d'images).
  • Une instruction de tâche (par exemple « ouvrir le tiroir »).

il construit un prompt de chat de la forme

<video>
"The above video shows a robot manipulation trajectory that completes the
 following task: <instruction> Decide whether the above statement is True
 or not. The answer is: True"

forwards it through the VLM, label-masks everything except the very last token, and reads back the log-probability of that token — by default the literal "True" that closes the suffix template. The resulting log P("True" | video + prompt + instruction) is the reward.

Comme la méthode ne dépend que d'un VLM figé, TOPReward est zero-shot : il n'y a pas de poids affinés à héberger. Le « modèle » dans LeRobot est un petit wrapper autour de Qwen3VLForConditionalGeneration de transformers, plus la logique de masquage des étiquettes. Le processeur gère le tokeniseur et construit le prompt de chat complet (modèle EO-1/Robometer).

Ce que couvre l'intégration LeRobot

  • Configuration standard reward_model.type=topreward via LeRobot.
  • Chargement de VLM via l'API Qwen3VLForConditionalGeneration de transformers.
  • Assemblage du prompt + tokenisation dans le processeur (correspondant à QwenClient.compute_instruction_reward en amont).
  • compute_reward() renvoie une log-probabilité scalaire par échantillon.
  • LeRobot reward-model save/load — save_pretrained n'écrit que config.json (le VLM est identifié par vlm_name).
  • Un script d'étiquetage hors ligne qui écrit un fichier topreward_progress.parquet (schéma compatible SARM) pour RA-BC et l'overlay.

Le port LeRobot actuel prend en charge uniquement le client Qwen3-VL. Les autres clients en amont (Gemini, OpenAI, Gemma, Molmo) peuvent être ajoutés dans des extensions ultérieures.

Prérequis d'installation

  1. Installez LeRobot en suivant le Guide d'installation.
  2. Installer l’option supplémentaire TOPReward :
pip install -e ".[topreward]"

ou, avec uv depuis un checkout source :

uv sync --extra topreward

Cela importe transformers. Lors de la première exécution de TOPReward, Hugging Face téléchargera également les poids du VLM depuis le Hub (environ 16 Go pour Qwen3-VL-8B-Instruct). L’utilisation d’un GPU est fortement recommandée.

Entrées et sorties du modèle

TOPReward s'attend à :

  • Une vidéo de trajectoire ou une séquence d'images.
  • Description de la tâche en langage naturel.

Dans les jeux de données LeRobot, le préprocesseur lit :

Champ de configurationPar défautSignification
reward_model.image_keyobservation.images.topObservation de la caméra utilisée par TOPReward
reward_model.task_keytaskSaisissez des données complémentaires pour la chaîne de tâches
reward_model.max_frames16Limite du nombre d'images par échantillon
reward_model.fps2.0Métadonnées passées au processeur vidéo Qwen
reward_model.vlm_nameQwen/Qwen3-VL-8B-InstructIdentifiant du modèle VLM sous-jacent sur le Hugging Face Hub

Le modèle renvoie :

  • compute_reward(batch) : une log-probabilité par échantillon. Plus la valeur est élevée, meilleure est l’alignement tâche-vidéo. Si success_threshold est fini, renvoie la valeur binaire seuillée à la place.

Utilisation

Charger le modèle de récompense directement

from lerobot.rewards.topreward import TOPRewardConfig, TOPRewardModel

cfg = TOPRewardConfig(
    vlm_name="Qwen/Qwen3-VL-8B-Instruct",
    device="cuda",
)
reward_model = TOPRewardModel(cfg)

Utiliser la fabrique de récompenses

from lerobot.rewards import make_reward_model, make_reward_model_config, make_reward_pre_post_processors

cfg = make_reward_model_config(
    "topreward",
    vlm_name="Qwen/Qwen3-VL-8B-Instruct",
    device="cuda",
    image_key="observation.images.top",
)
reward_model = make_reward_model(cfg)
preprocessor, postprocessor = make_reward_pre_post_processors(cfg)

Le préprocesseur tokenise le prompt complet (vidéo + préfixe + suffixe d'instruction), écrit les tenseurs Qwen-VL + prompt_length sous observation.topreward.*. Le modèle lit ces tenseurs, applique un masque de labels basé sur prompt_length, et extrait la récompense de log-prob.

Étiquetage de jeu de données hors ligne

Écrivez un topreward_progress.parquet pour l’entraînement RA-BC et les vidéos superposées :

# Sparse-dense (15 anchors per episode, matches upstream)
uv run python -m lerobot.rewards.topreward.compute_rabc_weights \
    --dataset-repo-id lerobot/libero_10_image \
    --num-samples 15 \
    --device cuda

Puis, affichez le superposé de progression pour tout épisode :

uv run examples/dataset/create_progress_videos.py \
    --repo-id lerobot/libero_10_image \
    --episode 0 \
    --progress-file topreward_progress.parquet \
    --gif

Notes de configuration

Réglages du prompt

Le prompt par défaut reprend celui de l'article original :

prompt_prefix = "The above video shows a robot manipulation trajectory that completes the following task: "
prompt_suffix_template = "{instruction} Decide whether the above statement is True or not. The answer is: True"

Les deux sont exposés sur TOPRewardConfig pour l’ablation. Le modèle de suffixe doit contenir {instruction}.

Modèle de chat

add_chat_template=True enveloppe le prompt complet (y compris l’instruction) avec le modèle de chat du tokenizer avant la tokenisation. La valeur par défaut est False, ce qui correspond aux expériences principales du papier d’origine.

Limites

  • Le port LeRobot actuel est limité à l’inférence et au zéro-shot ; forward() n’est pas redéfini et is_trainable renvoie False.
  • Seule la famille Qwen3-VL est prise en charge ; les autres clients en amont sont hors périmètre.
  • TOPReward hérite des biais du VLM sous-jacent.

Références

Citation

@article{chen2026topreward,
  title={TOPReward: Token Probabilities as Hidden Zero-Shot Rewards for Robotics},
  author={Chen, Shirui and Harrison, Cole and Lee, Ying-Chun and Yang, Angela Jin and
          Ren, Zhongzheng and Ratliff, Lillian J and Duan, Jiafei and Fox, Dieter and
          Krishna, Ranjay},
  journal={arXiv preprint arXiv:2602.19313},
  year={2026}
}

Licence

Le code source original de TOPReward est sous licence MIT. La portée LeRobot suit la licence Apache 2.0 de LeRobot ; les poids Qwen3-VL encapsulés sont soumis à la licence Qwen d'origine.

Update on GitHub