LeRobot documentation

Cosmos3

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Cosmos3

Cosmos3は、NVIDIAのオムニモーダル・ワールドモデルのファミリーであるCosmos 3を基盤として構築された、ロボット制御用のワールドアクションモデルです。カメラからの観測と言語指示から、ポリシーは将来の動画フレームと次のロボットアクションのチャンクを同時に予測します。LeRobotの実装は、ネイティブのcosmos-frameworkアクションポリシーに基づいて適応されており、LeRobot形式に変換された公開済みのCosmos3 NanoとEdgeモデルを実行します。

モデル概要

Cosmos 3 is a Mixture-of-Transformers (MoT). Every decoder layer has two pathways with their own layer norms, attention projections and MLPs, and the two pathways meet only in a shared self-attention:

  • 理解パスウェイ(推論器)は、プロンプトのテキストトークンと、任意のViT画像トークンを、因果的アテンションを用いて読み取ります。
  • 生成パス(ジェネレーター)は、拡散サブシーケンスの連続トークン、すなわち動画のWan2.2 VAE潜在変数とアクショントークンを読み取ります。両方のパスに対して双方向にアテンションを適用し、フローマッチングで学習されます。
Mixture-of-Transformers architecture of Cosmos 3

Cosmos 3 の Mixture-of-Transformers (MoT) アーキテクチャ(技術レポートの図5)。左:自己回帰(AR)サブシーケンスは reasoner を、拡散(DM)サブシーケンスは generator を通過し、両者は共有マルチモーダルアテンションで合流します。右:アテンションマスク。AR は因果的、拡散はフルです。

ポリシーとして、Cosmos3はネイティブアクションレシピのワールドアクションモデルモードで実行されます:

  • 入力: カメラビューは1つのビデオキャンバスに構成されます(1つのビューはそのまま、2つは横並び、3つは1つ目を上に、残り2つを下に配置)。プロンプトには、タスク、フレームレート、キャンバスの解像度、キャンバスレイアウトの説明、およびチャンクのアイドルフレーム数が含まれます。
  • 学習: ポリシーは、現在のフレームのクリップとchunk_sizeの未来フレームをVAEでエンコードし、未来の潜在変数とアクションチャンクにノイズを加え、両方のノイズ除去を学習します。損失は、動画損失とアクション損失の加重和です。
  • 推論: 条件フレームはクリーンな状態で、将来の動画とアクションはUniPCソルバーによって共同でサンプリングされ、ポリシーがアクションチャンクを返します。評価中(評価を参照)に予測された動画を保存できます。
  • デフォルトでは、ネイティブのポストトレーニングレシピと同様に、生成パスウェイ、その周囲のレイヤー、およびアクションモジュールのみが学習されます(train_gen_stream_only=true、freeze_vision_encoder=true)。

LeRobot は、リリースされた 2 つのサイズを 2 つのポリシータイプとして提供しています:

Cosmos3 NanoCosmos3 Edge
ポリシータイプcosmos3_nanocosmos3_edge
パラメータ(デフォルトで学習)16.5B (7.0B)4.6B (1.4B)
BackboneQwen3-VLから初期化されたMoT、36層、隠れサイズ4096MoTは、28層、隠れサイズ2048の密な2B Transformer
トークナイザnvidia/Cosmos3-Nanonvidia/Cosmos3-Edge
ベースチェックポイントlerobot/Cosmos3-Nanolerobot/Cosmos3-Edge

インストール要件

  1. LeRobotのインストールは、インストールガイドに従って行ってください。

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

    pip install -e ".[cosmos3]"

    PyPIからLeRobotをインストールした場合は:

    pip install 'lerobot[cosmos3]'
  3. ワークフローに必要な追加パッケージを追加します: lerobot-train用のtraining、LIBEROでの学習または評価用のlibero、LoRA用のpeftです。例:

    pip install -e ".[cosmos3,training,libero]"

Cosmos3 はデフォルトで PyTorch のスケーリングドットプロダクトアテンションバックエンド (sdpa) を使用します。環境に互換性のある flash_attn インストールがある場合、--policy.attn_implementation=flash_attention_2 を指定できます。--policy.compile_model=true と組み合わせて使用しないでください。コンパイルされたデコーダーレイヤーは、フラッシュアテンションを持つ各レイヤーごとに再コンパイルされ、再コンパイルエラーで停止します。

