File size: 1,977 Bytes
9f818c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: OpenMDW-1.1

"""Export config to yaml file."""

from cosmos_framework.inference.common.init import init_script

init_script(
    env={
        "COSMOS_TRAINING": "1",
        "COSMOS_DEVICE": "cpu",
    }
)

from typing import Annotated

import pydantic
import tyro

from cosmos_framework.inference.common.args import ConfigOverrides, ResolvedPath, tyro_cli
from cosmos_framework.inference.common.config import InvalidMode, serialize_config_dict, unstructure_config


class Args(pydantic.BaseModel):
    output_file: Annotated[ResolvedPath, tyro.conf.arg(aliases=("-o",))]
    config: tyro.conf.OmitArgPrefixes[ConfigOverrides] = ConfigOverrides.model_construct()

    invalid: InvalidMode = "error"
    """How to handle unknown field types."""
    config_key: str | None = None
    """Config key to export."""


def export_config(args: Args):
    config_args = args.config.build_config()
    if args.output_file.suffix not in [".yaml", ".yml"]:
        raise ValueError("Output file must have a .yaml or .yml extension")

    config = config_args.load_config()

    # Extract key
    if args.config_key:
        for k in args.config_key.split("."):
            config = getattr(config, k)

    config_dict: dict = unstructure_config(config, invalid=args.invalid)

    # Re-create key structure
    if args.config_key:
        c: dict = config_dict
        for k in reversed(args.config_key.split(".")):
            config_dict = {k: c}
            c = config_dict

    # Add metadata
    assert "_metadata" not in config_dict
    config_dict["_metadata"] = {
        "args": config_args.model_dump(mode="json"),
    }

    serialize_config_dict(config_dict, args.output_file)
    print(f"Saved config to {args.output_file}")


def main():
    args = tyro_cli(Args, description=__doc__)
    export_config(args)


if __name__ == "__main__":
    main()