跳转至

__main__.py — model_merger CLI 入口

源码路径:verl/model_merger/__main__.py

文件概述

这个文件是 model_merger 模块的命令行入口。当用户执行 python -m verl.model_merger merge ... 时,Python 会自动运行这个文件。它负责:

  1. 解析命令行参数
  2. 生成配置对象
  3. 根据后端类型(fsdp / megatron)实例化对应的 merger
  4. 执行合并并清理资源

关键代码讲解

入口函数 main()

def main():
    args = parse_args()
    config = generate_config_from_args(args)
    print(f"config: {config}")

    if config.backend == "fsdp":
        from .fsdp_model_merger import FSDPModelMerger
        merger = FSDPModelMerger(config)
    elif config.backend == "megatron":
        from .megatron_model_merger import MegatronModelMerger
        merger = MegatronModelMerger(config)
    else:
        raise NotImplementedError(f"Unknown backend: {config.backend}")

    merger.merge_and_save()
    merger.cleanup()

这段代码的逻辑非常清晰:

  1. parse_args():解析命令行参数,来自 base_model_merger.py
  2. generate_config_from_args(args):将命令行参数转换为 ModelMergerConfig 数据类,也来自 base_model_merger.py
  3. 工厂模式选择 merger:根据 config.backend 的值,延迟导入并实例化对应的 merger 类
  4. merge_and_save():执行实际的合并和保存操作
  5. cleanup():清理资源(如 Megatron 的分布式进程组)

为什么使用延迟导入?

注意 FSDPModelMerger 和 MegatronModelMerger 是在 if 分支内部导入的,而不是在文件顶部。这是因为: - Megatron 的导入需要 megatron-core 库,如果用户只用 FSDP 后端就不需要安装它 - 延迟导入避免了不必要的依赖加载,提高启动速度

文档字符串中的使用示例

文件开头的文档字符串给出了完整的命令行使用示例:

"""
To merge FSDP checkpoints:
python -m verl.model_merger merge \
    --backend fsdp \
    --local_dir checkpoints/.../actor \
    --target_dir /path/to/merged_hf_model

To merge Megatron checkpoints:
python -m verl.model_merger merge \
    --backend megatron \
    --tie-word-embedding \
    --local_dir checkpoints/.../actor \
    --target_dir /path/to/merged_hf_model
"""

核心类/函数列表

名称 类型 说明
main() 函数 CLI 入口函数,调度整个合并流程

与其他模块的关系

  • 从 base_model_merger.py 导入 generate_config_from_args 和 parse_args
  • 根据后端类型导入 FSDPModelMerger 或 MegatronModelMerger

小结

__main__.py 是整个 model_merger 模块的入口点,采用工厂模式根据用户选择的后端类型分发到对应的 merger 实现。代码简洁明了,核心逻辑就是"解析参数 → 选择 merger → 执行合并 → 清理"四步。