dwehr's picture
Migrate action viewer to local Cosmos generation
9f818c5
Raw
History Blame Contribute Delete
6.29 kB
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: OpenMDW-1.1
import json
from pathlib import Path
import omegaconf
import pydantic
import pytest
from typing_extensions import TYPE_CHECKING
from cosmos_framework.inference.args import (
DEFAULT_CHECKPOINT_NAME,
MODEL_MEMORY_BYTES_BY_SIZE,
ModelMode,
OmniSampleOverrides,
OmniSetupOverrides,
)
from cosmos_framework.inference.common.config import structure_config
if TYPE_CHECKING:
from cosmos_framework.model.vfm.omni_mot_model import OmniMoTModel
_H100_MEMORY_BYTES = 80 * 1024**3
# Reserved for future use (paired with the reserved memory-based `_get_dp_shard_size`
# heuristic in args.py); not currently exercised.
_GB200_MEMORY_BYTES = 192 * 1024**3
def test_build_parallelism(monkeypatch: pytest.MonkeyPatch):
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["8B"],
parallelism_preset="latency",
).build_parallelism(world_size=16, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.dp_shard_size == 16
assert parallelism_args.dp_replicate_size == 1
assert parallelism_args.cp_size == 8
assert parallelism_args.cfgp_size == 2
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["8B"],
parallelism_preset="throughput",
).build_parallelism(world_size=16, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.dp_shard_size == 16
assert parallelism_args.dp_replicate_size == 1
assert parallelism_args.cp_size == 1
assert parallelism_args.cfgp_size == 1
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["32B"],
parallelism_preset="latency",
).build_parallelism(world_size=16, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.dp_shard_size == 16
assert parallelism_args.dp_replicate_size == 1
assert parallelism_args.cp_size == 8
assert parallelism_args.cfgp_size == 2
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["32B"],
parallelism_preset="throughput",
).build_parallelism(world_size=16, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.dp_shard_size == 16
assert parallelism_args.dp_replicate_size == 1
assert parallelism_args.cp_size == 1
assert parallelism_args.cfgp_size == 1
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["32B"],
parallelism_preset="latency",
).build_parallelism(world_size=0, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.dp_shard_size == 1
assert parallelism_args.dp_replicate_size == 1
assert parallelism_args.cp_size == 1
assert parallelism_args.cfgp_size == 1
parallelism_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir="outputs",
model_memory_bytes=MODEL_MEMORY_BYTES_BY_SIZE["8B"],
parallelism_preset="latency",
compile_dynamic=False,
).build_parallelism(world_size=16, device_memory_bytes=_H100_MEMORY_BYTES)
assert parallelism_args.compile_dynamic is False
def test_checkpoints():
for name, ckpt in OmniSetupOverrides.CHECKPOINTS.items():
assert ckpt.hf.repository.split("/")[0] == "nvidia"
# Download a file to ensure that the repository/revision is valid.
# (The published checkpoint.json no longer encodes the source S3 URI —
# it is empty for most checkpoints and a stale local path for the rest —
# so we only validate that the repo/revision resolves and parses.)
ckpt_hf = ckpt.hf.model_copy(update=dict(include=("checkpoint.json",)))
json.loads((Path(ckpt_hf.download()) / "checkpoint.json").read_text())
def test_setup_args(tmp_path: Path):
overrides = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir=tmp_path / "outputs",
)
args = overrides.build_setup()
def check_model_equal(actual: pydantic.BaseModel, expected: pydantic.BaseModel):
# Check json first, since the pytest failure diff is more readable.
assert actual.model_dump() == expected.model_dump()
assert actual == expected
# Check idempotent
check_model_equal(overrides.build_setup(), args)
check_model_equal(OmniSetupOverrides.model_validate(args.model_dump()).build_setup(), args)
def test_sample_args(tmp_path: Path):
setup_args = OmniSetupOverrides(
checkpoint_path=DEFAULT_CHECKPOINT_NAME,
output_dir=tmp_path / "outputs",
).build_setup()
model_dict: "OmniMoTModel" = structure_config(
setup_args.load_model_config_dict(),
omegaconf.DictConfig,
)
# Check that all fields are optional
for name, field in OmniSampleOverrides.model_fields.items():
assert field.default is None, name
overrides = OmniSampleOverrides(
name="test",
)
overrides.output_dir = tmp_path / "inputs"
args = overrides.build_sample(model_config=model_dict.config)
# Check idempotent
assert overrides.build_sample(model_config=model_dict.config) == args
overrides_dump = {k: v for k, v in args.model_dump().items() if k in OmniSampleOverrides.model_fields}
assert OmniSampleOverrides.model_validate(overrides_dump).build_sample(model_config=model_dict.config) == args
text2image_args = OmniSampleOverrides(
name="text2image",
output_dir=tmp_path / "text2image",
model_mode=ModelMode.TEXT2IMAGE,
).build_sample(model_config=model_dict.config)
assert text2image_args.aspect_ratio == "1,1"
assert text2image_args.num_steps == 50
assert text2image_args.guidance == 4.0
assert text2image_args.shift == 3.0