La matrice d'entraînement AY-Robots avec cinq politiques en lignes et quatre bras robotiques en colonnes, chaque cellule un lien vers un guide de réglage fin spécifique
Pi0.5Correspondance de fluxEntraînement VLALeRobotRéglage fin

Comment entraîner Pi0.5 sur vos propres données de robot

AY-Robots ResearchAugust 23, 202616 min de lecture

Affinez Pi0.5, le VLA de correspondance de flux de Physical Intelligence, sur vos propres données de robot. Commandes réelles pour openpi et lerobot pi05, pièges du format de jeu de données, limites de VRAM et de latence.

Pi0.5 est le modèle à privilégier lorsqu'une politique doit fonctionner dans une pièce qu'elle n'a jamais vue. C'est aussi le plus délicat des cinq politiques entraînables ici à affiner à la main : le dépôt amont est d'abord JAX, le port LeRobot a déplacé le déploiement hors de lerobot-record en 0.6.0 et a rendu l'installation de base trop petite pour l'entraînement, et un affinage complet ne tient pas sur une 4090. Ci-dessous : ce que le flow matching coûte à l'inférence, les deux chemins de commande, et le nombre de 485 ms qui décide si le résultat est utilisable.

Ce qu'il faut savoir

  • Un VLA de type flow-matching : un VLM PaliGemma de 3 milliards de paramètres plus un expert d'action de 300 millions de paramètres décodant des blocs d'action continus. Deux voies pour l'affiner, openpi et LeRobot pi05, avec 0,65 point d'écart sur la moyenne LIBERO.
  • L'affinage complet nécessite plus de 70 Go de VRAM. openpi liste LoRA à 22,5 Go, uniquement sur son chemin JAX.
  • Le jeu de données doit être LeRobotDataset v3.0 avec les quantiles q01 et q99 dans meta/stats.json, sinon le premier lot échoue.
  • Vérifiez d'abord votre version de lerobot : la version 0.6.0 a allégé le paquet de base et a déplacé le déploiement hors de lerobot-record.
  • Ici, il s'exécute à 485 ms par étape d'action, nécessite 50 épisodes et coûte environ 4 à 12 USD par exécution.

Ce qu'est réellement Pi0.5

Physical Intelligence a publié pi0 en octobre 2024 : un modèle vision-langage-action de type flow matching basé sur un VLM pré-entraîné : PaliGemma avec 3 milliards de paramètres plus un expert d'action de 300 millions de paramètres initialisé à partir de zéro, soit 3,3 milliards au total. L'article rapporte un pré-entraînement sur plus de 10 000 heures de données robotiques à travers 7 configurations de robots et 68 tâches. Plus d'informations dans l'article sur pi0.

Pi0.5 (arXiv 2504.16054, 22 avril 2025) conserve cette architecture et modifie le régime d'entraînement : données web, détection d'objets, instructions verbales d'humains coachant le robot, étiquettes de sous-tâches, données inter-incarnations provenant de robots dans de nombreux foyers. Le résultat est un robot nettoyant des cuisines dans des maisons qui ne faisaient pas partie de l'ensemble d'entraînement. Le README d'openpi ajoute un détail que le titre n'indique pas : le pi0.5 publié a été entraîné avec une isolation des connaissances (arXiv 2505.23705).

Propriétépi0pi0.5
Variante du backbone VLMgemma_2b (PaliGemma)gemma_2b (PaliGemma)
Variante de l'expert d'actiongemma_300mgemma_300m
action_dim3232
horizon d'action par défaut5050
max_token_len48200
discrete_state_inputfalsetrue, l'état est discrétisé en bins dans le prompt
Checkpoint de basegs://openpi-assets/checkpoints/pi0_basegs://openpi-assets/checkpoints/pi05_base
Ce qui est public n'est pas l'intégralité de l'article

