LeRobot documentation

EVO1

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

EVO1

EVO1は、InternVL3バックボーンと連続的なフローマッチングアクションヘッドを中核とする、ロボット制御用のVision-Language-Actionポリシーです。このLeRobot統合により、EVO1は標準的なポリシータイプとして公開され、通常のLeRobotのデータセット、チェックポイント、プロセッサのAPIを用いて学習および評価を行うことができます。

モデル概要

ポリシーは、InternVL3を使用して1つ以上のカメラ画像と言語タスクのプロンプトを埋め込み、ロボットの状態/アクションベクトルを固定の最大次元にパディングし、フローマッチングのアクションヘッドで将来のアクションチャンクを予測します。推論時には、ポリシーがアクションチャンクをサンプリングし、そのチャンクからn_action_steps個のアクションを返してから、再度サンプリングを行います。

LeRobot統合の範囲

  • LeRobotによる標準的なpolicy.type=evo1設定
  • FlashAttentionフォールバックをオプションとするInternVL3の画像/テキスト埋め込み
  • ステージベースのファインチューニング制御は、アクションヘッドのみのファインチューニングおよびVLMのファインチューニング実行に適用されます
  • 連続フローマッチングによるアクション予測
  • LeRobotのポリシーAPIによるチェックポイントの保存/読み込み
  • lerobot-train による学習と、標準的なポリシー推論 API による評価

より広範なEVO1プロジェクトには、追加の学習スクリプトやデータセットツールが含まれる可能性があります。このページでは、LeRobotのロボット制御ポリシーのパスに焦点を当てています。

インストール要件

  1. インストールガイドに従ってLeRobotをインストールしてください。

  2. EVO1の依存関係をインストールします:

    pip install -e ".[training,evo1]"

    LIBEROの学習と評価を行うには、LIBEROの追加パッケージもインストールしてください:

    pip install -e ".[training,evo1,libero]"
  3. Python、PyTorch、CUDA、GPUスタックと互換性がある場合のみ、flash-attnのホイールをインストールしてください。flash_attnが利用できない場合、EVO1は標準的なアテンションにフォールバックします。

EVO1 は Hugging Face のネイティブな transformers による InternVL 実装を使用するため、policy.vlm_model_name は OpenGVLab/InternVL3-1B-hf のようなネイティブに変換されたチェックポイント(-hf サフィックスに注意)を指す必要があります。初回実行時に設定された VLM チェックポイントがダウンロードされ、以降の実行では Hugging Face のキャッシュから再利用されます。

データ要件

EVO1は、以下の条件を満たすLeRobotデータセットを前提としています:

  • policy.max_views までの視覚観測、例えば observation.images.image
  • observation.state
  • action
  • データセットのtaskフィールドにある言語タスクの指示、またはpolicy.task_fieldで設定された別のフィールド

状態ベクトルとアクションベクトルは、policy.max_state_dimおよびpolicy.max_action_dimまでパディングされます。予測値は、返される前に、データセットのアクション次元にクロップされます。

使用方法

LeRobot の構成で EVO1 を使用するには、以下を指定します:

policy.type=evo1

デフォルトでは、新しいEVO1ポリシーはVLMを以下から初期化します:

policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf

LeRobot形式のEVO1チェックポイントが利用可能になったら、次のようにして読み込みます。

policy.path=your-org/your-evo1-checkpoint

トレーニング

ステージ 1

ステージ1では、VLMをフリーズし、アクションヘッドを学習します:

lerobot-train \
  --dataset.repo_id=your_org/your_dataset \
  --policy.type=evo1 \
  --policy.training_stage=stage1 \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.optimizer_lr=1e-5 \
  --batch_size=4 \
  --steps=5000 \
  --output_dir=./outputs/evo1_stage1

ステージ2

Stage 2ではStage 1のポリシーを読み込みますが、新しいオプティマイザーとスケジューラーから開始します:

lerobot-train \
  --dataset.repo_id=your_org/your_dataset \
  --policy.path=./outputs/evo1_stage1/checkpoints/005000/pretrained_model \
  --policy.training_stage=stage2 \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.optimizer_lr=1e-5 \
  --batch_size=4 \
  --steps=80000 \
  --output_dir=./outputs/evo1_stage2