チェックポイント

チェックポイントサイズ学習データ使用
lerobot/Cosmos3-NanoNanonvidia/Cosmos3-Nano のリリースファインチューニングのベース
lerobot/Cosmos3-Edgeエッジnvidia/Cosmos3-Edge のリリースファインチューニングのベース
lerobot/Cosmos3-Nano-Policy-LIBERONanolerobot/LIBERO-Cosmos3LIBERO評価
lerobot/Cosmos3-Edge-Policy-LIBEROエッジlerobot/LIBERO-Cosmos3LIBERO評価
lerobot/Cosmos3-Nano-Policy-LIBERO_10Nanolerobot/LIBERO_10-Cosmos3LIBERO-10の評価
lerobot/Cosmos3-Edge-Policy-LIBERO_10エッジlerobot/LIBERO_10-Cosmos3LIBERO-10の評価
  • ベースのチェックポイントは、LeRobot形式で公開された重みを保持しています。そのアクションモジュール(action2llm、llm2action、action_modality_embed)は、まだロボット用に学習されていないため、--policy.load_action_modules=false を指定してファインチューニングを開始してください(LIBEROでのファインチューニングを参照)。
  • ベースチェックポイントのconfig.jsonには、ネイティブのDROIDポストトレーニングレシピが保存されており、ポリシータイプのクラスデフォルトはネイティブのLIBEROレシピです。
  • LIBEROのチェックポイントは、そのトレーニング実行のEMA重みを保持しています。
  • 重みはbfloat16で保存されています。config.jsonでは意図的にdtype: float32が設定されています。これらのチェックポイントからの混合精度トレーニングでは、ネイティブのトレーニングと同様にfloat32のマスター重みが保持されます。推論や評価を行う場合は、--policy.dtype=bfloat16を渡してください。

チェックポイントから開始するには、2つの方法があります。

  • --policy.path=<checkpoint> は、保存された設定、重み、プロセッサを読み込み、その上にコマンドラインの指定を適用します。
  • --policy.type=cosmos3_nano --policy.pretrained_path=<checkpoint>(または cosmos3_edge)は、重みとプロセッサのみを読み込み、設定はクラス既定値である LIBERO レシピから開始されます。

LIBEROでのファインチューニング

クラスのデフォルト値は、技術レポートのLIBEROレシピに基づいています。16アクションのチャンク、エンボディメントdomain_id=5、ステートアクションなし、アクションの分位数正規化、推論時のUniPC(30ステップ、classifier-free guidanceなし)、学習率5e-5(500ステップのウォームアップ、ステップ16000でゼロまで線形減衰)です。したがって、--policy.type付きのベースチェックポイントから始める場合、--policy.load_action_modules=falseのみを指定すれば十分です。

このレシピは、Cosmos3レイアウトに変換されたLIBEROデータで学習します:

どちらもネイティブレシピのデータであるnvidia/LIBERO_LeRobot_v3に由来します。アクションは LIBERO の 7 次元の軸角アクションではなく、10 次元の[delta position (3), rot6d (6), gripper]です。2 つのカメラ、observation.images.image(サードパーソン)とobservation.images.image2(リスト)は 256x256、20 FPS であり、アクションの統計量はネイティブレシピのものです。評価時には、LIBERO 環境がアクションを元に戻します(Evaluationを参照)。

トレーニングコマンド

ネイティブなLIBEROレシピでは、LIBERO-10で2000イテレーション、4つのスイートで5000イテレーションにわたり、グローバルバッチサイズ2048サンプルで学習を行います(LIBERO-10の最良チェックポイントはイテレーション1500付近、4つのスイートでは4500付近にあります)。以下のコマンドは、8 GPUを備えた1台のマシン上でこれを再現します: 8 GPUにわたるFSDP2、GPUあたり32サンプル、8ステップの勾配蓄積により、32 x 8 x 8 = 2048サンプルが1回のオプティマイザ更新あたりのサンプル数となります。ネイティブのイテレーション数はすべて8ステップの蓄積ステップ数で乗算されます: 2000イテレーションは--steps=16000となり、500イテレーションごとのチェックポイントは--save_freq=4000となり、ウォームアップの500と減衰の終了点16000はそれぞれ4000と128000となります。

