Spaces:
Running on L40S
Running on L40S
| # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
| # SPDX-License-Identifier: OpenMDW-1.1 | |
| import functools | |
| import re | |
| import shutil | |
| from pathlib import Path | |
| from uuid import uuid4 | |
| import pydantic | |
| from cosmos_framework.inference.common.config import CONFIG_DIR | |
| from cosmos_framework.utils.checkpoint_db import ( | |
| CheckpointConfig, | |
| CheckpointDirHf, | |
| CheckpointDirS3, | |
| CheckpointFileHf, | |
| CheckpointFileS3, | |
| RepositoryType, | |
| register_checkpoint, | |
| ) | |
| from cosmos_framework.utils.flags import TRAINING | |
| _AVAE_LEGACY_CKPT_NAME = "avae_48k_noncausal_25hz_64ch.ckpt" | |
| _AVAE_LEGACY_JSON_NAME = "avae_48k_noncausal_25hz_64ch.json" | |
| # Inside a residual unit the legacy nn.Sequential layout is [snake1, conv1, | |
| # snake2, conv2]; map the named diffusers attribute back to its sub-index. | |
| _AVAE_RES_UNIT_INNER_INDEX = {"snake1": 0, "conv1": 1, "snake2": 2, "conv2": 3} | |
| def _avae_block_key_to_legacy(key: str, num_blocks: int) -> str: | |
| """Map a diffusers OobleckDecoder key (`decoder.block.*`) back to the legacy | |
| nn.Sequential layout (`decoder.layers.*`) the native AVAE loader expects. | |
| Exact inverse of ``_sound_tokenizer_remap_flat_layout`` in | |
| ``cosmos_framework/scripts/_convert_model_to_diffusers.py``. The legacy decoder | |
| is ``Sequential([conv1, block_0..block_{N-1}, snake1, conv2])``; each block is | |
| ``Sequential([snake1, conv_t1, res_unit1, res_unit2, res_unit3])`` and each | |
| residual unit is ``Sequential([snake1, conv1, snake2, conv2])``. | |
| """ | |
| snake1_idx = num_blocks + 1 | |
| conv2_idx = num_blocks + 2 | |
| m = re.fullmatch(r"decoder\.block\.(\d+)\.res_unit(\d+)\.(snake1|conv1|snake2|conv2)\.(.+)", key) | |
| if m: | |
| block_idx, res_idx, inner, rest = int(m.group(1)), int(m.group(2)), m.group(3), m.group(4) | |
| return f"decoder.layers.{block_idx + 1}.layers.{res_idx + 1}.layers.{_AVAE_RES_UNIT_INNER_INDEX[inner]}.{rest}" | |
| m = re.fullmatch(r"decoder\.block\.(\d+)\.snake1\.(.+)", key) | |
| if m: | |
| return f"decoder.layers.{int(m.group(1)) + 1}.layers.0.{m.group(2)}" | |
| m = re.fullmatch(r"decoder\.block\.(\d+)\.conv_t1\.(.+)", key) | |
| if m: | |
| return f"decoder.layers.{int(m.group(1)) + 1}.layers.1.{m.group(2)}" | |
| m = re.fullmatch(r"decoder\.conv1\.(.+)", key) | |
| if m: | |
| return f"decoder.layers.0.{m.group(1)}" | |
| m = re.fullmatch(r"decoder\.snake1\.(.+)", key) | |
| if m: | |
| return f"decoder.layers.{snake1_idx}.{m.group(1)}" | |
| m = re.fullmatch(r"decoder\.conv2\.(.+)", key) | |
| if m: | |
| return f"decoder.layers.{conv2_idx}.{m.group(1)}" | |
| return key | |
| def _materialize_avae_ckpt(local_dir: str) -> None: | |
| """Synthesize the legacy ``.ckpt`` + ``.json`` the native AVAE loader expects | |
| from the decoder-only ``sound_tokenizer/`` safetensors. | |
| The new HF layout ships ``sound_tokenizer/{config.json, | |
| diffusion_pytorch_model.safetensors}`` in the diffusers OobleckDecoder layout | |
| (``decoder.block.*`` keys, Snake1d ``alpha``/``beta`` shaped ``[1, C, 1]``). The | |
| native loader in ``cosmos_framework/model/vfm/tokenizers/audio/avae.py`` builds an | |
| ``nn.Sequential`` decoder keyed ``decoder.layers.*`` with Snake params shaped | |
| ``[C]`` and loads via ``load_state_dict(strict=False)`` — so without remapping | |
| the keys, none match and every decoder weight is silently left at init (noise). | |
| We invert the forward conversion (key remap + snake reshape) and wrap the result | |
| under ``state_dict``. Decoder-only is sufficient: generation only decodes sound | |
| latents to a waveform. Idempotent. | |
| """ | |
| import torch | |
| from safetensors.torch import load_file | |
| local = Path(local_dir) | |
| ckpt_path = local / _AVAE_LEGACY_CKPT_NAME | |
| json_path = local / _AVAE_LEGACY_JSON_NAME | |
| if ckpt_path.exists() and json_path.exists(): | |
| return | |
| safetensors_path = local / "diffusion_pytorch_model.safetensors" | |
| if not safetensors_path.exists(): | |
| safetensors_path = local / "model.safetensors" | |
| config_path = local / "config.json" | |
| if not safetensors_path.exists() or not config_path.exists(): | |
| raise FileNotFoundError( | |
| f"AVAE shim: expected diffusion_pytorch_model.safetensors (or model.safetensors) " | |
| f"and {config_path.name} in {local}" | |
| ) | |
| src = load_file(str(safetensors_path)) | |
| block_ids = {int(m.group(1)) for k in src if (m := re.fullmatch(r"decoder\.block\.(\d+)\..+", k))} | |
| if not block_ids: | |
| raise RuntimeError(f"No `decoder.block.*` keys in {safetensors_path}; cannot remap AVAE decoder.") | |
| num_blocks = max(block_ids) + 1 | |
| state_dict: dict = {} | |
| for key, value in src.items(): | |
| legacy_key = _avae_block_key_to_legacy(key, num_blocks) | |
| if (legacy_key.endswith(".alpha") or legacy_key.endswith(".beta")) and value.ndim == 3: | |
| value = value.reshape(-1).contiguous() # Snake1d [1, C, 1] -> [C] | |
| state_dict[legacy_key] = value | |
| if any(k.startswith("decoder.block.") for k in state_dict): | |
| raise RuntimeError("`decoder.block.*` keys remain after AVAE remap; conversion is incomplete.") | |
| if not ckpt_path.exists(): | |
| torch.save({"state_dict": state_dict}, str(ckpt_path)) | |
| if not json_path.exists(): | |
| shutil.copyfile(str(config_path), str(json_path)) | |
| def register_checkpoints(): | |
| """Register checkpoints used in hydra configs (tokenizers, VLM).""" | |
| for repository, revision in [ | |
| ("Qwen/Qwen3-0.6B", "c1899de289a04d12100db370d81485cdf75e47ca"), | |
| ("Qwen/Qwen3-VL-2B-Instruct", "89644892e4d85e24eaac8bacfd4f463576704203"), | |
| ("Qwen/Qwen3-VL-8B-Instruct", "0c351dd01ed87e9c1b53cbc748cba10e6187ff3b"), | |
| ("Qwen/Qwen3-VL-32B-Instruct", "0cfaf48183f594c314753d30a4c4974bc75f3ccb"), | |
| ]: | |
| for s3_prefix in [ | |
| # 'cosmos_framework.configs.base.defaults.vlm.download_tokenizer_files' | |
| "cosmos3/pretrained/huggingface", | |
| # 'cosmos_framework.utils.vfm.vlm.pretrained_models_downloader.maybe_download_hf_model_from_s3' | |
| "cosmos_reason2/hf_models", | |
| ]: | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name=repository, | |
| s3=CheckpointDirS3( | |
| uri=f"s3://bucket/{s3_prefix}/{repository}", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository=repository, | |
| revision=revision, | |
| include=() if TRAINING else ("*.json", "*.txt"), | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name="Cosmos3-Reasoner-8B-Private", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket/cosmos3/pretrained/huggingface/Cosmos-Reason/Cosmos3-Reasoner-8B-Private", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Nano-Reasoner", | |
| revision="6406357cdc32fbf8db5f51ff7992343803b06961", | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name="Cosmos3-Reasoner-32B-Private", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket/cosmos3/pretrained/huggingface/Cosmos-Reason/Cosmos3-Reasoner-32B-Private", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Super-Reasoner", | |
| revision="b9b716f3508dfa442e0c8ba32fb5d0c9adf2a32c", | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid="c5236e3a-e846-49e3-a40c-67dfceefff5d", | |
| name="Cosmos3-Nano-Reasoner-bb9c6f5", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket/cosmos3/pretrained/huggingface/Cosmos-Reason/Cosmos3-Nano-Reasoner-bb9c6f5", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Experimental", | |
| subdirectory="c5236e3a-e846-49e3-a40c-67dfceefff5d", | |
| revision="6ca42c5d0b96cb133e811c1bcced048d4acfaa12", | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid="4cb0c125-49a8-4e66-aebb-06e100affdb0", | |
| name="Cosmos3-Super-Reasoner-b6df0d1", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket/cosmos3/pretrained/huggingface/Cosmos-Reason/Cosmos3-Super-Reasoner-b6df0d1", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Experimental", | |
| subdirectory="4cb0c125-49a8-4e66-aebb-06e100affdb0", | |
| revision="6ca42c5d0b96cb133e811c1bcced048d4acfaa12", | |
| ), | |
| ) | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name="Wan2.1/vae", | |
| s3=CheckpointFileS3( | |
| uri="s3://bucket/pretrained/tokenizers/video/wan2pt1/Wan2.1_VAE.pth", | |
| ), | |
| hf=CheckpointFileHf( | |
| repository="Wan-AI/Wan2.1-T2V-14B", | |
| revision="a064a6c71f5be440641209c07bf2a5ce7a2ff5e4", | |
| filename="Wan2.1_VAE.pth", | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name="Wan2.2/vae", | |
| s3=CheckpointFileS3( | |
| uri="s3://bucket/pretrained/tokenizers/video/wan2pt2/Wan2.2_VAE.pth", | |
| ), | |
| hf=CheckpointFileHf( | |
| repository="Wan-AI/Wan2.2-TI2V-5B", | |
| revision="921dbaf3f1674a56f47e83fb80a34bac8a8f203e", | |
| filename="Wan2.2_VAE.pth", | |
| ), | |
| ), | |
| ) | |
| register_checkpoint( | |
| CheckpointConfig( | |
| uuid=uuid4().hex, | |
| name="AVAE", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket/pretrained/tokenizers/audio/avae", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Nano", | |
| revision="main", | |
| subdirectory="sound_tokenizer", | |
| ), | |
| # The sound_tokenizer/ safetensors are decoder-only and use the diffusers | |
| # OobleckDecoder key layout; _materialize_avae_ckpt remaps them back to the | |
| # legacy decoder.layers.* layout the native AVAE loader expects. | |
| post_download=_materialize_avae_ckpt, | |
| ), | |
| ) | |
| CHECKPOINTS: dict[str, CheckpointConfig] = { | |
| # Created using 'convert_model_to_dcp' | |
| "Cosmos3-Nano-Train": CheckpointConfig( | |
| name="Cosmos3-Nano-Train", | |
| uuid=uuid4().hex, | |
| config_file=str(CONFIG_DIR / "model/Cosmos3-Nano.yaml"), | |
| experiment="cosmos3_ga_16bm8b_v1_midtrain", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket1/cosmos3_vfm/cosmos3_ga_midtraining/cosmos3_ga_16bm8b_v1_midtrain/checkpoints/iter_000012000/", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Experimental", | |
| revision="a3743aa1092fbefc9c6f6ae8c8c17e56a78aea4b", | |
| subdirectory="e77a607f-af13-4321-bbf5-92f3e90f05e1-train", | |
| ), | |
| ), | |
| "Cosmos3-Super-Train": CheckpointConfig( | |
| name="Cosmos3-Super-Train", | |
| uuid=uuid4().hex, | |
| config_file=str(CONFIG_DIR / "model/Cosmos3-Super.yaml"), | |
| experiment="cosmos3_ga_64bm32b_v1_midtrain", | |
| s3=CheckpointDirS3( | |
| uri="s3://bucket1/cosmos3_vfm/cosmos3_ga_midtraining/cosmos3_ga_64bm32b_v1_midtrain/checkpoints/iter_000005000/", | |
| ), | |
| hf=CheckpointDirHf( | |
| repository="nvidia/Cosmos3-Experimental", | |
| revision="a3743aa1092fbefc9c6f6ae8c8c17e56a78aea4b", | |
| subdirectory="d92be19a-42ab-4a96-bdf2-98d1c9724cd9-train", | |
| ), | |
| ), | |
| } | |
| """Checkpoints used by tests.""" | |
| class DatasetConfig(pydantic.BaseModel): | |
| model_config = pydantic.ConfigDict(extra="forbid", frozen=True) | |
| hf: CheckpointDirHf | |
| """Config for dataset on Hugging Face.""" | |
| DATASETS = { | |
| "nvidia/BridgeData2-Subset-Synthetic-Captions": DatasetConfig( | |
| hf=CheckpointDirHf( | |
| repository_type=RepositoryType.DATASET, | |
| repository="nvidia/BridgeData2-Subset-Synthetic-Captions", | |
| revision="40d018ac1c1a2a4b9734f17fdb21f3d933c49a01", | |
| subdirectory="sft_dataset_bridge", | |
| ), | |
| ), | |
| "nvidia/LIBERO_LeRobot_v3": DatasetConfig( | |
| hf=CheckpointDirHf( | |
| repository_type=RepositoryType.DATASET, | |
| repository="nvidia/LIBERO_LeRobot_v3", | |
| revision="ddc1edeb6e51e2b7d4d2ba7a1433daaecd37aa64", | |
| ), | |
| ), | |
| "nvidia/bridge_lerobot_v3": DatasetConfig( | |
| hf=CheckpointDirHf( | |
| repository_type=RepositoryType.DATASET, | |
| repository="nvidia/bridge_lerobot_v3", | |
| revision="b887e193b141f2fe5b6e3d567577aa51c475693b", | |
| ), | |
| ), | |
| } | |
| """Datasets used by tests.""" | |