デフォルトでは、policy.training_stage はそのステージのファインチューニングデフォルトを再適用します。これは、Stage 1 のチェックポイントから Stage 2 を開始する際に重要であり、Stage 1 のチェックポイント設定では VLM ファインチューニングフラグが無効として保存されているためです。policy.apply_training_stage_defaults=false が設定されていない限り、これらのステージデフォルトは、保存されたまたは手動で指定された policy.finetune_* フラグよりも優先されます。したがって、すべてのファインチューニングフラグを手動で制御する場合のみ、そのフラグを設定してください。

主要な学習パラメータ

パラメータデフォルト説明
policy.vlm_model_nameOpenGVLab/InternVL3-1B-hfネイティブ変換済みのInternVL3チェックポイントまたはローカルモデルディレクトリ
policy.training_stagestage1stage1ではアクションヘッドを学習し、stage2ではVLMブランチをファインチューニングします。
policy.apply_training_stage_defaultstrueチェックポイントの読み込み後にステージのファインチューニングのデフォルトを再適用します
policy.vlm_num_layers14ポリシー用に保持するInternVL3の言語レイヤー数
policy.dtypebfloat16要求されたVLMのdtype
policy.use_flash_attntrueインストールされている場合はFlashAttentionを要求し、そうでない場合はフォールバックします
policy.enable_gradient_checkpointingtrueサポートされているInternVL3モジュールでチェックポイント機能を有効にします
policy.gradient_checkpointing_use_reentrantfalseサポートされている場合、勾配チェックポイントに渡される再入設定
policy.chunk_size50チャンクごとに予測される将来アクションの数
policy.n_action_steps50サンプリングされたチャンクから消費されたアクションの数
policy.max_state_dim24パディング次元の状態
policy.max_action_dim24アクションの埋め込み次元
policy.postprocess_action_dimnullEVO1のポストプロセッシング後に返される任意のアクション次元
policy.binarize_gripperfalseLIBERO形式の評価用に、後処理されたグリップチャネルを二値化します
policy.task_fieldtask言語プロンプトとして使用されるバッチフィールド

推論

学習済みのEVO1チェックポイントで試してみてください:

# --inference.type=rtc is optional
lerobot-rollout \
  --policy.path=your-org/your-evo1-checkpoint \
  --inference.type=rtc \
  ...

結果

LIBERO評価

参照結果

公開された Stage-2 チェックポイントは、クリーンダウンロードおよびロールアウト検証をパスしました: zuoxingdong/evo1_libero、リビジョン 515921f4a2c1d3f3ad523721eafa26fdf2af315b。 クリーンダウンロード評価には、LeRobot リビジョン e40b58a8dfa9e7b86918c374791599d070518d11 が使用されました。

ステップ70,000の単一実行Stage-2チェックポイントで生成されたものは以下の通りです:

スイート成功したエピソードエピソード成功率
LIBERO Spatial48550097.0%
LIBERO Object49650099.2%
LIBERO Goal48350096.6%
LIBERO-1046950093.8%
全体1,9332,00096.65%

これらの結果は、1つの学習済みチェックポイントと評価シード1000を使用しています。複数シードの平均値や信頼区間の推定ではありません。

参考となる学習レシピ

公開されたチェックポイントは、train_config.json に完全な Stage-2 設定を記録しています。 測定された実行では、2 つの H100 GPU と 2 つの DDP プロセス、プロセスあたりバッチ 64 を使用し、グローバルバッチは 128 となりました。両方のステージで同じトポロジーが使用されました。ベースの VLM は、OpenGVLab/InternVL3-1B-hf のリビジョン 014c0583a0d4bedf29fbe2dbff4f865eb998e171 から取得しました。 公開された成果物には、LeRobot の正確なトレーニングコミットや元の依存関係ロックが記録されていないため、以下のコマンドは、ソフトウェア環境をビット単位で再構築するのではなく、現在のチェックアウトから記録された設定とトポロジーを再現します。