accelerate launch --num_processes=8 $(which lerobot-train) \
  --policy.type=cosmos3_nano \
  --policy.pretrained_path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-LIBERO_10 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --parallelism.dp_shard=8 \
  --accelerator.fsdp.mixed_precision_policy.param_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.reduce_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.cast_forward_inputs=false \
  --accelerator.gradient_accumulation.steps=8 \
  --accelerator.gradient_accumulation.sync_each_batch=true \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=32 \
  --steps=16000 \
  --save_freq=4000 \
  --policy.scheduler_warmup_steps=4000 \
  --policy.scheduler_decay_steps=128000 \
  --output_dir=outputs/train/cosmos3_nano_libero_10 \
  --job_name=cosmos3_nano_libero_10 \
  --trackio.enable=true

4つのスイートには--dataset.repo_id=lerobot/LIBERO-Cosmos3と--steps=40000(5000イテレーション)を使用します。Cosmos3 Edgeには--policy.type=cosmos3_edge --policy.pretrained_path=lerobot/Cosmos3-Edgeを使用します。

主要な学習パラメータ

パラメータ説明
--policy.load_action_modules=falseネイティブのポストトレーニングレシピと同様に、モジュールを読み込むのではなく、初期化状態からアクションモジュールを開始します。ベースチェックポイントからのファインチューニングを行う場合のみ設定してください(以下の注記を参照)。
--parallelism.dp_shard=88つのGPUでFSDP2を使用します。ポリシーがFSDP2のラップ単位を宣言するため、--accelerator.fsdp.wrap_modulesは不要です。マルチGPUトレーニングガイドを参照してください。
--accelerator.fsdp.mixed_precision_policy.*ネイティブトレーニングと同様に、bfloat16での計算と勾配の集約、およびfloat32のマスターウェイトを使用します。デフォルトの--policy.dtype(float32)を維持してください。bfloat16のポリシーにすると、bfloat16のマスターウェイトで学習が行われるためです。
--accelerator.gradient_accumulation.stepsグローバルバッチサイズは、--batch_size x GPU数 x 累積ステップ数です。sync_each_batch=true を設定すると、各マイクロバッチごとに勾配が削減されるため、シャードされた状態が維持され、追加のアンシャードコピーは不要になります。
--steps, --save_freq, --policy.scheduler_*_stepsLeRobot はループのステップ数(マイクロバッチ)をカウントし、オプティマイザーの更新回数をカウントしません。ネイティブレシピのイテレーション数(2000 または 5000 イテレーション、ウォームアップ 500、減衰 16000、チェックポイント間隔 500)に、アキュムレーションステップ数を掛けてください。--steps は --policy.scheduler_decay_steps 以下にしてください。それを超えると学習率がゼロになります。
--ema.type=power --ema.sigma_rel=0.1ネイティブレシピのEMAです。各チェックポイントには、pretrained_model_ema/にEMAの重みが保存されており、これが評価および公開に使用する重みです。
--tf32=falseネイティブのトレーニングと同様に、float32の行列乗算をフル精度で保持します。
--policy.gradient_checkpointing=trueメモリを節約するために、バックワードパスでデコーダー層とビジョンブロックのアクティベーションを再計算します。
--policy.compile_model=trueオプション: デコーダー層とVAEエンコーダーのtorch.compile。

単一GPUまたはDDPを使用する場合、FSDP2のフラグ(--parallelism.dp_shardおよび--accelerator.fsdp.mixed_precision_policy.*)を--accelerator.mixed_precision=bf16に置き換えます。例えば、1つのGPUでCosmos3 Edgeを、ステップあたり32サンプル、同じグローバルバッチ2048を得るために64ステップの累積を行う設定は以下の通りです。

lerobot-train \
  --policy.type=cosmos3_edge \
  --policy.pretrained_path=lerobot/Cosmos3-Edge \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Edge-Policy-LIBERO_10 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --accelerator.mixed_precision=bf16 \
  --accelerator.gradient_accumulation.steps=64 \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=32 \
  --steps=128000 \
  --save_freq=32000 \
  --policy.scheduler_warmup_steps=32000 \
  --policy.scheduler_decay_steps=1024000 \
  --output_dir=outputs/train/cosmos3_edge_libero_10