Le README d'openpi est explicite : le dépôt ne prend en charge que la tête de "flow matching", pour l'entraînement et l'inférence de pi0.5. L'article décrit deux étapes et le code ne contient que la seconde : le pré-entraînement représente chaque action comme des tokens discrets via le tokenizer FAST, et lors du déploiement, le modèle infère une sous-tâche de haut niveau avant chaque bloc d'action. Aucune de ces étapes n'est dans le dépôt. La carte lerobot/pi05_base donne la même liste et ajoute le RL, bien que l'article sur pi0.5 ne décrive aucune étape d'apprentissage par renforcement. Le port LeRobot hérite de cette portée, tout comme chaque entraîneur hébergé, y compris celui-ci. La licence est également divisée : la page de documentation de pi05 indique Apache 2.0, la carte lerobot/pi05_base est étiquetée license: gemma.

Ce que le "flow matching" change dans l'entraînement et l'inférence

Une politique que vous pouvez entraîner sur un SO-100 régresse soit directement les actions (ACT) ou les tokenise et les décode de manière autorégressive (pi0-FAST). Le flow matching ne fait ni l'un ni l'autre : il apprend un champ vectoriel qui transporte le bruit vers un morceau d'action, puis l'intègre. L'article pi0 utilise 10 étapes d'intégration avec un pas de 0,1 ; la configuration pi05 de LeRobot utilise le même `num_inference_steps: int = 10`.

  • Entraînement : la perte régresse un morceau d'action bruité. Pas de tokenizer à ajuster, pas de discrétisation de vos angles articulaires.
  • Inférence : un morceau coûte dix passages avant à travers l'expert d'action. C'est structurel, pas un problème d'ajustement.
  • Sortie : actions continues de dimension 32, complétées en interne, perte calculée sur les dimensions de votre robot. Un bras à 6-DoF plus pince utilise 7.
python
# openpi/src/openpi/models/pi0_config.py - the defaults every pi05 config inherits
@dataclasses.dataclass(frozen=True)
class Pi0Config(_model.BaseModelConfig):
    dtype: str = "bfloat16"
    paligemma_variant: _gemma.Variant = "gemma_2b"
    action_expert_variant: _gemma.Variant = "gemma_300m"

    action_dim: int = 32
    action_horizon: int = 50
    max_token_len: int = None      # 200 if pi05 else 48

    pi05: bool = False             # flips discrete_state_input to True
Lu depuis src/openpi/models/pi0_config.py sur la branche principale openpi, 23 août 2026.

Le backbone PaliGemma, et la porte devant lui

PaliGemma (arXiv 2407.07726) est un encodeur de vision SigLIP-So400m basé sur un modèle de langage Gemma-2B, d'environ 3 milliards de paramètres. Pi0.5 hérite de son tokenizer, et ce tokenizer se trouve dans un dépôt à accès restreint. C'est la manière la plus courante pour qu'une première exécution échoue, avant la première étape d'entraînement.

Acceptez la licence à accès restreint avant de louer un GPU

La documentation de LeRobot pi05 l'indique clairement : pi0.5 utilise le tokenizer google/paligemma-3b-pt-224 à accès restreint, alors acceptez sa licence sur le Hub et exécutez hf auth login en premier. L'accès est accordé manuellement, pas instantanément. Si vous ignorez cette étape, démarrez une exécution cloud payante, et vous paierez pour un pod qui ne peut pas télécharger de tokenizer.

Avant de commencer : format du jeu de données, épisodes, matériel

Pi0.5 dans LeRobot lit un jeu de données LeRobot au format v3.0, qui est apparu avec lerobot 0.4.0 en octobre 2025 : plusieurs épisodes par fichier Parquet et MP4 au lieu d'un fichier par épisode, avec des limites dans meta/episodes/ plutôt que dans les noms de fichiers. Enregistrez avec le client de bureau ou suivez enregistrez votre premier jeu de données et vous l'aurez.

ModeMémoire GPU requiseExemple de GPU
Inférencemore than 8 GBRTX 4090
Fine-tuning, LoRAmore than 22.5 GBRTX 4090
Fine-tuning, completmore than 70 GBA100 80 GB or H100
Le piège de la version qui coûte une journée

