__main__.py — model_merger CLI 入口¶
源码路径:
verl/model_merger/__main__.py
文件概述¶
这个文件是 model_merger 模块的命令行入口。当用户执行 python -m verl.model_merger merge ... 时,Python 会自动运行这个文件。它负责:
- 解析命令行参数
- 生成配置对象
- 根据后端类型(fsdp / megatron)实例化对应的 merger
- 执行合并并清理资源
关键代码讲解¶
入口函数 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()
这段代码的逻辑非常清晰:
parse_args():解析命令行参数,来自base_model_merger.pygenerate_config_from_args(args):将命令行参数转换为ModelMergerConfig数据类,也来自base_model_merger.py- 工厂模式选择 merger:根据
config.backend的值,延迟导入并实例化对应的 merger 类 merge_and_save():执行实际的合并和保存操作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 → 执行合并 → 清理"四步。