--policy.load_action_modules=false は、チェックポイントの読み込み後に true にリセットされるため、保存された実行は学習済みのアクションモジュールを再度読み込みます。以下の2つのケースでは、誤ってアクションモジュールが初期化状態のままになります。

  • --policy.pretrained_path または --policy.path を指定せずにポリシーを構築した場合、何も読み込まれないため、フラグは false のままとなり、そのランの後の評価や再開時に、学習済みのアクションモジュールがスキップされます。
  • --peft.full_training_modules の外にアクションモジュールを配置した PEFT: この場合、アクションモジュールは学習されません。

ベースチェックポイントからのファインチューニングを行う場合のみ、--policy.load_action_modules=false を設定してください。PEFT を使用する場合、アクションモジュールは --peft.full_training_modules に保持してください(デフォルト)。

ハードウェア要件

このページのコマンドと勾配チェックポイントリングを有効にして、A800 80 GB GPUで測定した結果:

セットアップGPUGPUごとのバッチGPUごとのピークメモリ
Nano、フルファインチューニング(FSDP2)83238 GB
Nano、LoRA1464 GB
エッジ、フルファインチューニング13247 GB
Edge, LoRA1821 GB
bfloat16、Nano、Edgeでの評価110つの環境39 GB と 15 GB
  • Cosmos3 Nano は 80 GB の GPU が必要で、フルファインチューニングには少なくとも 4 台必要です。FSDP2 がモデルをシャードする前に、各 GPU が float32 のモデル全体(約 66 GB)を保持するためです。
  • 上記のLIBEROコマンドは、8枚のA800 GPUでオプティマイザーの1回の更新に約45秒かかるため、LIBERO-10全体では約25時間かかります。

独自のデータでのファインチューニング

Cosmos3は、コマンドラインからのトレーニングレシピとデータセットを受け取ります。ポリシーにはロボット固有のロジックは含まれていません。以下のポイントに従っていれば、どのLeRobotデータセットでも動作します。

データセットの要件

  • カメラ: データセットのinfo.jsonの順序に従って、1 つから 3 つのobservation.images.*特徴量。すべてのビューは--policy.view_size(デフォルトでは最初のカメラのサイズ)にリサイズされ、1 つのビデオキャンバスに合成されます: 1 つのビューはそのまま、2 つは横並び、3 つは最初の 1 つを上に、残りの 2 つをその下に横並びに配置します。カメラはこのレイアウトの順序で配置してください。例えば LIBERO では[third person, wrist]、DROID では[wrist, exterior 1, exterior 2]のようにします。
  • 説明の表示: --policy.view_description は、キャンバスのレイアウトを説明するプロンプトの文です。デフォルトでは、LIBERO のレイアウト(クラスのデフォルト)と DROID のレイアウト(ベースの config.json)が説明されています。ご自身のレイアウトの文を記述してください。誤った説明は検出されず、プロンプトの効果を弱めるだけです。
  • アクション表現: ポリシーは、変換ステップなしで、データセットのアクションをそのまま学習します。LIBEROデータがrot6d回転で行うように、学習したい表現に変換してからトレーニングしてください。環境が別の表現を期待している場合は、環境プロセッサ内でアクションを元に戻してください(LIBERO環境はCosmos3のためにこれを行っています)。
  • アクション幅: --policy.max_action_dim (64) チャネル以下。出力幅はデータセットから取得されます。
  • フレームレート: fpsはデータセットのメタデータから取得され、実際の制御レートである必要があります。プロンプトに書き込まれ、動画の位置の時間軸およびアイドルフレームの閾値を設定します。
  • 統計情報: デフォルトのアクション正規化はQUANTILESであり、meta/stats.json内のアクションのq01とq99の統計情報が必要です(LeRobotで書き出されたデータセットにはこれらが含まれています)。ネイティブのDROIDレシピでは、代わりにIDENTITYを使用します。
  • 状態: --policy.use_state=true を指定すると、現在の状態がクリーンな状態アクションとしてアクションの前に配置されます。この場合、observation.state はアクションと同じ幅とチャネルの意味を持つ必要があります。状態とアクションは、それぞれ独自の統計量で正規化されます。
  • 言語: 各フレームのtaskは、プロンプトの指示です。
  • Embodiment: --policy.domain_id は、32 行あるアクション射影の行を選択します。ネイティブのレシピでは、LIBERO に 5、DROID に 8、RoboCasa に 30 が使用されています。アクションモジュールが初期化から開始される場合(--policy.load_action_modules=false)、すべての行が未訓練の状態から始まり、どの値でも動作します。
  • チャンク: チャンクあたりのアクション数(LIBERO は 16、DROID は 32)を指定する --policy.chunk_size と、チャンクごとに実行されるアクション数を指定する --policy.n_action_steps。