Pi0.5 et SmolVLA nécessitent LeRobot v3.0. GR00T N1.7 et GR00T N1.5 nécessitent v2.0 ou v2.1 et plantent sur un jeu de données v3.0. Une session d'enregistrement ne peut pas alimenter les deux sans conversion, et l'erreur n'indique pas "mauvaise version du jeu de données". Voir jeu de données rejeté : v3 requis.

bash
# v2.1 -> v3.0, run against a dataset already on the Hub
python -m lerobot.scripts.convert_dataset_v21_to_v30 --repo-id=<HF_USER/DATASET_ID>

# aggregates episode-0000.parquet, episode-0001.parquet, ... -> file-0000.parquet
# aggregates episode-0000.mp4, episode-0001.mp4, ...         -> file-0000.mp4
# rewrites meta/episodes/* with per-episode lengths, tasks and offsets
Extrait de la documentation de LeRobotDataset v3.0.

La plateforme requiert au moins 50 épisodes pour Pi0.5, le même seuil que pour GR00T et ACT. Le pré-entraînement fait le plus gros du travail, donc 50 épisodes propres valent mieux que 200 bâclés. Nouveau dans ce domaine ? Commencez par le guide de collecte de données.

La page des politiques d'AY-Robots comparant les cinq politiques entraînables par paramètres, catégorie de GPU, latence et nombre minimum d'épisodes
Pi0.5 se situe dans la catégorie A100 et H100 à 485 ms par étape d'action, avec un minimum de 50 épisodes.

Voie A : affiner avec le dépôt openpi

L'implémentation de référence : JAX d'abord, testée uniquement sur Ubuntu 22.04, pilotée par des objets de configuration plutôt que par des drapeaux. Un chemin PyTorch est arrivé en septembre 2025, validé sur LIBERO. Trois étapes : convertir vos données, définir une configuration, entraîner et servir.

  1. 1
    Cloner et installer

    openpi utilise uv. GIT_LFS_SKIP_SMUDGE permet à LeRobot d'être une dépendance sans les objets LFS.

    bash
    git clone --recurse-submodules git@github.com:Physical-Intelligence/openpi.git
    cd openpi
    
    GIT_LFS_SKIP_SMUDGE=1 uv sync
    GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .
  2. 2
    Convertir vos données en un jeu de données LeRobot

    L'amont fournit des convertisseurs pour LIBERO et DROID et s'attend à ce que vous en adaptiez un. Le travail consiste à mapper les clés.

    bash
    uv run examples/libero/convert_libero_data_to_lerobot.py --data_dir /path/to/your/data
  3. 3
    Ajouter une configuration d'entraînement

    Les configurations sont des entrées TrainConfig dans src/openpi/training/config.py. Celle-ci adapte pi05_droid_finetune, avec le chargeur de poids pointant vers pi05_base.

    python
    TrainConfig(
        name="pi05_so100",
        model=pi0_config.Pi0Config(
            pi05=True,
            action_dim=32,        # pi05 is trained with 32-dim actions
            action_horizon=16,
        ),
        # Copy LeRobotLiberoDataConfig in the same file and rewrite the key
        # mapping for your camera names, then reference your copy here.
        data=LeRobotLiberoDataConfig(
            repo_id="your_hf_username/my_so100_dataset",
            base_config=DataConfig(prompt_from_task=True),
        ),
        weight_loader=weight_loaders.CheckpointWeightLoader(
            "gs://openpi-assets/checkpoints/pi05_base/params"
        ),
        batch_size=32,
        num_train_steps=20_000,
    )
  4. 4
    Calculer les statistiques de normalisation

    S'exécute par rapport au nom de la configuration, pas au jeu de données. Le sauter est la première erreur classique ici.

    bash
    uv run scripts/compute_norm_stats.py --config-name pi05_so100
  5. 5
    Entraîner

    La variable permet à JAX d'utiliser 90 % de la mémoire GPU au lieu des 75 % par défaut. Sur une carte de 80 Go, cela détermine si l'exécution survit.

    bash
    XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi05_so100 \
        --exp-name=my_experiment \
        --overwrite
  6. 6
    Servir

    Le serveur écoute sur le port 8000 et répond aux requêtes d'observation ; votre environnement d'exécution robotique est le client.

    bash
    uv run scripts/serve_policy.py policy:checkpoint \
        --policy.config=pi05_so100 \
        --policy.dir=checkpoints/pi05_so100/my_experiment/20000
