尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LeRobot 中的 EVO1 视觉-语言-动作策略:InternVL3 骨干与 Flow Matching 动作头的集成与分阶段训练指南

LeRobot 中的 EVO1 视觉-语言-动作策略:InternVL3 骨干与 Flow Matching 动作头的集成与分阶段训练指南 LeRobot 中的 EVO1 视觉-语言-动作策略InternVL3 骨干与 Flow Matching 动作头的集成与分阶段训练指南【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobotEVO1 是一个面向机器人控制的视觉-语言-动作Vision-Language-ActionVLA策略。在 LeRobot 中EVO1 以标准的policy.typeevo1策略类型接入采用 InternVL3 视觉-语言骨干与连续型 flow-matching 动作头并支持通过 LeRobot 标准的策略 API 进行分阶段staged训练、评测与部署。本文以 EVO1 策略说明 为核心结合 完整集成文档 与 策略源码 深入拆解其架构、配置参数、两阶段训练流程与 LIBERO 评估方法帮助读者从零上手训练并部署自己的 EVO1 策略。一、EVO1 是什么InternVL3 骨干 Flow Matching 动作头的 VLA 策略EVO1 是一个用于机器人控制的视觉-语言-动作策略它接收一个或多个相机图像与自然语言任务指令输出未来的动作序列。其上游项目由 MINT-SJTU 团队维护LeRobot 集成在标准策略 API 之上实现了完整的训练、推理与评测链路。从源码结构看LeRobot 侧的 EVO1 实现由四部分组成见 src/lerobot/policies/evo1/模块文件职责configuration_evo1.pyEvo1Config配置类定义全部可调超参数与训练阶段默认值internvl3_embedder.pyInternVL3 视觉-语言编码器负责图像/文本融合嵌入flow_matching.pyFlow-matching 动作头负责训练与采样生成动作块modeling_evo1.pyEvo1Policy策略封装整合编码器与动作头对外暴露训练/推理接口processor_evo1.py处理器链负责 state/action 的 padding、归一化、裁剪与 gripper 二值化整体数据流为相机图像 语言指令 → InternVL3 融合嵌入 → state/action 向量 padding 到固定最大维度 → flow-matching 动作头预测动作块 → 输出n_action_steps步动作。推理时策略一次性采样一个动作块再从该块中依次返回n_action_steps步动作用尽后才重新采样。LeRobot 集成覆盖的能力包括标准policy.typeevo1配置入口在 src/lerobot/policies/factory.py 中注册get_policy_class(evo1)返回Evo1PolicyInternVL3 图像/文本嵌入可选 FlashAttention 及回退基于阶段的微调控制仅训练动作头 / 微调 VLM连续型 flow-matching 动作预测通过 LeRobot 策略 API 的 checkpoint 保存/加载使用lerobot-train训练使用标准策略推理 API 评测。二、架构拆解四个核心组件如何协作2.1 InternVL3 编码器原生 transformers 实现无 trust_remote_codeinternvl3_embedder.py 中的InternVL3Embedder直接使用 Hugging Facetransformers的原生 InternVL 实现加载模型AutoModel.from_pretrained因此policy.vlm_model_name必须指向原生转换的 checkpoint例如OpenGVLab/InternVL3-1B-hf注意-hf后缀。关键实现细节图像预处理完全在设备上进行_batched_resize_01将[0,1]浮点图像量化为 uint8 后使用双三次插值BICUBIC antialias缩放到image_resolution再以 ImageNet 均值和标准差归一化逐像素对齐上游 EVO1 的 PIL 参考预处理保证与上游 checkpoint 可互换多视图 placeholder 构建_build_multimodal_prompts按Image-1: imgIMG_CONTEXT.../img\n的格式为每个相机视图生成 token再拼接语言指令缺视图零填充与注意力掩码当实际相机数少于max_views时缺失视图以零图填充并通过_mask_absent_image_tokens全向量化地屏蔽这些视图的 context token 注意力全程无 host↔device 同步层截断加载后可按vlm_num_layers截断language_model.layers只保留前 N 层以节省显存prompt 截断保护max_text_length限制提示词长度若截断切到了图像 placeholder token 会直接抛错并提示调大max_text_length或减少max_views。此外编码器会校验image_resolution必须与 InternVL3 checkpoint 的原生图像尺寸一致如 448×448因为image_seq_length基于原生分辨率计算其他尺寸会导致 placeholder token 与视觉特征数量失配。2.2 Flow Matching 动作头连续扩散式动作生成flow_matching.py 实现了FlowmatchingActionHead核心包括训练forward从 Beta(2,2) 分布采样时间步tclamp 到 0.02~0.98以x_t (1-t)*noise t*actions_gt构造插值路径用MultiEmbodimentActionEncoder将中间动作序列编码为 token经多层BasicTransformerBlock交叉注意力于 VL 上下文 时间嵌入后由CategorySpecificMLP回归速度场pred_velocity损失即速度场的 MSE推理get_action从均匀噪声[-1,1]出发按num_inference_timesteps步欧拉积分x x dt * v逐步去噪得到动作块多体感multi-embodiment支持CategorySpecificLinear/CategorySpecificMLP支持按embodiment_id选择独立的全连接权重num_categories1时每个类别独立做 xavier 初始化动作掩码action_mask标记有效的动作维度padding 维度在训练与推理中均被乘零不参与损失也不被采样。2.3 策略封装两阶段微调开关与自管理混合精度modeling_evo1.py 中的Evo1Policy继承了PreTrainedPolicy职责包括特征校验与 padding_prepare_state/_prepare_actions将 state/action 填充到max_state_dim/max_action_dim并生成对应的布尔掩码action_is_pad会剔除回合结束后的伪动作避免污染损失分阶段微调set_finetune_flags先冻结整个 embedder再按finetune_language_model/finetune_vision_model分别解冻language_model、vision_tower与multi_modal_projector依赖原生 HF InternVL 子模块布局梯度管理当 VLM 完全冻结时如 stage1_compute_fused_tokens在torch.no_grad()下计算并 detach 融合 token且 embedder 始终保持 eval 模式显著降低显存与耗时自管理 AMPuse_ampTrue且运行在 CUDA 上时策略在自身 forward 外包一层 bfloat16 autocast使数值结果不受外部如lerobot-eval默认 fp16autocast 上下文影响保证训练与推理数值一致动作队列select_action内部维护一个deque(maxlenn_action_steps)每次预测一个 chunk 后逐条弹出单步动作用尽再预测tests/policies/evo1/test_evo1.py 中的test_evo1_select_action_queue_orders_steps_and_repredicts验证了队列顺序与重预测行为。2.4 处理器链padding → 归一化 → 裁剪 → 二值化processor_evo1.py 定义了 EVO1 专属的处理器步骤Evo1PadStateProcessorStep观测进入归一化前先把 state 填充到max_state_dimEvo1PadActionProcessorStep训练动作填充到max_action_dim同时生成action_mask记录有效维度NormalizerProcessorStep按normalization_mapping默认 VISUALIDENTITYSTATE/ACTIONMIN_MAX归一化Evo1ActionProcessorStep推理后把动作裁剪回真实动作维度postprocess_action_dim或数据集特征维度并可选地将 gripper 通道二值化binarize_gripper这是为 LIBERO 风格评测准备的归一化统计量填充_pad_evo1_stats用中性统计值min/max 等填充 padding 维度保证填充维度归一化后为 0且 shape 与 padding 后的张量一致。reconcile_evo1_processors负责在加载 checkpoint 后重建这些步骤恢复 EVO1 专属的 batch converter避免丢失embodiment_id、state_mask等非观测字段、把原始未 padding 的数据集统计量重新 padding、并按当前 CLI 覆盖重建动作后处理步骤。对应回归测试见 test_evo1.py 中的test_reconcile_evo1_processors_repads_overridden_stats。三、安装与环境要求先按 安装指南 安装 LeRobot安装 EVO1 依赖pip install -e .[training,evo1]若要训练与评测 LIBERO再安装 LIBERO extrapip install -e .[training,evo1,libero]只有当flash-attn与你当前的 Python、PyTorch、CUDA 与 GPU 组合兼容时才安装它未安装时 EVO1 自动回退到 eager attentionuse_flash_attntrue时会打印告警日志。需要说明EVO1 使用原生 HFtransformers的 InternVL 实现policy.vlm_model_name必须指向原生转换 checkpoint如OpenGVLab/InternVL3-1B-hf首次运行会下载该 VLM checkpoint之后复用 HF 缓存。四、数据要求EVO1 期望一个标准的 LeRobot 数据集包含1 至policy.max_views默认 3个视觉观测例如observation.images.imageobservation.stateaction数据集task字段中的语言任务指令或通过policy.task_field指定的其他字段。state 与 action 向量会被填充到policy.max_state_dim默认 24与policy.max_action_dim默认 24预测结果再裁剪回数据集真实动作维度后返回。从Evo1Config.validate_features的实现看若配置的empty_cameras0还会自动注册observation.images.empty_camera_i占位特征允许部分相机缺失测试test_evo1_missing_configured_camera_needs_empty_cameras_budget验证了这一行为。五、配置与使用在 LeRobot 配置中指定策略类型policy.typeevo1默认情况下新初始化的 EVO1 策略从以下 VLM 初始化policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf当已有 LeRobot 格式的 EVO1 checkpoint 时改为加载policy.pathyour-org/your-evo1-checkpoint六、分阶段训练Staged TrainingEVO1 的默认训练策略分两个阶段由policy.training_stagestage1/stage2控制。Evo1Config.__post_init__会根据阶段自动解析四个微调开关的最终值源码见 configuration_evo1.py阶段finetune_vlmfinetune_language_modelfinetune_vision_modelfinetune_action_headstage1falsefalsefalsetruestage2truetruetruetruestage1冻结整个 VLM仅训练 action headstage2从 stage1 checkpoint 继续全量微调 VLM 与 action head但重新初始化优化器与调度器。6.1 Stage 1冻结 VLM训练动作头lerobot-train \ --dataset.repo_idyour_org/your_dataset \ --policy.typeevo1 \ --policy.training_stagestage1 \ --policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf \ --policy.devicecuda \ --policy.chunk_size50 \ --policy.n_action_steps50 \ --policy.max_state_dim24 \ --policy.max_action_dim24 \ --policy.optimizer_lr1e-5 \ --batch_size4 \ --steps5000 \ --output_dir./outputs/evo1_stage16.2 Stage 2加载 Stage 1微调 VLMlerobot-train \ --dataset.repo_idyour_org/your_dataset \ --policy.path./outputs/evo1_stage1/checkpoints/005000/pretrained_model \ --policy.training_stagestage2 \ --policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf \ --policy.devicecuda \ --policy.chunk_size50 \ --policy.n_action_steps50 \ --policy.max_state_dim24 \ --policy.max_action_dim24 \ --policy.optimizer_lr1e-5 \ --batch_size4 \ --steps80000 \ --output_dir./outputs/evo1_stage26.3 阶段默认值覆盖机制默认policy.apply_training_stage_defaultstrue即每次加载配置后都会重新套用当前训练阶段的微调默认值。这一点在从 stage1 checkpoint 启动 stage2时非常关键stage1 的 checkpoint 配置中保存的是 VLM 冻结标志均为 false若不清除stage2 会错误地继承这些冻结标志。阶段默认值优先于 checkpoint 中保存的或手动传入的policy.finetune_*标志只有当你需要手动精确控制每一个微调开关时才设置policy.apply_training_stage_defaultsfalse。对应测试test_evo1.py 的test_evo1_stage_defaults_and_consistency验证了从 stage1 checkpoint 继承的冻结标志在 stage2 下会被重置为全量微调手动设置不一致的开关组合如finetune_vlmtrue但两个分支均为 false会抛出 Inconsistent EVO1 finetune config 的ValueError。6.4 关键训练参数以下参数表完整继承自 集成文档默认值均可在 configuration_evo1.py 中核对参数默认值说明policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf原生转换的 InternVL3 checkpoint 或本地模型目录policy.training_stagestage1stage1仅训练动作头stage2微调 VLM 各分支policy.apply_training_stage_defaultstrue加载 checkpoint 后重新套用阶段微调默认值policy.vlm_num_layers14策略保留的 InternVL3 语言层数policy.vlm_dtypebfloat16请求的 VLM 计算 dtypepolicy.use_flash_attntrue请求 FlashAttention未安装时自动回退 eagerpolicy.enable_gradient_checkpointingtrue在支持的 InternVL3 模块上启用梯度检查点policy.gradient_checkpointing_use_reentrantfalse传给梯度检查点的 reentrant 设置policy.chunk_size50每个动作块预测的未来动作步数policy.n_action_steps50从采样块中消费的动作步数policy.max_state_dim24state 填充维度policy.max_action_dim24action 填充维度policy.postprocess_action_dimnull可选EVO1 后处理返回的动作维度policy.binarize_gripperfalse对后处理的 gripper 通道做二值化LIBERO 风格评测policy.task_fieldtask用作语言提示词的 batch 字段policy.image_resolution(448, 448)输入图像分辨率必须是正方形与 InternVL3 checkpoint 原生尺寸一致policy.num_inference_timesteps32推理时 flow-matching 的欧拉积分步数policy.optimizer_lr1e-5AdamW 学习率policy.optimizer_weight_decay1e-5权重衰减偏置与 norm 参数不衰减见get_optim_paramspolicy.scheduler_warmup_steps300余弦退火调度器的预热步数七、推理与评估7.1 快速 rollout对训练好的 EVO1 checkpoint 做 rollout可选 RTC 实时推理lerobot-rollout \ --policy.pathyour-org/your-evo1-checkpoint \ --inference.typertc \ ...7.2 LIBERO 评估作者格式 profile作者格式的 EVO1 LIBERO profile 使用原始 LIBERO 相机特征名observation.images.agentview_image与observation.images.robot0_eye_in_hand_image每 14 步动作重规划一次并在推进仿真前对 gripper 命令做二值化。EVO1 策略后处理器可把 padding 后的 24 维动作裁剪回 7 维 LIBERO 动作空间并应用 gripper 二值化。要按作者格式每个任务一个 episode评估需保留原始相机名并设置 LIBERO 动作后处理参数lerobot-eval \ --policy.pathyour-org/your-evo1-libero-checkpoint \ --policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf \ --policy.devicecuda \ --policy.use_flash_attntrue \ --policy.n_action_steps14 \ --policy.postprocess_action_dim7 \ --policy.binarize_grippertrue \ --env.typelibero \ --env.tasklibero_object \ --env.camera_name_mapping{agentview_image: agentview_image, robot0_eye_in_hand_image: robot0_eye_in_hand_image} \ --env.observation_height448 \ --env.observation_width448 \ --eval.batch_size1 \ --eval.n_episodes17.3 LIBERO 评估原生lerobot/liberov3 profile原生 v3 数据集中相机特征名为image与image2。以评估全部 10 个 LIBERO Object 任务为例每个任务新起一个进程需预先导出渲染环境变量export MUJOCO_GLegl export PYOPENGL_PLATFORMegl suitelibero_object horizon280 for task_id in {0..9}; do lerobot-eval \ --policy.pathzuoxingdong/evo1_libero \ --policy.pretrained_revision515921f4a2c1d3f3ad523721eafa26fdf2af315b \ --policy.vlm_model_nameOpenGVLab/InternVL3-1B-hf \ --policy.devicecuda \ --policy.use_amptrue \ --policy.vlm_dtypebfloat16 \ --policy.use_flash_attnfalse \ --policy.enable_gradient_checkpointingfalse \ --policy.vlm_num_layers14 \ --policy.image_resolution[448,448] \ --policy.max_text_length1024 \ --policy.chunk_size50 \ --policy.n_action_steps14 \ --policy.max_state_dim24 \ --policy.max_action_dim24 \ --policy.num_inference_timesteps32 \ --policy.postprocess_action_dim7 \ --policy.binarize_grippertrue \ --policy.gripper_threshold0.0 \ --policy.gripper_below_threshold_value-1.0 \ --policy.gripper_above_threshold_value1.0 \ --env.typelibero \ --env.task${suite} \ --env.task_ids[${task_id}] \ --env.camera_nameagentview_image,robot0_eye_in_hand_image \ --env.camera_name_mapping{agentview_image: image, robot0_eye_in_hand_image: image2} \ --env.control_moderelative \ --env.obs_typepixels_agent_pos \ --env.observation_width448 \ --env.observation_height448 \ --env.init_statestrue \ --env.episode_length${horizon} \ --env.render_modergb_array \ --env.max_parallel_tasks1 \ --eval.n_episodes50 \ --eval.batch_size1 \ --eval.use_async_envsfalse \ --eval.recordingfalse \ --seed1000 \ --output_dir./outputs/evo1-libero-stage2-70k-eval/${suite}/task-${task_id} \ --job_nameevo1-libero-stage2-70k-${suite}-task-${task_id} done各套件的env.episode_length设置如下env.taskenv.episode_lengthlibero_spatial280libero_object280libero_goal300libero_10520每个套件替换一次suite与horizon跑完共得到每个套件 500 个 episode、总计 2,000 个 episode循环中每任务新进程的拓扑与实测的 RNG 重置方式一致。7.4 参考结果[!NOTE] 集成文档中报告已发布的 stage2 checkpointzuoxingdong/evo1_liberorevision515921f4a2c1d3f3ad523721eafa26fdf2af315b通过了干净下载与 rollout 验证。以下为文档记录的参考数据。单次运行的 stage2 checkpoint第 70,000 步保存在评估 seed 1000 下得到套件成功 episode 数总 episode 数成功率LIBERO Spatial48550097.0%LIBERO Object49650099.2%LIBERO Goal48350096.6%LIBERO-1046950093.8%总体1,9332,00096.65%该结果来自单个训练 checkpoint、单个评估 seed并非多 seed 均值或置信区间估计。八、RTC 实时分块推理支持EVO1 支持异步推理中的实时分块Real-Time ChunkingRTC模式lerobot-rollout --inference.typertc会设置policy.rtc_config并调用init_rtc_processor()modeling_evo1.py 中Evo1Policy.supports_rtc()返回True。RTC 通过RTCProcessor复用 pi0 的 flow 约定对去噪过程做引导EVO1 内部积分约定为t: 0→1、速度v x1 - x0接入 RTC 时通过time 1-t与速度符号翻转映射到 pi0 约定见 flow_matching.py 中get_action的use_rtc分支使动作块的前缀步被拉向上一个 chunk 的残留动作保证推理延迟下的执行连续性。测试test_flowmatching_rtc_guidance_pulls_prefix_toward_previous_chunk验证了引导后前缀步显著更接近上一 chunk而首块无残留时与无引导采样完全一致。需要区分的是RTC 模式要求使用predict_action_chunk直接驱动select_action队列路径不支持 RTC会断言报错见测试test_evo1_rtc_processor_wiring。若在未配置rtc_config时向predict_action_chunk传入 RTC 参数会抛出RuntimeError提示先配置 RTC。九、测试与验证EVO1 的测试集中在 tests/policies/evo1/test_evo1.py覆盖了本指南涉及的大部分关键行为可作为二次开发的参考基线工厂注册与配置解析test_evo1_factory_registration两阶段微调默认值与一致性校验test_evo1_stage_defaults_and_consistency非正方形image_resolution与越界default_embodiment_id的拒绝逻辑训练/推理均走批量嵌入路径test_evo1_policy_forward_and_inference_use_batched_embedding回合结束伪动作的损失屏蔽test_evo1_forward_masks_padded_action_timesteps处理器 padding、动作裁剪与 gripper 二值化test_evo1_policy_processors_pad_state_crop_action_and_binarize_grippercheckpoint 加载后统计量重 padding 的回归test_reconcile_evo1_processors_repads_overridden_statsstage1 冻结 VLM 不追踪梯度、stage2 追踪梯度的行为差异缺视图/占位相机、state_mask、chunk_size1 等边界情况。十、总结EVO1 在 LeRobot 中的集成遵循标准的策略抽象InternVL3 负责视觉-语言理解flow-matching 动作头负责连续动作生成Evo1Policy负责分阶段微调与推理队列处理器链负责维度 padding、归一化与后处理。两阶段训练策略先训动作头、再微调 VLM配合apply_training_stage_defaults的覆盖机制使其既能快速收敛也能充分释放 InternVL3 的视觉-语言先验。无论你是想在自己的 LeRobot 数据集上复现 LIBERO 级别的成功率还是把 EVO1 接入真实机器人做实时推理都可以从本文的配置参数与命令入手再结合 configuration_evo1.py 与 test_evo1.py 深入理解每个开关的底层语义。【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表