None のままのフィールド(fps、view_size)とアクションチャネル名は、データセットから取得されます。その他のフィールドはすべて設定から取得されるため、コマンドラインまたは --config_path ファイルで設定してください。

アクションおよびステートのチャンネル名。 プロンプトには、チャンク内のフレームのうち何フレームがアイドル(ロボットが動かない状態)であるかが記載されており、Cosmos3IdleFrameProcessorStep は meta/info.json 内のアクションチャンネル名からそれらを数えます。[<prefix>_]<type>_<index> という形式の名前は、チャンネルの種類を示します。pos、回転(rot6d、rot9d、axisangle、euler_xyz、quat_xyzw、quat_wxyz)、gripper または joint で、アームを区別するためのプレフィックスが付きます(例: left_rot6d_0)。LIBERO データは pos_0..2, rot6d_0..5, gripper_0 を使用し、DROID のレイアウトは joint_0..6, gripper_0 です。

この命名は必須ではありません。命名を行わない場合、ポリシーは警告をログに記録するのみとなり、プロンプトはアイドルフレームをカウントしません。これは、LIBEROレシピが本来見ている状況と完全に一致します(ネイティブルール下では、そのエピソードにはアイドルフレームが存在しないためです)。ネイティブDROIDレシピのアイドルフレームカウントを必要とする場合のみ、この命名に従ってください。

DROIDレシピ

ベースチェックポイントのconfig.jsonは、DROIDのネイティブなポストトレーニングレシピです。具体的には、エンボディメントdomain_id=8、32アクションのチャンク、現在の状態をステートアクションとして使用し、その上にアイドルフレームをカウントする設定(use_state=true、idle_state=true)、正規化なし(IDENTITY)、推論時のUniPCは4ステップでclassifier-free guidance scaleが3、学習率は8e-5(ネイティブの2e-4に倍率0.4を掛けた値)で、ウォームアップなし、ステップ100000でゼロまで線形減衰する設定です。--policy.pathを指定してこれを出発点にすると、このレシピで学習が行われます。

ネイティブレシピは、nvidia/Cosmos3-DROIDの成功エピソードで学習します。Cosmos3レイアウトのDROIDデータセットには、以下が含まれます:

  • 3つのカメラ observation.images.wrist_left、observation.images.exterior_1_left、observation.images.exterior_2_left は、この順序(上から順に、手首カメラ、その下に2つの外部視点)で、ネイティブデータでは 360x640 です。
  • joint_0 から joint_6 までおよび gripper_0 と名付けられた 8 次元の関節位置アクション、および同じレイアウトを持つ observation.state
  • 15 FPSのフレームレート。

ネイティブレシピでは、グローバルバッチサイズ8192サンプルで10000イテレーション訓練し、1000イテレーションごとにチェックポイントを保存します。GPU 8基を備えた1台のマシンでは、GPUあたり8サンプル、128ステップの勾配累積により同じグローバルバッチ(8 x 8 x 128 = 8192)が得られ、イテレーション数はすべて128倍になります:

accelerate launch --num_processes=8 $(which lerobot-train) \
  --policy.path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-DROID \
  --dataset.repo_id=${HF_USER}/DROID-Cosmos3 \
  --parallelism.dp_shard=8 \
  --accelerator.fsdp.mixed_precision_policy.param_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.reduce_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.cast_forward_inputs=false \
  --accelerator.gradient_accumulation.steps=128 \
  --accelerator.gradient_accumulation.sync_each_batch=true \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=8 \
  --steps=1280000 \
  --save_freq=128000 \
  --policy.scheduler_decay_steps=12800000 \
  --output_dir=outputs/train/cosmos3_nano_droid \
  --job_name=cosmos3_nano_droid \
  --trackio.enable=true