Le chemin PyTorch n'est pas le chemin JAX

L'implémentation PyTorch d'openpi ne prend pas en charge pi0-FAST, la précision mixte, FSDP, LoRA ou les poids EMA, donc le LoRA qui atteint 22.5 GB est uniquement JAX, via les variantes gemma_2b_lora et gemma_300m_lora. Pire encore : la configuration copie des fichiers patchés sur votre installation de transformers 4.53.2, et le README avertit qu'avec le mode de lien physique par défaut d'uv, cela modifie de manière permanente transformers dans le cache d'uv et peut se propager à d'autres projets. Annulez cela avec uv cache clean transformers.

Route B : affiner avec lerobot pi05

Le port LeRobot encapsule les mêmes poids dans l'interface de ligne de commande que vous utilisez déjà pour ACT et SmolVLA. Tout ce qui suit a été vérifié par rapport à lerobot 0.6.1, la version depuis le 3 août 2026, et la documentation de pi05 du 23 août 2026. Les versions sont importantes ici : les jeux de données v3.0 sont arrivés avec la version 0.4.0 en octobre 2025, le blog 0.5.0 du 9 mars 2026 présente pi0-FAST et le Real-Time Chunking, et la version 0.6.0 du 6 juillet 2026 a allégé le package de base et déplacé le déploiement vers lerobot-rollout.

Une chose n'a pas changé : lerobot-train et lerobot-record étaient déjà des points d'entrée dans la version 0.3.2, en août 2025. Un tutoriel qui appelle encore python -m lerobot.scripts.train est antérieur à une année de changements et mérite d'être mis en doute sur le reste également.

  1. 1
    Installer avec les bons extras

    Depuis la version 0.6.0, l'installation de base ne contient que les dépendances ML essentielles, et l'extra pi n'ajoute aucun code de jeu de données ou d'entraînement. Une mise au point nécessite donc également l'extra d'entraînement. Les anciennes commandes en une ligne échouent ici au moment de l'importation.

    bash
    # policy dependencies plus the training stack
    pip install 'lerobot[pi,training]'
    
    # from a source checkout
    pip install -e ".[pi,training]"
    
    # driving an SO-100 afterwards needs the robot extras too
    pip install 'lerobot[core_scripts,feetech]'
  2. 2
    S'authentifier

    Acceptez la licence paligemma-3b-pt-224 dans un navigateur, puis connectez-vous sur la machine d'entraînement.

    bash
    hf auth login
  3. 3
    Ajouter des statistiques de quantiles

    Pi0.5 normalise STATE et ACTION avec des quantiles, donc meta/stats.json a besoin de q01 et q99. Les anciens jeux de données ne contiennent que min, max, mean, std.

    bash
    lerobot-edit-dataset \
        --repo_id your_dataset \
        --new_repo_id your_dataset \
        --operation.type recompute_stats \
        --operation.overwrite true
  4. 4
    Affiner à partir de lerobot/pi05_base

    Définissez la taille du lot en fonction de ce que votre carte peut supporter ; la documentation utilise 64 sur LIBERO avec 80 Go. Passez bfloat16 explicitement, la valeur par défaut de la configuration est float32.

    bash
    lerobot-train \
        --dataset.repo_id=${HF_USER}/my_so100_dataset \
        --policy.type=pi05 \
        --policy.pretrained_path=lerobot/pi05_base \
        --policy.gradient_checkpointing=true \
        --policy.dtype=bfloat16 \
        --policy.device=cuda \
        --policy.push_to_hub=false \
        --output_dir=./outputs/pi05_so100 \
        --job_name=pi05_so100 \
        --batch_size=4 \
        --num_workers=8 \
        --steps=30000 \
        --save_freq=5000 \
        --seed=1000
  5. 5
    L'exécuter sur le bras

    Dans la version 0.6.x, c'est lerobot-rollout : lerobot-record refuse une politique et rejette les noms de jeux de données eval_. Base pilote le bras, sentry enregistre le déploiement.

    bash
    lerobot-rollout \
        --strategy.type=base \
        --policy.path=${HF_USER}/my_policy \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM1 \
        --robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30}}" \
        --task="Put lego brick into the transparent box" \
        --duration=60
    
    # same run, recorded into an eval_ dataset
    lerobot-rollout \
        --strategy.type=sentry \
        --policy.path=${HF_USER}/my_policy \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM1 \
        --dataset.repo_id=${HF_USER}/eval_so100 \
        --dataset.single_task="Put lego brick into the transparent box" \
        --duration=600