LeRobotのソースチェックアウトから、ロックされた依存関係をインストールし、その正確なVLMリビジョンをダウンロードします:

uv sync --locked --extra training --extra evo1 --extra libero
VLM_DIR=$(uv run hf download OpenGVLab/InternVL3-1B-hf \
  --revision=014c0583a0d4bedf29fbe2dbff4f865eb998e171)

ステージ1では、VLMをフリーズし、アクションヘッドを5,000ステップにわたって学習します:

uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=lerobot/libero \
  --dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
  --dataset.video_backend=torchcodec \
  --dataset.return_uint8=true \
  --dataset.image_transforms.enable=true \
  --dataset.use_imagenet_stats=true \
  --dataset.eval_split=0.0 \
  --policy.type=evo1 \
  --policy.training_stage=stage1 \
  --policy.apply_training_stage_defaults=true \
  --policy.vlm_model_name="${VLM_DIR}" \
  --policy.vlm_num_layers=14 \
  --policy.dtype=bfloat16 \
  --policy.device=cuda \
  --policy.use_amp=true \
  --policy.use_flash_attn=true \
  --policy.enable_gradient_checkpointing=true \
  --policy.gradient_checkpointing_use_reentrant=false \
  --policy.image_resolution='[448,448]' \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.dropout=0.2 \
  --policy.optimizer_lr=1e-5 \
  --policy.optimizer_weight_decay=1e-3 \
  --policy.optimizer_grad_clip_norm=1.0 \
  --policy.scheduler_warmup_steps=1000 \
  --policy.push_to_hub=false \
  --use_policy_training_preset=true \
  --batch_size=64 \
  --steps=5000 \
  --save_checkpoint=true \
  --save_checkpoint_to_hub=false \
  --save_freq=2500 \
  --log_freq=10 \
  --env_eval_freq=0 \
  --num_workers=4 \
  --prefetch_factor=2 \
  --persistent_workers=true \
  --seed=1000 \
  --trackio.enable=false \
  --output_dir=./outputs/evo1-libero-stage1-g128-5k

Stage 2ではStage-1のポリシーを読み込みますが、新しいオプティマイザーとスケジューラーから開始します。80,000ステップにわたって学習を行い、報告されているチェックポイントはステップ70,000での保存です:

uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=lerobot/libero \
  --dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
  --dataset.video_backend=torchcodec \
  --dataset.return_uint8=true \
  --dataset.image_transforms.enable=true \
  --dataset.use_imagenet_stats=true \
  --dataset.eval_split=0.0 \
  --policy.path=./outputs/evo1-libero-stage1-g128-5k/checkpoints/005000/pretrained_model \
  --policy.training_stage=stage2 \
  --policy.apply_training_stage_defaults=true \
  --policy.vlm_model_name="${VLM_DIR}" \
  --policy.vlm_num_layers=14 \
  --policy.dtype=float32 \
  --policy.device=cuda \
  --policy.use_amp=true \
  --policy.use_flash_attn=true \
  --policy.enable_gradient_checkpointing=true \
  --policy.gradient_checkpointing_use_reentrant=false \
  --policy.image_resolution='[448,448]' \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.dropout=0.2 \
  --policy.optimizer_lr=1e-5 \
  --policy.optimizer_weight_decay=1e-3 \
  --policy.optimizer_grad_clip_norm=1.0 \
  --policy.scheduler_warmup_steps=1000 \
  --policy.push_to_hub=false \
  --use_policy_training_preset=true \
  --batch_size=64 \
  --steps=80000 \
  --resume=false \
  --save_checkpoint=true \
  --save_checkpoint_to_hub=false \
  --save_freq=10000 \
  --log_freq=10 \
  --env_eval_freq=0 \
  --num_workers=4 \
  --prefetch_factor=2 \
  --persistent_workers=true \
  --seed=1000 \
  --trackio.enable=false \
  --output_dir=./outputs/evo1-libero-stage2-g128-80k

著者形式の評価プロファイル

