LeRobot documentation

VLA-JEPA

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

VLA-JEPA

Esta é a portação do LeRobot para o VLA-JEPA, um modelo Vision-Language-Action que combina um backbone de linguagem Qwen3-VL com um modelo de mundo de vídeo auto-supervisionado (V-JEPA2) e uma cabeça de ação flow-matching DiT.


Visão geral da arquitetura

O VLA-JEPA possui três componentes principais:

ComponenteMóduloFunção
Backbone Qwen3-VLQwen3VLInterfaceFunde imagens + instrução de linguagem em tokens de contexto
Cabeça de ação DiT-BVLAJEPAActionHeadDifusão de correspondência de fluxo sobre o trecho de ação
Modelo de mundo V-JEPA2ActionConditionedVideoPredictorPerda de previsão de vídeo auto-supervisionada (apenas treinamento)

Fluxo de dados

Treinamento:

  1. Um clipe de vídeo de num_video_frames quadros é codificado pelo V-JEPA2 em tokens de patch por quadro.
  2. O backbone Qwen3-VL processa imagens multiview + a instrução da tarefa e produz uma sequência de tokens de contexto que inclui tokens de ação especiais (para condicionamento do modelo de mundo) e tokens corporificados.
  3. A cabeça de ação recebe esses tokens de contexto como chaves/valores de atenção cruzada e prevê um trecho de ação desruído por meio de correspondência de fluxo.
  4. O preditor do modelo de mundo usa os tokens de ação extraídos do Qwen para prever os embeddings de quadros futuros do V-JEPA2; uma perda de regressão sobre essas previsões é adicionada à perda de ação.

Inferência: Apenas o Qwen e a cabeça de ação são usados. O modelo de mundo não é necessário no momento da inferência.

Detalhes da cabeça de ação

Predefinições disponíveis via action_model_type:

Pré-definidoCabeçasDimensão da cabeça
DiT-B1264
DiT-L3248

O preset define apenas a geometria de atenção, e cada entrada pode ser sobrescrita por action_num_heads / action_attention_head_dim. Duas larguras derivam dele:

  • a largura interna do DiT é heads x head_dim (768 para DiT-B), derivada e não configurada;
  • a largura da saída do DiT, bem como a largura dos MLPs do decodificador de ação e do codificador de estado, é action_hidden_size (padrão 1024).

Portanto, o DiT-B executa um transformer de largura 768 que projeta para 1024. Os dois são independentes.

Detalhes do modelo de mundo

O preditor de vídeo é um transformer no estilo ViT (ActionConditionedVideoPredictor) que recebe:

  • Tokens de quadro: incorporações de patch do V-JEPA2 projetadas para predictor_embed_dim
  • Tokens de ação: incorporações de tokens de ação do Qwen projetadas para predictor_embed_dim

Ele usa atenção causal por bloco, de modo que cada passo temporal pode prestar atenção a todos os passos anteriores. A entrada do preditor embed_dim é igual a num_views × video_encoder_hidden_size (por exemplo, 2 views × 1024 = 2048 para os checkpoints pré-treinados).


Pontos de Verificação Pré-treinados

Três checkpoints estão disponíveis diretamente dentro da organização LeRobot aqui: lerobot/VLA-JEPA, convertidos de ginwind/VLA-JEPA:

CheckpointConjunto de dadosCâmerasModelo de mundoDimensão da ação
lerobot/VLA-JEPA-LIBEROLIBERO-102 (agentview + pulso)Ativado7
lerobot/VLA-JEPA-PretrainDROID 1.0.12 (visões externas à esquerda)Ativado7
lerobot/VLA-JEPA-SimplerEnvOXE Bridge / RT-11 (visualização duplicada ×2)Ativado7

Todos os checkpoints usam Qwen/Qwen3-VL-2B-Instruct como a base de linguagem.


Configuração

Principais parâmetros em VLAJEPAConfig:

ParâmetroPadrãoDescrição
chunk_size7Número de ações previstas por chamada de inferência
n_action_steps7Etapas executadas a partir do bloco previsto antes do replanejamento
num_video_frames8Comprimento do clipe de vídeo enviado ao modelo de mundo
enable_world_modelTrueSe deve carregar e treinar o preditor V-JEPA2
world_model_loss_weight0.1Peso da perda de previsão do JEPA em relação à perda de ação
causal_world_model_contextFalseCodifique o contexto do modelo de mundo de forma causal (uma única passagem do V-JEPA2 apenas com prefixo por posição de contexto) para que a atenção bidirecional não vaze quadros futuros para a entrada do preditor. Isso custa t_enc_ctx chamadas extras ao codificador
num_inference_timesteps4Etapas de integração de Euler para a remoção de ruído da ação
freeze_qwenFalseCongele o backbone do Qwen3-VL e treine apenas o action head
reinit_modulesNonePrefixos de chaves permitidos para serem re-inicializados aleatoriamente no carregamento (para transferência entre diferentes embodiments, veja Fine-tuning em um embodiment diferente)
resize_images_toNone(height, width) é o tamanho para o qual cada quadro da câmera é redimensionado antes de ser enviado à torre de visão do Qwen3-VL. None mantém a resolução nativa, e a contagem de patches do Qwen3-VL aumenta com ela, de modo que uma câmera de 720x1280 pode esgotar a memória da GPU. Os checkpoints publicados usam [224, 224]
gripper_dim6Índice da dimensão do garra no vetor de ação. Ignorado quando gripper_joint_names corresponde a um nome de ação do conjunto de dados
gripper_joint_names["gripper"]Nomes das dimensões de ação que identificam a garra; o índice correspondente tem prioridade sobre gripper_dim
gripper_threshold0.5Limiar usado por pre_snap_gripper_action e binarize_gripper_action. Observe que binarize é executado após a desnormalização, portanto, este valor é comparado ao valor físico da garra
pre_snap_gripper_actionFalseAjuste a dimensão do garfo para {0, 1} antes da desnornormalização. Específico do LIBERO, veja abaixo
binarize_gripper_actionFalseBinarize o dim do gripper para {-1, 1} após a desnormalização. Específico do LIBERO, veja abaixo
clip_normalized_actionsTrueClip as ações normalizadas para [-1, 1] antes de desnormalizá-las. Aplicado apenas quando ACTION usa MIN_MAX; ignorado (com um aviso) sob MEAN_STD, onde truncaria em 1 sigma
world_model_num_viewsNoneVisão da câmera para a qual o preditor do modelo de mundo é construído. Incorporada às formas do checkpoint. None usa jepa_tubelet_size como padrão, que é o que os checkpoints publicados codificam

pre_snap_gripper_action e binarize_gripper_action são uma port do loop de avaliação LIBERO do starVLA e estão corretos apenas para a convenção de ação do LIBERO. pre_snap escreve {0, 1} no espaço normalizado, o desnormalizador mapeia esses valores para o ponto médio e o máximo, e binarize então compara esse valor físico com gripper_threshold (0,5). Para um gripper medido em graus, mm ou [0, 100], ambos os valores ficam acima do limiar e o gripper comandado se torna constante. Por esse motivo, eles têm valor padrão False; habilite-os apenas para configurações no estilo LIBERO e defina gripper_threshold nas próprias unidades do gripper, se for o caso. A fábrica de processadores emite um aviso quando as estatísticas do conjunto de dados mostram que a faixa não pode funcionar.


Treinamento

O número de etapas de treinamento pode variar com base no tamanho do conjunto de dados e no orçamento de computação. O artigo original pré-treinou por 50k em ssv2 + droid conjuntamente, seguido de 30k etapas adicionais para LIBERO, mas menos etapas ainda podem resultar em bom desempenho ao fazer fine-tuning a partir dos checkpoints pré-treinados fornecidos.

Treinamento completo do zero

lerobot-train \
  --policy.type=vla_jepa \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset

Ajuste fino a partir de um checkpoint pré-treinado

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset

Se você deseja congelar o backbone do Qwen e treinar apenas a cabeça de ação, defina policy.freeze_qwen=True:

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --dataset.repo_id=your_org/your_dataset

Fine-tuning em uma encarnação diferente

Quando o robô de destino possui uma dimensionalidade de ação ou estado diferente da do checkpoint pré-treinado, as camadas de projeção de entrada/saída da cabeça de ação terão formatos incompatíveis e não poderão ser carregadas diretamente. reinit_modules permite listar os prefixos de chaves que são permitidos para apresentar incompatibilidade — essas camadas são re-inicializadas aleatoriamente, enquanto todos os outros pesos são reutilizados do checkpoint. Qualquer incompatibilidade de formato fora dos prefixos listados gera um erro.

As camadas que dependem de action_dim e state_dim são:

CamadaPrefixo de chave
Codificador de ação (action_dim → inner_dim)model.action_model.action_encoder
Decodificador de ação (hidden_size → action_dim)model.action_model.action_decoder
Codificador de estado (state_dim → inner_dim)model.action_model.state_encoder
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --policy.reinit_modules='["model.action_model.action_encoder", "model.action_model.action_decoder", "model.action_model.state_encoder"]' \
  --dataset.repo_id=your_org/your_dataset

Se o seu robô não possui estado proprioceptivo, omita model.action_model.state_encoder da lista.

Reproduzindo os resultados do LIBERO

Treinamento no LIBERO: inicia o treinamento a partir do checkpoint de Pretrain e treina por 30k passos no conjunto de dados LIBERO. O artigo original menciona treinamento em 8 GPUs com um batch size de 32, o que significa um batch size global de 256.

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=HuggingFaceVLA/libero \
  --steps=30000

Avaliando o checkpoint pré-treinado LIBERO-10:

lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.n_episodes=10 \
  --eval.batch_size=5

Para avaliar apenas um subconjunto de tarefas:

lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_10 \
  --env.task_ids='[0,1,2]' \
  --eval.n_episodes=10 \
  --eval.batch_size=5

Resultados esperados:

SuiteEpisódiosSucessosTaxa de Sucesso
libero_spatial1009395.0%
libero_object100100100.0%
libero_goal1009898.0%
libero_101009693.0%
Geral40038796.5%

Fine-tuning em conjuntos de dados com um número diferente de câmeras

O preditor do modelo de mundo pré-treinado foi treinado com embed_dim = world_model_num_views × 1024, ou seja, duas vistas de câmera.

Essa contagem de visualizações era lida de jepa_tubelet_size, que também nomeia o tamanho do tubelet temporal do codificador JEPA. world_model_num_views é o campo para isso agora; deixá-lo em None faz com que ele volte para jepa_tubelet_size, de modo que os checkpoints publicados continuem sendo carregados sem alterações.

Comportamento padrão — visualização de preenchimento/trimming (nenhuma ação necessária)

Ao fazer o ajuste fino a partir de VLA-JEPA-Pretrain, o modelo ajusta automaticamente o número de visualizações fornecidas ao modelo de mundo para corresponder a world_model_num_views:

  • Conjuntos de dados de visão única (por exemplo, BridgeV2): o latente de visão única é duplicado para produzir uma entrada de modelo de mundo de duas visões, preservando o sinal autorregressivo do JEPA sem qualquer incompatibilidade de pesos.
  • >Conjuntos de dados com mais de 2 vistas (por exemplo, DROID com 3 vistas): todas as vistas são passadas para o backbone Qwen (para um contexto mais rico), mas apenas as primeiras world_model_num_views vistas (um pulso + uma terceira pessoa, seguindo a ordem de vista configurada) são usadas para o modelo de mundo.

Opção 1 — Desativar o modelo de mundo

Defina enable_world_model=False para ignorar completamente a perda JEPA. Somente o backbone Qwen e a cabeça de ação são carregados e treinados. Isso é suficiente para um bom desempenho de ação.

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.enable_world_model=false \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/single_camera_dataset

Opção 2 — Reinitializar a projeção de entrada do predictor

Se você quiser alterar world_model_num_views para um valor diferente de 2, carregue o checkpoint com strict=False e reinitialize model.video_predictor.predictor_embed para o novo embed_dim. Todos os outros pesos dos blocos do preditor (atenção, MLP, norm, projeção de saída) são independentes do número de câmeras e podem ser reutilizados a partir do checkpoint pré-treinado.


Citação

@misc{sun2026vlajepaenhancingvisionlanguageactionmodel,
  title         = {VLA-JEPA: Enhancing Vision-Language-Action Model with Latent World Model},
  author        = {Jingwen Sun and Wenyao Zhang and Zekun Qi and Shaojie Ren and Zezhi Liu and Hanxin Zhu and Guangzhong Sun and Xin Jin and Zhibo Chen},
  year          = {2026},
  eprint        = {2602.10098},
  archivePrefix = {arXiv},
  primaryClass  = {cs.RO},
  url           = {https://arxiv.org/abs/2602.10098},
}

Licença

Os pesos são distribuídos sob os termos de licença do repositório original ginwind/VLA-JEPA (Apache 2.0 License). O código de integração do LeRobot segue a Apache 2.0 License.

Update on GitHub