OptionCe qu'il faitRemarque
--policy.type=pi05sélectionne Pi0.5requis avec pretrained_path, à omettre avec --policy.path
--policy.pretrained_pathcharge uniquement les poidsnoms des caractéristiques de votre jeu de données, les paramètres stockés sont réinitialisés
--policy.pathpoids plus le fichier config.json du checkpointles paramètres stockés tels que n_action_steps sont hérités
--policy.n_action_stepsétapes consommées par chunkrevient à 50, jamais au-dessus de chunk_size (par défaut 50)
--policy.train_expert_onlygèle le VLM, entraîne l'expertpar défaut false, moins de mémoire, un certain coût en termes de succès
--policy.gradient_checkpointingrecalcule au lieu de stocker les activationspar défaut false, le premier levier lorsqu'une exécution ne rentre pas
--peft.method_type=LORAadaptateurs LoRA au lieu de poids completsnécessite l'extra peft, l'exemple documenté est SmolVLA
--policy.rtc_training_max_delayconditionnement du préfixe d'action pour RTCbranche principale uniquement, pas dans 0.6.1, doit rester en dessous de chunk_size
--rename_mapmappe les colonnes du jeu de données sur les caractéristiques de la politiquenécessaire lorsque les clés de votre caméra diffèrent
L'erreur que la plupart des premières exécutions rencontrent

Sans quantiles, vous obtenez ValueError: QUANTILES normalization mode requires q01 and q99 stats dès le premier lot. Recalculez les statistiques, mais le résultat atterrit dans $HF_LEROBOT_HOME/your_dataset, et non dans le cache lu par --dataset.repo_id. Entraînez donc avec --dataset.root pointant vers cet emplacement ou poussez vers le Hub. Ou ignorez les quantiles avec --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}', comme le fait la commande de référence LIBERO.

Trois ensembles de valeurs par défaut, et lesquels atteignent l'entraîneur

TrainConfig d'openpi est la référence, PI05Config de LeRobot est ce que lerobot-train utilise par défaut, et le formulaire ici envoie un troisième ensemble. La surprise est le taux d'apprentissage : les deux valeurs par défaut en amont culminent à 2.5e-5, tandis que la configuration pi05_libero d'openpi et cette plateforme le portent à 5e-5.

ParamètreTrainConfig d'openpilerobot pi05 et lerobot-trainAY-Robots envoie
Taille du lot3281
Taux d'apprentissage maximal2.5e-5, décroissance cosinusoptimizer_lr 2.5e-55e-5
Étapes d'entraînement30,000100,00030,000
Intervalle de sauvegarde1,000 étapes20,000 étapespas dans le formulaire
Graine421,000dans le formulaire
Bloc d'actionaction_horizon 50chunk_size 50, n_action_steps 50pas dans le formulaire
Type de données des poidsbfloat16float32 until you pass --policy.dtypepas dans le formulaire
Accumulation de gradientpas de tel réglage, fsdp_devices à la placeabsent de toutes les versions jusqu'à présent16, et il est abandonné

