Source code for nemo_automodel.config.cli

# Copyright (c) 2025, NVIDIA CORPORATION.  All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import sys

from nemo_automodel.config.loader import load_yaml_config, translate_value


[docs] def parse_cli_argv(cfg_path=None): """ Parses CLI args, pulls out --config and collects other --dotted.path options. Args: cfg_path (str, optional): Default config (yaml) path. Defaults to None. Raises: ValueError: if there's no --config and cfg_path = None ValueError: if there's --config but not yaml file passed Returns: (str, list[str]): the config path along with the config overrides. """ argv = sys.argv[1:] overrides = [] i = 0 while i < len(argv): tok = argv[i] # --config or -c if tok in ("--config", "-c"): if i + 1 >= len(argv): raise ValueError("Expected a path after --config") cfg_path = argv[i + 1] i += 2 continue # any other --option or --dotted.path if tok.startswith("--"): key = tok.lstrip("-") # case A) --key=val if "=" in key: overrides.append(f"{key}") i += 1 else: # case B) --key val # if next token exists and isn't another --..., take it as the value if i + 1 < len(argv) and not argv[i + 1].startswith("--"): val = argv[i + 1] overrides.append(f"{key}={val}") i += 2 else: # case C) bare --flag => True overrides.append(f"{key}=True") i += 1 continue # anything else we skip i += 1 if not cfg_path: raise ValueError("You must specify --config <path>") return cfg_path, overrides
[docs] def parse_args_and_load_config(cfg_path=None): """ Loads YAML, applies overrides via ConfigNode.set_by_dotted. """ cfg_path, overrides = parse_cli_argv(cfg_path) # load the base YAML cfg = load_yaml_config(cfg_path) # apply overrides for kv in overrides: dotted, val_str = kv.split("=", 1) cfg.set_by_dotted(dotted, translate_value(val_str)) return cfg