LeRobot 中的 VLA-JEPA:融合 Qwen3-VL 语言骨干与 V-JEPA2 潜世界模型的视觉-语言-动作策略实战指南

LeRobot 中的 VLA-JEPA:融合 Qwen3-VL 语言骨干与 V-JEPA2 潜世界模型的视觉-语言-动作策略实战指南 LeRobot 中的 VLA-JEPA融合 Qwen3-VL 语言骨干与 V-JEPA2 潜世界模型的视觉-语言-动作策略实战指南【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobotVLA-JEPA 是 LeRobot 官方移植的一类视觉-语言-动作VLA策略它将 Qwen3-VL 语言骨干、基于流匹配flow matching的 DiT 动作头以及自监督视频世界模型 V-JEPA2 组合进一个统一框架推理时只用语言骨干 动作头训练时额外利用世界模型提供的自监督视频预测损失。本文以 policy_vla_jepa_README.md 为核心骨架结合仓库内 vla_jepa 源码与docs/source/vla_jepa.mdx完整讲解其架构原理、全部配置参数、训练/微调/评估命令以及跨具身与跨相机数的迁移技巧帮助你在自己的数据集和机器人上落地这套方案。一、架构总览三大模块如何协作VLA-JEPA 的核心思想是用一个潜世界模型latent world model来增强 VLA 策略在标准的视觉 语言 → 动作范式之外额外让模型学会预测未来视频帧的潜表示从而在不依赖真值未来观测的前提下注入时间动态先验。模型由三个组件构成对应关系如下组件模块类职责Qwen3-VL 骨干Qwen3VLInterface融合多视角图像 语言指令产出上下文 tokenDiT 动作头VLAJEPAActionHead对动作 chunk 做流匹配扩散去噪V-JEPA2 世界模型ActionConditionedVideoPredictor自监督视频预测损失仅训练阶段使用推理时只使用 Qwen 骨干和动作头世界模型完全不需要加载——这是 VLA-JEPA 部署成本的关键世界模型的存在不影响线上推理延迟与显存占用。训练阶段数据流完整的前向数据流训练如下一段长度为num_video_frames帧的视频片段由 V-JEPA2 编码器编码为逐帧 patch tokenQwen3-VL 骨干处理多视角图像与任务指令产出包含特殊动作 token用于世界模型条件与具身动作 tokenembodied tokens用于动作头条件的上下文 token 序列动作头以这些上下文 token 作为 cross-attention 的 key/value通过流匹配预测去噪后的动作 chunk世界模型预测器从 Qwen 输出中抽取动作 token预测未来的 V-JEPA2 帧嵌入该预测的回归损失叠加到动作损失上。对应的前向实现在 modeling_vla_jepa.py 的VLAJEPAModel.forward中_encode_qwen抽取embodied_action_tokens与action_tokens_world_model_loss计算 JEPA 视频预测损失_action_loss计算流匹配动作损失最终返回{action_loss: ..., wm_loss: wm_loss * world_model_loss_weight}。推理阶段数据流推理时predict_action只做两件事Qwen 编码得到 embodied tokens然后交给动作头做 Euler 积分去噪。源码见 modeling_vla_jepa.py。二、动作头细节DiT-B 与 DiT-L 预设动作头通过action_model_type选择预设每个预设只决定注意力几何形状头数与每个头的维度预设注意力头数头维度DiT-B1264DiT-L3248预设项可被action_num_heads/action_attention_head_dim覆盖。由这两个量派生出的两个宽度是相互独立的DiT 的内部宽度 头数 × 头维度DiT-B为 12 × 64 768是派生值而非直接配置项DiT 的输出宽度以及动作解码器、状态编码器 MLP 的宽度均为action_hidden_size默认 1024。也就是说DiT-B实际运行的是一个 768 宽的 transformer最后投影到 1024 维二者互不影响。该预设映射与内部宽度计算见 action_head.py 中的DIT_PRESETS字典和VLAJEPAActionHead.__init__。流匹配训练与采样机制动作头采用流匹配flow matching扩散范式训练与推理的关键机制包括噪声调度训练时sample_time从 Beta 分布Beta(action_noise_beta_alpha, action_noise_beta_beta)默认(1.5, 1.0)采样扩散时刻再映射到[0, action_noise_s]s0.999区间见 action_head.py速度回归对加噪动作(1-t)·noise t·actions回归速度场velocity actions - noise用 MSE 损失并对action_is_pad掩码加权见forwardaction_head.py推理 Euler 积分从纯高斯噪声出发用num_inference_timesteps默认 4步完成actions dt * pred_velocity的去噪见predict_actionaction_head.py重复扩散repeated_diffusion_steps8CogACT 风格表示每个 batch 样本独立抽 8 次噪声求损失提升样本加权的稳定性对应_action_loss中actions_target的repeat(r, 1, 1)处理token 序列结构DiT 自己的 token 序列由[state_encoder 输出?, future_tokens 可学习查询, 加噪动作 token]拼接而成Qwen 的上下文 token 只通过 cross-attention 进入每偶数层跨注意力接 Qwen 隐状态奇数层自注意力见 action_head.py。三、世界模型细节ActionConditionedVideoPredictor视频预测器是一个 ViT 风格的 transformerActionConditionedVideoPredictor输入有两路帧 tokenV-JEPA2 patch 嵌入经predictor_embed投影到predictor_embed_dim动作 tokenQwen 动作 token 嵌入经action_encoder投影到predictor_embed_dim。其注意力采用**块因果block-causal**设计每个时间步可关注所有之前的时间步。预测器的输入维度embed_dim等于num_views × video_encoder_hidden_size预训练 checkpoint 为 2 视角 × 1024 2048。块因果掩码由build_action_block_causal_attention_mask生成位置编码使用 AC RoPE将维度拆成时间/高/宽三份分别做旋转位置编码实现见 world_model.py 与ACRoPEAttentionworld_model.py。训练时世界模型采用shift-by-one 的 JEPA 划分input_states取时间位置 0..T-2gt_states取位置 1..T-1预测器基于输入状态与动作 token 预测未来状态与真值做 L1 回归损失F.l1_loss见 modeling_vla_jepa.py。关于因果上下文编码causal_world_model_context默认False时整个视频片段只做一次 V-JEPA2 前向然后从共享嵌入中切片出输入状态。但 V-JEPA2 的双向注意力会把未来帧信息泄漏进每个位置的嵌入包括用作预测器输入的上下文位置。若设置causal_world_model_contextTrue则对每个上下文位置单独做一次前缀受限的编码每个位置只看它自己的原始帧前缀杜绝泄漏代价是编码器调用次数从 1 次增加到t_enc_ctx次。对应实现为_causal_video_embeddingsmodeling_vla_jepa.py。这是一个典型的训练质量 vs 计算开销的权衡开关。四、预训练 CheckpointLeRobot 官方在lerobot/VLA-JEPA集合下直接提供了三个从 ginwind/VLA-JEPA 转换来的 checkpointCheckpoint数据集相机配置世界模型动作维度lerobot/VLA-JEPA-LIBEROLIBERO-102agentview wrist启用7lerobot/VLA-JEPA-PretrainDROID 1.0.12外部左侧视角启用7lerobot/VLA-JEPA-SimplerEnvOXE Bridge / RT-11视角复制 ×2启用7所有 checkpoint 的语言骨干均为Qwen/Qwen3-VL-2B-Instruct对应配置项qwen_model_name默认值。JEPA 编码器默认使用facebook/vjepa2-vitl-fpc64-256。五、核心配置参数全解析VLAJEPAConfig定义见 configuration_vla_jepa.py通过PreTrainedConfig.register_subclass(vla_jepa)注册因此policy.typevla_jepa即可被 LeRobot 工厂识别。关键参数如下动作规划相关参数默认值说明chunk_size7每次推理调用预测的动作数动作 chunk 长度n_action_steps7从预测 chunk 中执行多少步后再重新规划__post_init__强制要求n_action_steps chunk_sizenum_inference_timesteps4动作去噪的 Euler 积分步数repeated_diffusion_steps8每个 batch 样本的独立噪声抽取次数CogACT 风格世界模型相关参数默认值说明num_video_frames8喂给世界模型的视频片段长度每个样本加载的帧数enable_world_modelTrue是否加载并训练 V-JEPA2 预测器world_model_loss_weight0.1JEPA 预测损失相对动作损失的权重causal_world_model_contextFalse是否对世界模型上下文做因果编码防未来帧泄漏代价是额外编码器调用jepa_tubelet_size2JEPA 编码器的时间 tubelet 尺寸世界模型启用时以编码器自身config.tubelet_size为准该值仅用于num_video_frames的 sanity checkworld_model_num_viewsNone世界模型预测器所针对的相机视角数烘焙进 checkpoint 形状None时回退到jepa_tubelet_size这正是已发布 checkpoint 的编码方式predictor_depth/predictor_num_heads/predictor_mlp_ratio/predictor_dropout12 / 8 / 4.0 / 0.0视频预测器ActionConditionedVideoPredictor的架构超参num_action_tokens_per_timestep8每个时间步对应的 Qwen 动作 token 数注意__post_init__的约束校验configuration_vla_jepa.pyfreeze_qwenTrue时会自动强制enable_world_modelFalse冻结 Qwen 后没有梯度流进世界模型训练它没有意义num_video_frames必须 ≥2 × jepa_tubelet_size保证至少各有一个上下文与真值时间位置。Qwen 骨干与 tokenizer 相关参数默认值说明qwen_model_nameQwen/Qwen3-VL-2B-Instruct语言骨干模型jepa_encoder_namefacebook/vjepa2-vitl-fpc64-256V-JEPA2 视频编码器freeze_qwenFalse冻结 Qwen 骨干、只训练动作头resize_images_toNone送入 Qwen3-VL 视觉塔前将所有相机帧缩放到(height, width)None保持原始分辨率此时 Qwen3-VL 的 patch 数随分辨率增长720×1280 的相机可能耗尽显存。已发布 checkpoint 使用[224, 224]prompt_templateYour task is {instruction}. Infer the temporal dynamics from frames {actions} and produce the corresponding policy actions {e_actions}.拼装进 Qwen 消息的提示模板special_action_token|action_{}|世界模型条件用动作 token 模板embodied_action_token|embodied_action|动作头条件用具身 tokentokenizer_padding_sidelefttokenizer padding 方向torch_dtypebfloat16模型权重与计算精度关于 tokenizer 扩展Qwen3VLInterface.expand_tokenizer会按chunk_size × 4的数量添加|action_i|特殊 token 以及|embodied_action|。Qwen3-VL-2B 自带 267 行空闲嵌入因此在chunk_size ≤ 66时无需 resize超过该值会触发resize_token_embeddings导致embed_tokens/lm_head形状改变——此时从不同 chunk_size 的 checkpoint 加载必须把对应前缀加入reinit_modules见 qwen_interface.py。归一化与夹爪后处理相关参数默认值说明gripper_dim6夹爪维度在动作向量中的索引当gripper_joint_names匹配到数据集动作名时该字段被忽略gripper_joint_names[gripper]标识夹爪的动作维度名匹配到的索引优先于gripper_dimgripper_threshold0.5pre_snap_gripper_action与binarize_gripper_action使用的阈值。注意binarize在反归一化之后执行因此该阈值与夹爪的物理量纲比较pre_snap_gripper_actionFalse在反归一化之前把夹爪维度吸附到 {0, 1}LIBERO 专用binarize_gripper_actionFalse在反归一化之后把夹爪维度二值化到 {-1, 1}LIBERO 专用clip_normalized_actionsTrue反归一化前把归一化动作裁剪到 [-1, 1]仅在ACTION使用MIN_MAX时生效MEAN_STD下会忽略并给出警告否则会把超出 1 sigma 的动作全部截断夹爪后处理的警告pre_snap_gripper_action和binarize_gripper_action移植自 starVLA 的 LIBERO 评估循环只对 LIBERO 的动作约定是正确的。pre_snap把 {0, 1} 写进归一化空间反归一化器将其映射为中点和最大值然后binarize把这个物理值与gripper_threshold0.5比较。对于以角度、毫米或 [0, 100] 为量纲的夹爪两个值都会落在阈值之上导致输出的夹爪指令恒为常量。因此它们默认是False仅建议在 LIBERO 风格场景开启若开启请把gripper_threshold设为夹爪自身量纲下的合理值。处理器工厂会在数据集统计显示该范围不可用时发出警告。对应的四个处理器步骤vla_jepa_image_prep、vla_jepa_clip_actions、vla_jepa_pre_snap_gripper、vla_jepa_binarize_gripper注册于 processor_vla_jepa.py其中make_vla_jepa_pre_post_processors还会通过_warn_if_gripper_steps_are_misconfigured根据数据集统计自动检测夹爪输出将恒为常量的配置错误。相对动作与跨具身相关参数默认值说明use_relative_actionsFalse预处理时把绝对动作转为相对动作action - state后处理再还原需要state_dimrelative_exclude_joints[gripper]保持绝对值不转相对的关节名空列表 所有维度都转相对action_feature_namesNone运行时由make_policy从数据集元数据填充用于构建排除掩码与解析夹爪索引reinit_modulesNone允许在加载时被随机重新初始化的 key 前缀用于跨具身迁移见下一节action_dim/state_dim7 / 8动作/状态维度运行时由set_dataset_feature_metadata根据数据集真实 shape 覆盖resolved_gripper_dim属性configuration_vla_jepa.py优先从action_feature_names中按gripper_joint_names匹配索引数据集元数据不可用时回退到原始gripper_dimvalidate_features还会在开启夹爪步骤时检查索引越界并抛出明确错误。优化器与调度器参数默认值说明optimizer_lr/optimizer_betas/optimizer_eps/optimizer_weight_decay/optimizer_grad_clip_norm1e-4 / (0.9, 0.95) / 1e-8 / 1e-10 / 10.0AdamW 超参scheduler_warmup_steps/scheduler_decay_steps/scheduler_decay_lr1000 / 30000 / 2.5e-6余弦退火调度器这些默认值通过get_optimizer_preset/get_scheduler_preset注入 LeRobot 优化器工厂见 configuration_vla_jepa.py。视频帧采样行为observation_delta_indices属性configuration_vla_jepa.py决定训练时从数据集中读取哪些时间步的观测世界模型关闭时只取第 0 帧避免解码后丢弃世界模型开启且num_video_frames chunk_size时取完整窗口chunk 更长时则把帧按跨步(chunk_size-1)//(num_video_frames-1)铺满整个 horizon让世界模型看到覆盖整个 chunk 的动态。六、训练与微调训练步数取决于数据集规模与算力预算。原论文先在 ssv2 droid 联合预训练 50k 步再在 LIBERO 上额外训练 30k 步但从提供的预训练 checkpoint 微调时更少的步数通常也能获得不错的效果。从零全量训练lerobot-train \ policy.typevla_jepa \ policy.repo_idyour_org/your_repo \ dataset.repo_idyour_org/your_dataset从预训练 checkpoint 微调lerobot-train \ --policy.pathlerobot/VLA-JEPA-Pretrain \ --policy.repo_idyour_org/your_repo \ --dataset.repo_idyour_org/your_dataset如果只想冻结 Qwen 骨干、只训练动作头加上policy.freeze_qwentruelerobot-train \ --policy.pathlerobot/VLA-JEPA-Pretrain \ --policy.repo_idyour_org/your_repo \ --policy.freeze_qwentrue \ --dataset.repo_idyour_org/your_dataset冻结 Qwen 时源码会记录一条警告configuration_vla_jepa.py动作头条件读取的是最后一层 decoder 上若干固定位置的 learned readout冻结骨干意味着这些读取位置无法适配新具身域偏移下条件质量可能下降。跨具身微调reinit_modules当目标机器人的动作/状态维度与预训练 checkpoint 不一致时动作头的输入/输出投影层形状不匹配、无法直接加载。reinit_modules允许你列出允许形状不匹配的 key 前缀——这些层会被随机重新初始化其余权重全部复用 checkpoint前缀之外的任何形状不匹配都会抛错。依赖action_dim与state_dim的层及对应 key 前缀为层Key 前缀动作编码器action_dim → inner_dimmodel.action_model.action_encoder动作解码器hidden_size → action_dimmodel.action_model.action_decoder状态编码器state_dim → inner_dimmodel.action_model.state_encoderlerobot-train \ --policy.pathlerobot/VLA-JEPA-Pretrain \ --policy.repo_idyour_org/your_repo \ --policy.freeze_qwentrue \ --policy.reinit_modules[model.action_model.action_encoder, model.action_model.action_decoder, model.action_model.state_encoder] \ --dataset.repo_idyour_org/your_dataset如果你的机器人没有本体感知状态从列表中省略model.action_model.state_encoder即可state_encoder在state_dim 0时才构建见 action_head.py。该加载逻辑在VLAJEPAPolicy._load_as_safetensor中实现modeling_vla_jepa.py先以resolve_safetensors_device映射的地址加载 safetensors避免所有 rank 都在 GPU 0 上物化完整权重对每个形状不匹配的 key 检查其前缀是否在reinit_modules内跳过这些张量后以非严格模式加载并输出被跳过张量的日志。七、复现 LIBERO 结果LIBERO 训练从 Pretrain checkpoint 开始在 LIBERO 数据集上训练 30k 步。原论文使用 8 张 GPU、每卡 batch size 32即全局 batch size 256lerobot-train \ --policy.pathlerobot/VLA-JEPA-Pretrain \ --policy.repo_idyour_org/your_repo \ --dataset.repo_idHuggingFaceVLA/libero \ --steps30000评估预训练 LIBERO-10 checkpointlerobot-eval \ --policy.pathlerobot/VLA-JEPA-LIBERO \ --env.typelibero \ --env.tasklibero_spatial,libero_object,libero_goal,libero_10 \ --eval.n_episodes10 \ --eval.batch_size5只评估部分任务lerobot-eval \ --policy.pathlerobot/VLA-JEPA-LIBERO \ --env.typelibero \ --env.tasklibero_10 \ --env.task_ids[0,1,2] \ --eval.n_episodes10 \ --eval.batch_size5预期结果套件Episodes成功数成功率libero_spatial1009395.0%libero_object100100100.0%libero_goal1009898.0%libero_101009693.0%总体40038796.5%八、不同相机数量的数据集微调预训练世界模型预测器的embed_dim world_model_num_views × 1024即按两个相机视角训练。说明该视角数此前是从jepa_tubelet_size读取的该字段同时也表示 JEPA 编码器的时间 tubelet 尺寸。现在world_model_num_views是它的正式字段保持None会回退到jepa_tubelet_size因此已发布 checkpoint 无需任何改动即可继续加载。这一回退逻辑体现在num_world_model_views属性中configuration_vla_jepa.py。默认行为——视角填充/裁剪无需额外操作从VLA-JEPA-Pretrain微调时模型会自动把送入世界模型的视角数对齐到world_model_num_views单视角数据集如 BridgeV2单视角潜表示被复制一份构成两视角的世界模型输入在没有任何权重形状不匹配的情况下保留 JEPA 自监督信号超过 2 视角的数据集如 3 视角 DROID所有视角都传给 Qwen 骨干获得更丰富的上下文但只有前world_model_num_views个视角按配置的视角顺序取一个 wrist 一个第三人称用于世界模型。对应的运行时实现是_world_model_loss中的 pad/trim 逻辑modeling_vla_jepa.py。方案一关闭世界模型设置enable_world_modelFalse完全跳过 JEPA 损失只加载和训练 Qwen 骨干 动作头。这通常足以获得良好的动作性能lerobot-train \ --policy.pathlerobot/VLA-JEPA-Pretrain \ --policy.enable_world_modelfalse \ --policy.repo_idyour_org/your_repo \ --dataset.repo_idyour_org/single_camera_dataset关闭世界模型还有一个隐性收益observation_delta_indices退化为[0]训练时不再需要解码每相机每样本num_video_frames帧视频数据加载开销显著下降。方案二重新初始化预测器输入投影如果想将world_model_num_views改为非 2 的值需要以strictFalse加载 checkpoint并为新的embed_dim重新初始化model.video_predictor.predictor_embed。预测器的其余 block 权重attention、MLP、norm、输出投影与相机数量无关可以完整复用预训练权重。九、LeRobot 适配层从 batch 格式到原生格式的转换除了原生模型外仓库还提供VLAJEPAPolicymodeling_vla_jepa.py作为 LeRobot 适配层负责LeRobot → 原生把标准 dict batchobservation.images.*、observation.state、action、task转成原生模型需要的按样本分组的多视角图像列表 指令 批量视频/动作/状态张量全程保持在设备上_prepare_model_inputs推理接口predict_action_chunk返回完整 chunkselect_action通过n_action_steps长度的 deque 队列缓存 chunk 内动作、按步弹出执行训练前向forward把原生模型的action_loss与wm_loss汇总为总损失并记录日志前置图像处理ImagePrepProcessorStep在序列化的处理器管线中完成 float 转换、单通道扩为 3 通道、按resize_images_to缩放与模型内部的幂等守卫保持字节级一致不 clamp、modearea确保新老 checkpoint 行为一致相对动作RelativeActionsProcessorStep与AbsoluteActionsProcessorStep共享同一实例原始状态在预处理时缓存、后处理时还原夹爪维度默认保持绝对relative_exclude_joints反归一化VLA-JEPA 与默认策略不同它同时对输入和输出特征做反归一化UnnormalizerProcessorStep(featuresfeatures, ...)。十、引用与许可原论文引用格式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}, }权重按原始 ginwind/VLA-JEPA 仓库的许可条款分发Apache 2.0 LicenseLeRobot 集成代码同样遵循Apache 2.0 License。延伸阅读本文对应的原始文档policy_vla_jepa_README.md 与 vla_jepa.mdx配置定义与校验逻辑configuration_vla_jepa.py原生模型与 LeRobot 适配层modeling_vla_jepa.py流匹配动作头实现action_head.py世界模型预测器实现world_model.py预处理/后处理管线processor_vla_jepa.pyQwen 接口与 tokenizer 扩展qwen_interface.py【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考