Le portage est-il fidèle ? L'équipe LeRobot a affiné le modèle de base LIBERO sur 6k étapes supplémentaires et a comparé les résultats avec les chiffres de référence d'openpi sur quatre suites : 97.5 pour cent en moyenne contre 96.85, en avance sur Libero 10, en retard sur Spatial. Le choix de l'implémentation est un choix d'outillage, pas de qualité.

Affiner Pi0.5 sur vos propres données
Avantages
  • Plus de 10,000 heures de pré-entraînement de robot derrière lui, donc 50 épisodes de votre tâche peuvent suffire.
  • Actions continues : pas de tokenizer à régler, pas de seuil de discrétisation sur vos angles articulaires.
  • Le portage LeRobot obtient 97.5 pour cent en moyenne sur LIBERO contre 96.85 pour openpi, donc l'interface CLI plus conviviale ne coûte rien de mesurable.
  • Chemins efficaces en paramètres des deux côtés : les variantes LoRA JAX d'openpi, l'intégration PEFT de LeRobot.
Compromis
  • L'affinage complet nécessite plus de 70 Go. Le chiffre LoRA de 22.5 Go est celui de JAX d'openpi ; aucun n'est publié pour pi05 sous PEFT.
  • 485 ms par étape d'action, le plus lent des cinq ici : deux fois SmolVLA, vingt-quatre fois ACT.
  • LeRobot v3.0 est requis, donc un jeu de données enregistré pour une exécution GR00T doit être converti, et vice versa.
  • Les nouvelles options arrivent d'abord sur main : la mémoire RTC et MEM au moment de l'entraînement ne sont pas dans la version 0.6.1, donc les documentations les plus récentes peuvent impliquer une installation depuis git.

La réalité des 485 ms, et où cela cesse d'être utilisable

Cela détermine votre projet, donc cela précède le tableau des coûts. La par étape d'action mesurée ici pour Pi0.5 est de 485 ms. Comparé aux quatre autres :

PolitiqueInférence par étape d'actionParamètresNiveau de GPUÉpisodes minimum
ACT20 ms~80 MRTX 4090 or any 24 GB card50
GR00T N1.7152 ms~3 BA100 80 GB or H100 80 GB50
GR00T N1.5165 ms~3 BA100 80 GB or H100 80 GB50
SmolVLA245 ms~450 MRTX 4090 or any 24 GB card30
Pi0.5485 ms~3 BA100 80 GB or H100 80 GB50
La page de comparaison AY-Robots pour GR00T N1.7 contre Pi0.5, avec les paramètres, le niveau de GPU, la latence et le format du jeu de données
Même niveau de GPU, même seuil d'épisodes, version de jeu de données différente, écart de latence de trois fois.
L'inférence doit être proche des servomoteurs

La boucle de contrôle de ces cinq modèles s'exécute en 20 à 485 ms par étape d'action. Des allers-retours sur l'internet public, en plus des 485 ms, transforment une politique fonctionnelle en une politique hésitante. L'inférence à distance est viable pour des tâches lentes de 'pick-and-place', mais pas pour des mouvements réactifs rapides. Nous préférons dire cela plutôt que de vendre une démo qui ne fonctionne que sur un réseau local. Si votre bras marque une pause entre les segments, commencez par la politique se fige en plein mouvement.

L'amont a une réponse, et la moitié est déjà dans la version que vous pouvez installer. Le 'Real-Time Chunking' génère le segment suivant pendant que le bras exécute encore le segment actuel, puis guide les étapes qui se chevauchent du nouveau segment pour qu'elles restent proches de la partie déjà exécutée, afin que le bras ne cale pas ou ne saccade pas à la jonction. La forme d'inférence a été livrée dans le changelog 0.4.2 pour Pi0, Pi0.5 et SmolVLA et est un flag de déploiement, pas un réentraînement :

