LeRobot documentation
Cosmos3
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潜在変数とアクショントークンを読み取ります。両方のパスに対して双方向にアテンションを適用し、フローマッチングで学習されます。
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 Nano | Cosmos3 Edge | |
|---|---|---|
| ポリシータイプ | cosmos3_nano | cosmos3_edge |
| パラメータ(デフォルトで学習) | 16.5B (7.0B) | 4.6B (1.4B) |
| Backbone | Qwen3-VLから初期化されたMoT、36層、隠れサイズ4096 | MoTは、28層、隠れサイズ2048の密な2B Transformer |
| トークナイザ | nvidia/Cosmos3-Nano | nvidia/Cosmos3-Edge |
| ベースチェックポイント | lerobot/Cosmos3-Nano | lerobot/Cosmos3-Edge |
インストール要件
LeRobotのインストールは、インストールガイドに従って行ってください。
Cosmos3の依存関係をインストールします:
pip install -e ".[cosmos3]"PyPIからLeRobotをインストールした場合は:
pip install 'lerobot[cosmos3]'ワークフローに必要な追加パッケージを追加します:
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-Nano | Nano | nvidia/Cosmos3-Nano のリリース | ファインチューニングのベース |
| lerobot/Cosmos3-Edge | エッジ | nvidia/Cosmos3-Edge のリリース | ファインチューニングのベース |
| lerobot/Cosmos3-Nano-Policy-LIBERO | Nano | lerobot/LIBERO-Cosmos3 | LIBERO評価 |
| lerobot/Cosmos3-Edge-Policy-LIBERO | エッジ | lerobot/LIBERO-Cosmos3 | LIBERO評価 |
| lerobot/Cosmos3-Nano-Policy-LIBERO_10 | Nano | lerobot/LIBERO_10-Cosmos3 | LIBERO-10の評価 |
| lerobot/Cosmos3-Edge-Policy-LIBERO_10 | エッジ | lerobot/LIBERO_10-Cosmos3 | LIBERO-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データで学習します:
- lerobot/LIBERO-Cosmos3: 4つのスイート(Spatial、Object、Goal、10)、1693エピソード。
- lerobot/LIBERO_10-Cosmos3: LIBERO-10 のみ、379 エピソード。
どちらもネイティブレシピのデータである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=true4つのスイートには--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=8 | 8つの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_*_steps | LeRobot はループのステップ数(マイクロバッチ)をカウントし、オプティマイザーの更新回数をカウントしません。ネイティブレシピのイテレーション数(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で測定した結果:
| セットアップ | GPU | GPUごとのバッチ | GPUごとのピークメモリ |
|---|---|---|---|
| Nano、フルファインチューニング(FSDP2) | 8 | 32 | 38 GB |
| Nano、LoRA | 1 | 4 | 64 GB |
| エッジ、フルファインチューニング | 1 | 32 | 47 GB |
| Edge, LoRA | 1 | 8 | 21 GB |
| bfloat16、Nano、Edgeでの評価 | 1 | 10つの環境 | 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-Spatial | Libero-Object | Libero-Goal | Libero-10 | 平均 |
|---|---|---|---|---|---|
| Cosmos3-Nano-Policy-LIBERO | 98.0% (490/500) | 99.4% (497/500) | 97.4% (487/500) | 96.8% (484/500) | 97.90% |
| Cosmos3-Edge-Policy-LIBERO | 98.6% (493/500) | 99.4% (497/500) | 97.2% (486/500) | 96.6% (483/500) | 97.95% |
| Cosmos3-Nano-Policy-LIBERO_10 | N/A | N/A | N/A | 97.6% (488/500) | 97.60% |
| Cosmos3-Edge-Policy-LIBERO_10 | N/A | N/A | N/A | 95.2% (476/500) | 95.20% |
| Cosmos-Nano-TechReport | N/A | N/A | N/A | 97.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