著者形式のEVO1 LIBEROプロファイルは、生のLIBEROカメラ特徴量名(observation.images.agentview_imageおよびobservation.images.robot0_eye_in_hand_image)を使用し、14アクションごとに再計画を行い、シミュレータをステップする前にグリップコマンドを二値化します。EVO1ポリシーのポストプロセッサは、パディングされた24次元のアクションを7次元のLIBEROアクション空間にクロップし、そのグリップ二値化を適用できます。著者形式のチェックポイントを、タスクごとに1エピソードという同じ設定で評価するには、デフォルトのimage/image2マッピングの代わりに生のカメラ名を保持し、LIBEROアクションのポストプロセッシングフラグを設定してください。

lerobot-eval \
  --policy.path=your-org/your-evo1-libero-checkpoint \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.use_flash_attn=true \
  --policy.n_action_steps=14 \
  --policy.postprocess_action_dim=7 \
  --policy.binarize_gripper=true \
  --env.type=libero \
  --env.task=libero_object \
  --env.camera_name_mapping="{agentview_image: agentview_image, robot0_eye_in_hand_image: robot0_eye_in_hand_image}" \
  --env.observation_height=448 \
  --env.observation_width=448 \
  --eval.batch_size=1 \
  --eval.n_episodes=1

ネイティブのlerobot/libero v3プロファイル

リビジョンa1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4では、カメラの特徴量をimageとimage2として保存します。この例では、LIBERO Objectタスクの全10タスクを評価し、各タスクを新しいプロセスで起動します。

export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl

suite=libero_object
horizon=280
for task_id in {0..9}; do
  lerobot-eval \
    --policy.path=zuoxingdong/evo1_libero \
    --policy.pretrained_revision=515921f4a2c1d3f3ad523721eafa26fdf2af315b \
    --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
    --policy.device=cuda \
    --policy.use_amp=true \
    --policy.dtype=bfloat16 \
    --policy.use_flash_attn=false \
    --policy.enable_gradient_checkpointing=false \
    --policy.vlm_num_layers=14 \
    --policy.image_resolution='[448,448]' \
    --policy.max_text_length=1024 \
    --policy.chunk_size=50 \
    --policy.n_action_steps=14 \
    --policy.max_state_dim=24 \
    --policy.max_action_dim=24 \
    --policy.num_inference_timesteps=32 \
    --policy.postprocess_action_dim=7 \
    --policy.binarize_gripper=true \
    --policy.gripper_threshold=0.0 \
    --policy.gripper_below_threshold_value=-1.0 \
    --policy.gripper_above_threshold_value=1.0 \
    --env.type=libero \
    --env.task="${suite}" \
    --env.task_ids="[${task_id}]" \
    --env.camera_name=agentview_image,robot0_eye_in_hand_image \
    --env.camera_name_mapping="{agentview_image: image, robot0_eye_in_hand_image: image2}" \
    --env.control_mode=relative \
    --env.obs_type=pixels_agent_pos \
    --env.observation_width=448 \
    --env.observation_height=448 \
    --env.init_states=true \
    --env.episode_length="${horizon}" \
    --env.render_mode=rgb_array \
    --env.max_parallel_tasks=1 \
    --eval.n_episodes=50 \
    --eval.batch_size=1 \
    --eval.use_async_envs=false \
    --eval.recording=false \
    --seed=1000 \
    --output_dir="./outputs/evo1-libero-stage2-70k-eval/${suite}/task-${task_id}" \
    --job_name="evo1-libero-stage2-70k-${suite}-task-${task_id}"
done

これらのホライズンで、各スイートについて10個すべてのタスクIDを実行します:

env.taskenv.episode_length
libero_spatial280
libero_object280
libero_goal300
libero_10520

各行についてsuiteとhorizonを設定します。これにより、1つのsuiteあたり500エピソード、全体で2,000エピソードが得られ、タスクごとに新しいプロセスを起動するループの構成は、測定されたRNGリセットのトポロジーと一致します。

参考文献

ライセンス

このLeRobot統合は、LeRobotで使用されているApache 2.0ライセンスに従います。公開されたチェックポイントとデータのライセンスについては、上流のEVO1およびInternVL3のモデルページを確認してください。

Update on GitHub