ネイティブなDROIDレシピは256枚のGPUで実行されました。8枚のA800 GPUを搭載した1台のマシンでは、このコマンドのオプティマイザー更新1回に約33分かかります。そのため、レシピ全体を実行するには多数のマシンが必要です。すべてのマシンで同じコマンドを、accelerate launch(またはtorchrun)のマルチノードフラグ付きで実行し、各マシン内でシャード化し、マシン間でレプリケーションを行うには--parallelism.dp_replicate=<number of machines> --parallelism.dp_shard=8を使用し、--accelerator.gradient_accumulation.stepsとステップ数をマシンの数で割ってください。マルチGPUトレーニングガイドのHSDPを参照してください。

新しいロボット

新しいロボットでは、--policy.type を用いてクラスのデフォルト値から開始し、コマンドラインでデータのフィールドを設定します。例えば:

lerobot-train \
  --policy.type=cosmos3_edge \
  --policy.pretrained_path=lerobot/Cosmos3-Edge \
  --policy.load_action_modules=false \
  --policy.domain_id=0 \
  --policy.chunk_size=32 \
  --policy.n_action_steps=32 \
  --policy.view_description='The left half shows the front camera; the right half shows the wrist-mounted camera.' \
  --dataset.repo_id=${HF_USER}/my_dataset \
  ...

Backboneの設定

バックボーン設定--policy.mot_backboneは、単一のコマンドライン値です。変更したいフィールドのみを含むYAML辞書を渡します。例えば、事前学習済み重みなしでクイックテストを行うために、層数が少ないモデルを指定します:

--policy.type=cosmos3_edge --policy.mot_backbone='{text_config: {num_hidden_layers: 2}, vision_config: {num_hidden_layers: 1}}'

省略されたフィールドは、サイズに関するデフォルト値、または--policy.pathで読み込まれた設定の値が保持されます。浮動小数点数は1.0e-6のように記述してください(YAMLは1e-6を文字列として読み取ります)。また、rope_parametersのように値が辞書であるフィールドは、完全に記述してください。アーキテクチャのフィールドは、読み込む重みと一致している必要があります。

PEFT(LoRA)によるファインチューニング

Cosmos3 は、LeRobot の PEFT 統合(pip install -e ".[cosmos3,training,peft]")を通じて LoRA をサポートしています。デフォルトでは、LoRA は生成パスの注意機構の射影(q_proj_gen、k_proj_gen、v_proj_gen、o_proj_gen)を適応させ、アクションモジュール(action2llm、llm2action、action_modality_embed)はフルで学習され、アダプターとともに保存されます。

lerobot-train \
  --policy.type=cosmos3_nano \
  --policy.pretrained_path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-LIBERO_10-LoRA \
  --peft.method_type=lora \
  --peft.r=16 \
  --peft.lora_alpha=32 \
  --policy.optimizer_lr=5e-4 \
  --policy.optimizer_weight_decay=0 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --accelerator.mixed_precision=bf16 \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=4 \
  --steps=16000 \
  --output_dir=outputs/train/cosmos3_nano_libero_10_lora
  • --peft.lora_alpha=32、学習率および重み減衰は、ネイティブの Cosmos3 LoRA レシピの値です。--peft.lora_alpha を指定しない場合、PEFT は 8 を使用します。
  • --policy.load_action_modules=false を使用すると、アクションモジュールの形状が変更される場合があります(--policy.max_action_dim、--policy.num_embodiment_domains)。これはフルファインチューニングでのみ機能します。PEFT の実行を再読み込みするとベースが読み込まれるため、同じ形状が必要です。
  • --policy.train_gen_stream_only と --policy.freeze_vision_encoder は PEFT では無効です。PEFT では、アダプターとアクションモジュールのみが学習対象となります。
  • アクションの射影(action2llm、llm2action)を--peft.target_modulesに追加しないでください。これらは各エンボディメントごとのテーブルであり、グループ化行列積によって直接読み込まれるため、LoRAでは変更されません。これらはすでにフルで学習されています。
  • PEFTを使用する場合は、デフォルトのfloat32である--policy.dtypeを維持してください。これにより、フルで学習するアクションモジュールはfloat32のマスターウェイトを保持し続けます。
  • ネイティブレシピでは、LoRAのバッチサイズやスケジュールは定義されていません。このコマンドは、LIBEROのスケジュール(ステップ16000でゼロまで線形減衰)を維持し、1ステップあたり4サンプルを使用します。
  • Cosmos3 Nano は LoRA を使用して、勾配チェックポイントを有効にした状態で 1 つの 80 GB GPU で学習でき、GPU 当たり 4 サンプルの場合には約 64 GB のメモリを消費します(ハードウェア要件を参照)。