bash
lerobot-rollout \
    --strategy.type=base \
    --policy.path=${HF_USER}/my_policy \
    --inference.type=rtc \
    --inference.rtc.execution_horizon=10 \
    --inference.rtc.max_guidance_weight=10.0 \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM1 \
    --robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30}}" \
    --task="Put lego brick into the transparent box" \
    --duration=60
execution_horizon est le nombre d'étapes du segment précédent avec lesquelles le nouveau doit être en accord ; la documentation RTC indique 8 à 12 comme plage habituelle. Le backend d'inférence par défaut est --inference.type=sync.

Cela ne rend pas le modèle plus rapide. Cela masque le délai : les 485 ms sont toujours dépensées, mais hors du chemin critique, de sorte que la file d'attente ne se vide pas entre les segments. La variante au moment de l'entraînement, issue d'arXiv 2512.05964, va plus loin : le modèle apprend à se conditionner sur un préfixe d'action propre, de sorte qu'à l'inférence, le chevauchement est 'hard-inpainted' avec des pas de temps de flux par action au lieu d'être guidé, et le passage arrière de guidage disparaît. Pendant l'entraînement, il échantillonne une longueur de préfixe par exemple et calcule la perte de flux sur le suffixe restant. Ce flag n'est disponible que sur 'main', pas dans la version 0.6.1, et le délai pour lequel vous entraînez doit rester inférieur à chunk_size.

Deux façons d'obtenir un checkpoint Pi0.5

Vous louez ou possédez une carte de 80 Go, installez l'une des piles ci-dessus, convertissez votre jeu de données et supervisez l'exécution. Vous conservez tous les réglages : JAX LoRA d'openpi, adaptateurs PEFT de LeRobot, actions relatives, mappages de touches personnalisés. Vous conservez également tous les échecs.

  • Matériel : A100 80 Go ou H100, ou une carte de 24 Go sur le chemin JAX LoRA d'openpi.
  • Configuration : un après-midi pour la première exécution, principalement le mappage des touches et le tokenizer à accès contrôlé.
  • Non disponible sur le formulaire hébergé : adaptateurs PEFT, actions relatives, RTC au moment de l'entraînement, mémoire MEM.
bash
lerobot-train \
    --dataset.repo_id=${HF_USER}/my_so100_dataset \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_base \
    --policy.rtc_training_max_delay=10 \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --batch_size=4 --steps=30000 --seed=1000
La commande qu'aucun formulaire hébergé n'exécute, et que pip ne peut pas installer : le RTC au moment de l'entraînement est un flag de la branche principale.

Quand cela ne fonctionne pas

SymptômeCause la plus probable
Exécution rejetée avant de commencerJeu de données v2.1 mais Pi0.5 veut v3.0, ou l'inverse pour GR00T
ImportError, package datasets manquantlerobot 0.6.x sans l'extra d'entraînement
ValueError concernant q01 et q99 sur le premier lotPas de quantiles dans meta/stats.json ; recalculer ou utiliser MEAN_STD
CUDA out of memory à l'étape 0Fine-tune complet en dessous de 70 Go ; essayez le checkpointing ou train_expert_only
Erreur 401 ou de dépôt à accès contrôléLicence du tokenizer PaliGemma non acceptée
La perte diminue, le robot ne fait rienInadéquation de la normalisation, ou la politique copie l'état
Le bras s'interrompt entre les chunksLatence par étape plus aller-retour ; la file d'attente de chunks se vide
Fonctionne dans une configuration, échoue dans une autreTrop peu d'épisodes, ou tous dans une seule configuration

Ce que coûte une exécution

Pi0.5 se situe dans la catégorie coûteuse car il nécessite une carte de 80 Go, et les prix spot varient, donc le chiffre est une fourchette plutôt qu'un prix. Pour de nombreuses tâches SO-100, entraînez SmolVLA ou ACT sur la catégorie 24 Go d'abord, confirmez que la tâche est bien apprenable, puis consacrez-y des heures A100. Entraînez votre première politique parcourt cette boucle moins chère, et la tarification contient les catégories actuelles.

