From 74f5e4a1fad5a578e5ecb3b47fe48dc98ba21ff2 Mon Sep 17 00:00:00 2001 From: Cyril Vallez Date: Mon, 23 Jun 2025 12:40:01 +0200 Subject: [PATCH] [modular] CLI allows positional arguments, and more defaults names for the optional arg (#38979) * More defaults * Update modular_model_converter.py --- docs/source/en/modular_transformers.md | 2 +- utils/modular_model_converter.py | 28 ++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/docs/source/en/modular_transformers.md b/docs/source/en/modular_transformers.md index 1cd8f0cbb1..1ead4fe926 100644 --- a/docs/source/en/modular_transformers.md +++ b/docs/source/en/modular_transformers.md @@ -24,7 +24,7 @@ A linter "unravels" the modular file into a `modeling.py` file to preserve the s Run the command below to automatically generate a `modeling.py` file from a modular file. ```bash -python utils/modular_model_converter.py --files_to_parse src/transformers/models//modular_.py +python utils/modular_model_converter.py --files-to-parse src/transformers/models//modular_.py ``` For example: diff --git a/utils/modular_model_converter.py b/utils/modular_model_converter.py index ae272de41f..ffd5b35cd7 100644 --- a/utils/modular_model_converter.py +++ b/utils/modular_model_converter.py @@ -1778,19 +1778,31 @@ def save_modeling_file(modular_file, converted_file): if __name__ == "__main__": parser = argparse.ArgumentParser() + # Same arg as both positional and optional, just for convenience parser.add_argument( + "files", + nargs="*", + help="A list of `modular_xxxx` files that should be converted to single model file", + ) + parser.add_argument( + "--files-to-parse", "--files_to_parse", + "--files", + "-f", default=["all"], nargs="+", help="A list of `modular_xxxx` files that should be converted to single model file", ) args = parser.parse_args() - if args.files_to_parse == ["all"]: - args.files_to_parse = glob.glob("src/transformers/models/**/modular_*.py", recursive=True) - if args.files_to_parse == ["examples"]: - args.files_to_parse = glob.glob("examples/**/modular_*.py", recursive=True) + # Both arg represent the same data, but as positional and optional + files_to_parse = args.files if len(args.files) > 0 else args.files_to_parse + + if files_to_parse == ["all"]: + files_to_parse = glob.glob("src/transformers/models/**/modular_*.py", recursive=True) + if files_to_parse == ["examples"]: + files_to_parse = glob.glob("examples/**/modular_*.py", recursive=True) else: - for i, model_name in enumerate(args.files_to_parse): + for i, model_name in enumerate(files_to_parse): if os.sep not in model_name: full_path = os.path.join("src", "transformers", "models", model_name, f"modular_{model_name}.py") # If it does not exist, try in the examples section @@ -1799,10 +1811,10 @@ if __name__ == "__main__": # We did not find it anywhere if not os.path.isfile(full_path): raise ValueError(f"Cannot find a modular file for {model_name}. Please provide the full path.") - args.files_to_parse[i] = full_path + files_to_parse[i] = full_path - priority_list, _ = find_priority_list(args.files_to_parse) - assert len(priority_list) == len(args.files_to_parse), "Some files will not be converted" + priority_list, _ = find_priority_list(files_to_parse) + assert len(priority_list) == len(files_to_parse), "Some files will not be converted" for file_name in priority_list: print(f"Converting {file_name} to a single model single file format")