| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """ |
| Convert a NeMo 2.0 checkpoint to NeMo 1.0 for TRTLLM export. |
| Example to run this conversion script: |
| ``` |
| python /opt/NeMo/scripts/scripts/export/convert_nemo2_for_export.py \ |
| --input_path /path/to/nemo2/ckpt \ |
| --output_path /path/to/output \ |
| --tokenizer_type huggingface \ |
| --tokenizer_name meta-llama/Llama-3.1-8B \ |
| --symbolic_link=True |
| ``` |
| """ |
|
|
| import os |
| import shutil |
| from argparse import ArgumentParser |
|
|
| from omegaconf import OmegaConf |
|
|
| from nemo.lightning import io |
|
|
|
|
| def get_args(): |
| parser = ArgumentParser() |
| parser.add_argument( |
| "--input_path", |
| type=str, |
| required=True, |
| help="Path to nemo 2.0 checkpoint", |
| ) |
| parser.add_argument( |
| "--output_path", |
| type=str, |
| required=True, |
| help="Output path", |
| ) |
| parser.add_argument( |
| "--tokenizer_type", |
| type=str, |
| default="huggingface", |
| help="Type of tokenizer", |
| ) |
| parser.add_argument( |
| "--tokenizer_name", |
| type=str, |
| default="meta-llama/Meta-Llama-3.1-8B", |
| help="Name or path of tokenizer", |
| ) |
| parser.add_argument( |
| "--symbolic_link", |
| type=bool, |
| default=True, |
| help="Whether to use symbiloc link for model weights", |
| ) |
|
|
| args = parser.parse_args() |
| return args |
|
|
|
|
| def main(args): |
| input_path = args.input_path |
| output_path = args.output_path |
| weight_path = os.path.join(output_path, "model_weights") |
|
|
| if os.path.exists(output_path): |
| shutil.rmtree(output_path) |
| print(f"Remove existing {output_path}") |
|
|
| os.makedirs(output_path, exist_ok=True) |
|
|
| config = io.load_context(input_path, subpath="model.config") |
|
|
| config_dict = {} |
| for k, v in config.__dict__.items(): |
| if isinstance(v, (float, int, str, bool)): |
| config_dict[k] = v |
| elif k == "activation_func": |
| config_dict["activation"] = v.__name__ |
|
|
| if config_dict.get("num_moe_experts") is None: |
| config_dict["num_moe_experts"] = 0 |
| config_dict["moe_router_topk"] = 0 |
| if config_dict["activation"] == "silu": |
| config_dict["activation"] = "fast-swiglu" |
|
|
| config_dict["mcore_gpt"] = True |
| config_dict["max_position_embeddings"] = config_dict.get("seq_length") |
| config_dict["tokenizer"] = { |
| "library": args.tokenizer_type, |
| "type": args.tokenizer_name, |
| "use_fast": True, |
| } |
|
|
| yaml_config = OmegaConf.create(config_dict) |
| OmegaConf.save(config=yaml_config, f=os.path.join(output_path, "model_config.yaml")) |
|
|
| if args.symbolic_link: |
| os.symlink(input_path, weight_path) |
| else: |
| os.makedirs(weight_path, exist_ok=True) |
| for file in os.listdir(input_path): |
| source_path = os.path.join(input_path, file) |
| target_path = os.path.join(weight_path, file) |
| shutil.copy(source_path, target_path) |
|
|
|
|
| if __name__ == "__main__": |
| args = get_args() |
| main(args) |
|
|