CatégoriePolitiquesExécution typiquePrix par heureCoût par exécution
A100 80 GB or H100Pi0.5, GR00T N1.7, GR00T N1.53 to 6 hours1.20 to 2.00 USDabout 4 to 12 USD
RTX 4090 or any 24 GB cardSmolVLA, ACT2 to 5 hours0.30 to 0.60 USDabout 1 to 3 USD
Le tableau des coûts AY-Robots indiquant le GPU requis par chaque politique, la durée d'exécution et le prix typiques, et le nombre d'épisodes nécessaires avant qu'une politique ne soit utile
Les deux mêmes niveaux sur la page produit : Pi0.5 loue la carte de 80 Go, SmolVLA et ACT tiennent sur une 4090.

Avant de vous engager pour une soirée : GR00T N1.7 contre Pi0.5 et Pi0.5 contre SmolVLA présentent les mêmes chiffres côte à côte. L'Arène contient 85 modèles VLA avec 332 résultats de benchmark, chacun lié à sa source, et des informations de fond sur la famille se trouvent dans notre aperçu des VLA.

Entraînez Pi0.5 sans construire la pile

Choisissez le jeu de données et les hyperparamètres dans un formulaire. Le backend loue une carte de 80 Go sur le marché spot, exécute l'entraîneur et écrit les points de contrôle dans le stockage d'objets. Guides pour SO-100, SO-101, Koch v1.1 et LeKiwi.

Ouvrir les guides d'entraînement
Puis-je affiner Pi0.5 sur une RTX 4090 ?

Pas un réglage fin complet : openpi indique plus de 70 Go pour cela, donc une A100 80 Go ou une H100. Son chiffre LoRA de 22,5 Go appartient au chemin JAX ; l'implémentation PyTorch n'a pas de LoRA. L'intégration PEFT de LeRobot existe, mais son exemple documenté est SmolVLA et aucun chiffre de VRAM n'est publié pour pi05.

Combien d'épisodes me faut-il ?

Cinquante, le même seuil que GR00T et ACT ; seul SmolVLA descend plus bas, à 30. Le point de contrôle de base contient plus de 10 000 heures de pré-entraînement, donc le réglage fin s'adapte plutôt que d'apprendre de zéro : 50 épisodes propres et variés l'emportent sur deux cents provenant d'une seule configuration.

Quelle est la différence entre --policy.path et --policy.pretrained_path ?

--policy.path charge les poids et le config.json du point de contrôle, de sorte que les paramètres stockés tels que n_action_steps sont hérités et --policy.type doit être omis. --policy.pretrained_path ne charge que les poids : les noms des caractéristiques proviennent de votre jeu de données, les paramètres stockés sont réinitialisés, --policy.type est requis. C'est pourquoi la commande LIBERO passe n_action_steps=10 et empty_cameras=1 explicitement ; sinon, ils reviennent à 50 et 0.

La version ouverte me donne-t-elle le Pi0.5 complet de l'article ?

Non. Les deux ne prennent en charge que la tête d'action de correspondance de flux. L'étape de pré-entraînement par jetons discrets avec le tokenizer d'action FAST et la prédiction de sous-tâches de haut niveau n'ont pas été publiées, et la carte lerobot/pi05_base ajoute le RL à cette liste même si l'article pi0.5 ne décrit aucune étape d'apprentissage par renforcement. Vous entraînez une politique de bas niveau conditionnée par une chaîne de caractères que vous fournissez, et non un modèle qui décompose lui-même une tâche longue.

Contre quelles versions ce guide est-il écrit ?

openpi sur main et lerobot 0.6.1, la version depuis le 3 août 2026, toutes deux lues le 23 août 2026. Les jeux de données v3.0 sont arrivés avec la version 0.4.0 en octobre 2025. La version 0.6.0 a allégé le package de base, de sorte que lerobot[pi] seul n'installe plus de pile d'entraînement, et a déplacé le déploiement vers lerobot-rollout. Le RTC au moment de l'entraînement n'est que sur main ; l'entraîneur hébergé ici exécute la version 0.5.1.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started