当前位置: 首页 > news >正文

【SAM2代码解析】training部分代码详解-训练流程

2.1 初始化

在这里插入图片描述

  • initialize_config_module(“sam2”, version_base=“1.2”) ----> 初始化Hydra配置模块,并指定配置根目录为sam2(sam2目录应包含配置文件来定义模型、训练参数等),声明配置兼容Hydra1.2版本
  • 参数列表
    在这里插入图片描述

2.2 训练流程(main函数)

  • 1、读取sam2.1_hiera_b+_MOSE_finetune.yaml的内容,compose用于加载配置文件
    在这里插入图片描述
  • 2、创建日志文件夹,如果在配置文件中,experiment_log_dir为None则自动创建sam2_logs的文件夹,否则则按你设置的文件夹名创建。(注:这里自带的配置文件里,experiment_log_dir设置的null,如果你不改,那么就会报错,具体请看我主页的报错记录)在这里插入图片描述
  • 2.1、创建日志文件config.yaml并保存当前配置信息
    在这里插入图片描述
  • 3、输出配置细节,注意OmegaConf.to_yaml(cfg)的作用是将配置对象的内容转换成字符串
    在这里插入图片描述
  • 4、处理配置的解析版本
    • 将 OmegaConf 配置对象cfg转换为一个普通的 Python 容器(如字典或列表)。这使得配置可以被其他不支持 OmegaConf 的代码使用。然后又立马转换成配置对象,这样就得到了一个复制的cfg配置对象—cfg_resolved
      在这里插入图片描述
    • 将解析后的配置保存为 config_resolved.yaml 文件,(解析指的是将动态变量变为确定值)
      在这里插入图片描述
      在这里插入图片描述
  • 5、submitit日志记录设置,Submitit 日志​​是使用 Submitit 库提交集群任务时自动生成的记录文件,主要用于跟踪作业状态、调试错误和管理任务。
  • 6、优先使用命令行参数,如果命令行参数中指定了 num_gpus、num_nodes 或 use_cluster,则优先使用这些值,否则使用配置文件中的默认值。
    在这里插入图片描述
  • 7、判断是否使用集群,若是使用则要设置SLURM参数,并打印相关配置,提交任务等
  • 8、判断是否使用集群,若不使用则设置节点数量为1,随机生成一个主节点端口号,调用single_node_runner函数在本地运行任务
    在这里插入图片描述

总结:

  • 加载配置文件并设置实验日志目录。
  • 打印和保存配置文件。
  • 检查是否使用集群。
  • 如果使用集群,配置 SLURM 参数并提交任务。
  • 如果不使用集群,则在本地运行任务。

2.3 single_node_runner

  • 确保配置中指定的节点数量为 1。这是因为这个函数是为单节点训练设计的,如果节点数量不为 1,则会抛出断言错误。

assert cfg.launcher.num_nodes == 1

  • 获取GPU数量,这个值将决定需要启动多少个进程

num_proc = cfg.launcher.gpus_per_node

  • 设置多进程启动方法,设置pytorch多进程的启动方法为spawn

torch.multiprocessing.set_start_method(
“spawn”
) # CUDA runtime does not support fork
spawn 方法会重新启动一个 Python 解释器来运行子进程,这可以避免 CUDA 运行时的兼容性问题。

  • 单GPU情况下启动程序:single_proc_run(local_rank=0, main_port=main_port, cfg=cfg, world_size=num_proc)

2.4 single_proc_run

def single_proc_run(local_rank, main_port, cfg, world_size):# 单GOU进程的入口点,用于初始化分布式训练环境并运行训练任务# local_rank--当前进程的本地排名,表示当前GPU的索引(从0开始)# main_port--主节点端口号,用于进程间通信# cfg--配置对象,包含训练任务的配置信息# world_size--全局进程总数,表示所有节点上的GPU数量"""Single GPU process,PyTorch分布式训练所必需的,用于初始化分布式通信的后端"""os.environ["MASTER_ADDR"] = "localhost" #主节点的地址,用于分布式训练的通信os.environ["MASTER_PORT"] = str(main_port) #主节点的端口号,用于分布式训练的通信os.environ["RANK"] = str(local_rank) #当前进程的全局排名,表示当前进程在整个分布式环境中的索引。os.environ["LOCAL_RANK"] = str(local_rank) #当前进程的本地排名,表示当前GPU在当前节点上的索引os.environ["WORLD_SIZE"] = str(world_size) #全局进程总数,表示所有节点上的GPU数量try:register_omegaconf_resolvers()# 扩展 OmegaConf 的功能,使其能够处理更复杂的动态表达式。# 这些解析器允许在配置文件中直接进行数学运算、类型转换、类和方法的动态引用等操作,从而使配置文件更加灵活和强大except Exception as e:logging.info(e) #将异常对象 e 的信息记录到日志中,通常在发生异常时使用,以便于后续的问题排查和调试#instantiate用于根据配置实例化对象。参数 _recursive_=False 表示不递归实例化配置中的嵌套对象。trainer = instantiate(cfg.trainer, _recursive_=False)trainer.run()#调用训练器的 run 方法,启动训练任务

相关文章:

  • 基准指数选股策略思路
  • 从代码学习深度学习 - 微调 PyTorch 版
  • 工业相机——镜头篇【机器视觉,图像采集系统,成像原理,光学系统,成像光路,镜头光圈,镜头景深,远心镜头,分辨率,MTF曲线,焦距计算 ,子午弧矢】
  • BeeWorks Meet:私有化部署视频会议的高效选择
  • 【Linux】进程优先级和进程切换
  • 张 LLM提示词拓展16中方式
  • 线上图书借阅小程序源码介绍
  • 关于使用git init --bare 裸仓库的使用
  • 如何在奥维互动地图里加载星图云卫星地图
  • SiamFC 算法详解
  • Shell脚本-流程控制语句应用案例
  • 龙虎榜——20250425
  • Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
  • Python编程的真谛:超越语法,理解编程本质
  • 【金仓数据库征文】- 金融HTAP实战:KingbaseES实时风控与毫秒级分析一体化架构
  • mapbox高阶,使用本地dem数据、等高线面数据实现千里江山图效果
  • 如何建立员工培训体系?
  • Ollama 常见命令速览:本地大模型管理指南
  • 六、web自动化测试02
  • 跨境电商必看: Google AdSense 无效流量核心原因及解决措施
  • 云南鲁甸县一河滩突然涨水致4死,有人在救人过程中遇难
  • 《我的后半生》:人生下半场,也有活力重启的可能
  • 秦洪看盘|避险情绪升温,短线或延续相对钝化状态
  • 中华人民共和国和肯尼亚共和国关于打造新时代全天候中非命运共同体典范的联合声明
  • 法治日报:强制统一店铺广告牌匾事件何以频发?
  • 2024年我国数字阅读用户规模达6.7亿