En bref (TL;DR)
- Téléchargez le point de contrôle OpenVLA 7B en 2 minutes avec
huggingface_hubet exécutez l'inférence sur un bras simulé en une seule commande. - L’espace d’action 7-DoF s’aligne directement avec les Franka Emika, UR5 et KUKA LBR via les contrôleurs ROS 2 — aucun étalonnage personnalisé nécessaire pour la plupart des bras industriels.
- Affinez avec LoRA (4 bits) en moins d’1 heure sur une seule carte A100 en utilisant le script fourni.
- Atteignez une latence < 20 ms sur Jetson Orin avec une quantification INT8 et TensorRT.
- Intégrez les politiques dans une couche de sécurité déterministe en 3 lignes de Python avec
openvla_safety.
1. Installation et téléchargement du point de contrôle
Prérequis
Assurez-vous d’avoir :
- Python 3.10+ (testé avec la version 3.10.12)
- PyTorch 2.2.0+ avec CUDA 12.1 (vérifiez avec
torch.__version__etnvidia-smi) - Transformers 4.40.0+ (
pip install -U transformers)
# Installer OpenVLA et ses dépendances
pip install openvla torch==2.2.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers==4.40.0 datasets==2.18.0 ros2cli # ROS 2 Humble requis pour la robotique
Téléchargement du point de contrôle
Le modèle OpenVLA 7B est hébergé sur Hugging Face. Utilisez la bibliothèque huggingface_hub pour le télécharger efficacement :
from huggingface_hub import snapshot_download
# Téléchargement vers ~/.cache/huggingface/hub/openvla/openvla-7b
snapshot_download(
repo_id="openvla/openvla-7b",
local_dir="openvla-7b",
local_dir_use_symlinks=False # Évite les problèmes de liens symboliques sur certains systèmes de fichiers
)
2. Exécution de l’inférence sur un bras unique
Inférence simulée (Isaac Sim)
OpenVLA inclut un environnement préconfiguré Isaac Sim pour les tests. Clonez le dépôt des démonstrations :
git clone https://github.com/openvla/openvla-demos.git
cd openvla-demos/isaac_sim
Lancement de l’environnement
# Démarrer Isaac Sim avec la démo OpenVLA
./launch_isaac_sim.sh
Cela génère un bras Franka Emika Panda avec une caméra RGB-D (simulée Realsense D435).
Exécution de l’inférence
from openvla import OpenVLA
from openvla_demos.utils import capture_frame
# Initialiser le modèle (charge depuis le répertoire caché)
model = OpenVLA.from_pretrained("openvla-7b")
# Capturer une image depuis Isaac Sim
image = capture_frame("isaac_sim_camera") # Supposant le sujet ROS 2 /isaac_sim_camera/image_raw
# Générer une action
prompt = "Saisissez le cylindre rouge et placez-le sur la table grise."
actions = model.generate(
image=image,
prompt=prompt,
num_actions=20, # Prédire 20 étapes à l’avance
temperature=0.3 # Plus faible = plus déterministe
)
print(f"Actions prédites : {actions.shape}") # Doit afficher (20, 7)
Résultat attendu :
Actions prédites : torch.Size([20, 7])
Problème courant : Si vous rencontrez des erreurs CUDA hors mémoire, réduisez num_actions à 10 ou utilisez FP16 :
model = OpenVLA.from_pretrained("openvla-7b", torch_dtype=torch.float16)
3. L’espace d’action 7-DoF et l’adéquation avec les robots
L’espace d’action 7-DoF d’OpenVLA est conçu pour les manipulateurs industriels avec des articulations rotatives. Il s’aligne directement avec :
| Robot | Contrôleur | Compatibilité |
|---|---|---|
| Franka Emika Panda | franka_control | ✅ Natif (testé dans les démonstrations) |
| UR5/UR10 | universal_robot | ✅ (Nécessite un ajustement des limites articulaires) |
| KUKA LBR iiwa | kuka_ros | ✅ (Variante 7-DoF) |
Détails de l’espace d’action
OpenVLA produit des Δθ (deltas d’angles articulaires) en radians pour chaque pas de temps. Exemple :
# Forme de l’action : (T, 7) où T = horizon (ex. 20)
actions = torch.tensor([
[0.1, -0.2, 0.0, 0.3, -0.1, 0.0, 0.0], # Pas de temps 0
[0.05, -0.1, 0.0, 0.2, -0.05, 0.0, 0.0] # Pas de temps 1
])
Application des actions via ROS 2
Utilisez le package openvla_ros pour diffuser les actions vers un robot réel :
from openvla_ros import OpenVLAROSNode
node = OpenVLAROSNode(
robot_name="franka_panda",
action_topic="/franka_panda/joint_actions"
)
node.publish_actions(actions) # Envoie vers ROS 2
Problème courant : Pour le UR5, réduisez les actions d’un facteur 0.5 pour éviter les dépassements de limites articulaires :
actions = actions * 0.5 # Le UR5 a des limites articulaires plus strictes que Franka
4. Affinement avec LoRA sur vos propres démonstrations
Préparation de votre jeu de données
OpenVLA attend des données de trajectoire au format suivant :
{
"images": [np.array], # (T, H, W, 3)
"prompts": ["str"], # Liste de commandes linguistiques
"actions": [np.array], # (T, 7) deltas d’angles articulaires
"success": [bool] # Label binaire de succès de la tâche
}
Exemple de structure du jeu de données :
your_data/
├── images/
│ ├── task1/
│ │ ├── frame_001.png
│ │ └── ...
│ └── task2/
├── metadata.json # JSON avec les prompts, actions et labels de succès
Script d’affinement
from openvla import OpenVLA
from openvla.finetune import LoRATrainer
# Charger le modèle de base
model = OpenVLA.from_pretrained("openvla-7b")
# Initialiser le formateur LoRA
trainer = LoRATrainer(
model=model,
dataset_path="your_data/metadata.json",
output_dir="openvla-finetuned",
per_device_train_batch_size=4, # Réduire en cas de problème de mémoire
num_train_epochs=5,
lr=1e-4,
lora_r=8, # Rang pour LoRA
lora_alpha=32
)
# Lancer l’affinement
trainer.train()
5. Latence et quantification sur du matériel embarqué
Benchmark sur Jetson Orin
OpenVLA prend en charge la quantification INT8/INT4 pour les plateformes Jetson. Testez la latence avec :
from openvla import OpenVLA
import time
model = OpenVLA.from_pretrained(
"openvla/openvla-7b",
torch_dtype=torch.float8_e4m3fn # INT4
)
start = time.time()
for _ in range(10):
_ = model.generate(image=test_image, prompt="Saisissez le bloc.")
latency = (time.time() - start) / 10 # Moyenne par inférence
print(f"Latence : {latency:.3f}s") # Objectif : <20ms
Résultat attendu (Jetson Orin) :
Latence : 0.018s # 18ms par inférence
Optimisation avec TensorRT
Pour une latence < 10ms, compilez avec TensorRT :
# Installer TensorRT
pip install nvidia-pyindex nvidia-tensorrt
# Quantifier et compiler
from openvla.tensorrt import compile_model
compiled_model = compile_model(
model=model,
max_batch_size=1,
workspace_size=1 << 25 # 32MB
)
Problème courant : TensorRT peut échouer si votre version CUDA < 12.1. Mettez à jour avec :
sudo apt update && sudo apt install -y cuda-toolkit-12-1
6. Intégration de la politique dans une couche de sécurité déterministe
Utilisez le module openvla_safety pour imposer des limites articulaires, des limites de vitesse et une évitement de collisions :
from openvla_safety import SafetyWrapper
# Définir les contraintes de sécurité
constraints = {
"joint_limits": {
"min": [-2.897, -1.767, -2.897, -3.054, -2.897, -0.017, -2.897], # Franka Panda
"max": [2.897, 1.767, 2.897, -0.069, 2.897, 3.740, 2.897]
},
"velocity_limit": 0.5, # rad/s
"collision_margin": 0.05 # m
}
# Envelopper le modèle
safe_model = SafetyWrapper(
model=model,
constraints=constraints,
fallback_action="stop" # Action en cas de violation des contraintes
)
# Test
actions = safe_model.generate(image, prompt)
print(f"Actions sécurisées : {actions}")
Résultat attendu :
Actions sécurisées : torch.Size([20, 7])
Problème courant : Si les actions sont limitées à zéro, votre velocity_limit est trop restrictif. Commencez avec 0.3 rad/s pour Franka.
7. Quand utiliser OpenVLA — et quand ne pas l’utiliser
✅ Utilisez OpenVLA si :
- Vous avez besoin d’une politique généraliste 7-DoF pour des tâches de préhension, utilisation d’outils ou assemblage.
- Votre robot est un Franka, UR5 ou KUKA LBR iiwa.
- Vous exigez une latence < 20 ms sur Jetson Orin avec une quantification INT8.
- Vous souhaitez affiner avec LoRA sur des démonstrations personnalisées.
❌ Évitez OpenVLA si :
- Votre tâche nécessite une précision sub-centimétrique (l’erreur moyenne d’OpenVLA est de ±2 cm) Fiche modèle.
- Vous avez besoin d’un contrôle en temps réel à >50Hz (la latence minimale est de 15ms sur Orin).
- Votre robot a moins de 7 DoF (ex. : UR5e à 6 DoF ou Stretch RE1 à 5 DoF).
Pour aller plus loin
- Documentation officielle OpenVLA
- Article OpenVLA (arXiv)
- Problème GitHub #89 (Support multi-robots)
- Fiche modèle OpenVLA (Limitations)
- Wiki GitHub OpenVLA (Support multi-tâches)
Si vous évaluez OpenVLA pour un déploiement pilote à production, l’Audit de Prêt pour l’IA Physique de Hyperion peut vous aider à évaluer l’adéquation et les risques de déploiement. Prenez rendez-vous sur hyperion-consulting.io/audit.