評価

4つのスイートでLIBEROのチェックポイントを評価します:

lerobot-eval \
  --policy.path=lerobot/Cosmos3-Nano-Policy-LIBERO \
  --policy.dtype=bfloat16 \
  --tf32=false \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --env.observation_height=256 \
  --env.observation_width=256 \
  --eval.n_episodes=10 \
  --eval.batch_size=10 \
  --output_dir=outputs/eval/cosmos3_nano_libero
  • 独自のトレーニング実行のチェックポイントについては、EMA重みを渡します: --policy.path=outputs/train/cosmos3_nano_libero_10/checkpoints/last/pretrained_model_ema。
  • --env.observation_height=256 --env.observation_width=256 は、トレーニングデータの解像度である 256x256 でカメラをレンダリングします。
  • LIBERO環境では、Cosmos3のアクション変換がプロセッサに自動的に追加されます。10次元のrot6dアクションは、LIBEROの7次元の軸角アクションに変換されます。lerobot-evalおよびシミュレーションロボットの外でポリシーを実行する場合は、lerobot.envs.factoryのmake_env_pre_post_processors(env_cfg, policy_cfg)を使用して、環境プロセッサを構築してください。
  • 評価プロトコルおよびその他のオプションについては、LIBEROガイドを参照してください。

予測された動画

Cosmos3 は、アクションとともに未来のフレームを予測します。--policy.save_predicted_video=true を渡すと、VAE によって各チャンクの予測動画がデコードされ、レンダリングされた eval_episode_*.mp4 ビデオの隣に pred_episode_*.mp4 が書き出されます。

Cosmos3 EdgeがLIBERO-10タスク「黒いボウルをキャビネットの下の引き出しに入れ、閉じる」を実行する様子。左: ロールアウトのサードパーソン視点と手首の観測値。右: ポリシーによって予測された動画。現在の観測値から16アクションごとに再サンプリングされている。

結果

LIBERO

モデルLibero-SpatialLibero-ObjectLibero-GoalLibero-10平均
Cosmos3-Nano-Policy-LIBERO98.0% (490/500)99.4% (497/500)97.4% (487/500)96.8% (484/500)97.90%
Cosmos3-Edge-Policy-LIBERO98.6% (493/500)99.4% (497/500)97.2% (486/500)96.6% (483/500)97.95%
Cosmos3-Nano-Policy-LIBERO_10N/AN/AN/A97.6% (488/500)97.60%
Cosmos3-Edge-Policy-LIBERO_10N/AN/AN/A95.2% (476/500)95.20%
Cosmos-Nano-TechReportN/AN/AN/A97.4%97.40%

LIBEROにおけるクローズドループの成功率。Cosmos3-Nano-Policy-LIBEROとCosmos3-Edge-Policy-LIBEROは、4つのLIBEROスイートで学習されています(lerobot/Cosmos3-Nano-Policy-LIBERO、lerobot/Cosmos3-Edge-Policy-LIBERO)。Cosmos3-Nano-Policy-LIBERO_10とCosmos3-Edge-Policy-LIBERO_10は、LIBERO-10のみで学習されています(lerobot/Cosmos3-Nano-Policy-LIBERO_10、lerobot/Cosmos3-Edge-Policy-LIBERO_10)。また、Cosmos3-Nano-Policy-LIBERO_10の学習設定は、技術レポートに記載されているLIBERO-10のレシピに従っています。Cosmos-Nano-TechReportは、技術レポートのTable 20に報告されている、LIBERO-10のみで学習されたCosmos3 NanoのLIBERO-10成功率です(MT-init、イテレーション2000、500ロールアウト)。

引用

@techreport{nvidia2026cosmos3,
  title  = {Cosmos 3: Omnimodal World Models for physical AI},
  author = {{NVIDIA Cosmos Team}},
  year   = {2026},
  url    = {https://research.nvidia.com/labs/cosmos-lab/cosmos3/technical-report.pdf}
}

ライセンス

LeRobotの実装は、LeRobotのApache 2.0 Licenseに従います。Cosmos3の重みとネイティブコードは、OpenMDW-1.1 Licenseの下で公開されています。

Update on GitHub