ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

detectron2.solver 解析:VimDet 检测模型的优化器构建与学习率调度实战指南

detectron2.solver 解析:VimDet 检测模型的优化器构建与学习率调度实战指南 人工智能计算机视觉深度学习预训练微调【免费下载链接】Vim[ICML 2024] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model项目地址https://gitcode.com/gh_mirrors/vim2/Vim点击查看免费下载导读本文以当前仓库中 det/docs/modules/solver.rst 所指向的detectron2.solver模块为核心系统梳理它在 Vision MambaVim检测框架中的真实作用。你将掌握build_optimizer/build_lr_scheduler的完整调用链、WarmupMultiStepLR与WarmupCosineLR的参数含义并看懂 VimDet 100ep 训练配置中 AdamW 分层学习率衰减layer-wise lr decay的落地写法可直接迁移到自己的检测训练脚本中。一、模块定位solver 在检测训练管线中扮演什么角色solver是 detectron2 体系中负责怎么学的模块。在 Vision Mamba 检测仓库中训练一条 Mask R-CNN Vim 骨干的流水线由三部分协作完成模型modeling决定网络结构例如VisionMambaDet骨干det/detectron2/modeling/backbone/vim.py数据data决定喂什么样本solver决定优化器SGD/AdamW、学习率调度multi-step / cosine、warmup、梯度裁剪等训练动力学细节。solver的公开接口在 det/detectron2/solver/init.py 中统一导出共 7 个符号符号类型职责build_optimizer函数从配置构建优化器默认 SGD可叠加梯度裁剪build_lr_scheduler函数从配置构建学习率调度器get_default_optimizer_params函数生成带归一化层 / bias 特殊超参的参数字典列表LRMultiplier类用 fvcoreParamScheduler统一缩放所有参数组的学习率WarmupParamScheduler类在任意调度器前拼接一段 warmup 阶段WarmupMultiStepLR/WarmupCosineLR类旧版调度器已标记 deprecated建议改用LRMultiplier在 det/docs/modules/solver.rst 中该模块通过 Sphinx 的automodule指令自动生成 API 文档并作为 det/docs/modules/index.rst 中API Documentation的一节对外发布。文档是薄薄的一层壳真正的技术内容全部沉淀在detectron2/solver/目录下的两个实现文件里这也是本文重点展开的部分。二、优化器构建build_optimizer 与参数分组策略2.1 默认优化器是 SGD支持动态注入梯度裁剪build_optimizer的实现位于 det/detectron2/solver/build.py。它的逻辑非常直接调用get_default_optimizer_params生成参数分组组装torch.optim.SGD的超参lrBASE_LR、momentumMOMENTUM、nesterovNESTEROV、weight_decayWEIGHT_DECAY在 PyTorch ≥ 1.12 时自动开启foreachTrue利用多张量优化提升速度最后通过maybe_add_gradient_clipping判断是否需要包装优化器。其中第 4 步值得注意maybe_add_gradient_clippingbuild.py并不会真的修改优化器类而是用type()动态创建一个继承原优化器的子类只覆写step方法在调用super().step(closure)之前先执行裁剪闭包build.py。这种运行时生成子类的手法既避免了复制 PyTorch 优化器的大量代码也让裁剪逻辑对调用方完全透明。2.2 参数分组归一化层不衰减、bias 可选特殊处理get_default_optimizer_paramsbuild.py是参数分组的核心。默认策略等价于直接使用model.parameters()但它额外支持三类覆盖weight_decay_norm对归一化层BatchNorm1d/2d/3d、SyncBatchNorm、GroupNorm、InstanceNorm1d/2d/3d、LayerNorm、LocalResponseNorm单独设置 weight decay。代码中维护了一个norm_module_types元组build.py遍历model.named_modules()时按模块类型判断bias_lr_factor/weight_decay_bias为 bias 参数单独设置学习率倍数与衰减系数。源码注释明确指出这是 Detectron1 遗留的设置对现代模型没有发现实际用处not found useful默认bias_lr_factor1.0、weight_decay_biasNone即与普通权重完全一致build.pylr_factor_func/overrides按参数名做细粒度控制。lr_factor_func接收形如backbone.layers.0.mixer.xxx的完整参数名并返回学习率衰减系数overrides则是一个{参数名: {lr: ..., weight_decay: ...}}字典按模块参数名精确覆盖超参。参数分组的后处理也很有讲究_expand_param_groups先把一组多参展开为一参一组再经reduce_param_groupsbuild.py按超参组合重新聚类合并。源码注释解释了这个设计动机——参数组数量越少PyTorch 多张量优化器multi-tensor optimizer的融合效率越高。这两个内部函数的正确性由 det/tests/test_solver.py 中的testExpandParamsGroups与testReduceParamGroups单测保证例如测试验证了后声明的参数组可以覆盖先声明组的同名超参。三、学习率调度从旧版类到 LRMultiplier 的演进3.1 旧版调度器已弃用模块中保留的WarmupMultiStepLR与WarmupCosineLRdet/detectron2/solver/lr_scheduler.py在实例化时会打印 deprecation 警告WarmupMultiStepLR is deprecated! Use LRMultipilier with fvcore ParamScheduler instead!其内部数学可作理解基线multi-steplr base_lr * warmup_factor * gamma ** bisect_right(milestones, iter)即每越过一个 milestone 学习率乘以GAMMAcosinelr base_lr * warmup_factor * 0.5 * (1 cos(pi * iter / max_iters))即标准的半余弦衰减。_get_warmup_factor_at_iterlr_scheduler.py定义了 warmup 因子的两种形态constant模式下 warmup 期间恒定返回warmup_factorlinear模式下按warmup_factor * (1 - alpha) alpha其中alpha iter / warmup_iters从起点线性爬升到 1.0迭代数达到warmup_iters后返回 1.0。3.2 新架构LRMultiplier fvcore ParamScheduler新版调度把绝对学习率与相对缩放解耦。LRMultiplierlr_scheduler.py持有优化器中每个参数组的base_lr每步计算multiplier self._multiplier(self.last_epoch / self._max_iter) return [base_lr * multiplier for base_lr in self.base_lrs]其中self._multiplier是一个 fvcore 的ParamScheduler输入是归一化到[0, 1]的训练进度。这带来一个关键性质只要各参数组的相对比例在训练中不变一个调度器就能同时驱动所有参数组无需为每个参数组单独建调度器源码 docstring 中对此有明确讨论见 lr_scheduler.py。fvcore 调度器本身无状态因此LRMultiplier.state_dict只保存base_lrs与last_epoch两个字段即可完整续训lr_scheduler.py。WarmupParamSchedulerlr_scheduler.py则是继承CompositeParamScheduler的组合调度器它把[warmup段, 原调度器段]拼在一起warmup 段的长度比例是warmup_length结束值取scheduler(warmup_length)。rescale_intervalTrue时原调度器会在 warmup 结束后重新缩放区间使完整周期仍恰好落在剩余训练步数内否则原调度器按固定区间继续lr_scheduler.py。四、SOLVER 配置项全解直接对应 defaults.py 的 20 参数solver的所有配置都挂在SOLVER命名空间下默认值定义在 det/detectron2/config/defaults.py。以下按功能分组完整列出4.1 调度器与迭代数配置项默认值说明SOLVER.LR_SCHEDULER_NAMEWarmupMultiStepLR可选WarmupMultiStepLR、WarmupCosineLR、WarmupStepWithFixedGammaLR定义见 build.pySOLVER.MAX_ITER40000总训练迭代数SOLVER.GAMMA0.1multi-step 每次衰减的倍率SOLVER.STEPS(30000,)学习率按 GAMMA 衰减的迭代节点若含大于MAX_ITER的值会被忽略并告警build.pySOLVER.NUM_DECAYS3仅WarmupStepWithFixedGammaLR使用固定衰减次数4.2 学习率与动量配置项默认值说明SOLVER.BASE_LR0.001基础学习率SOLVER.BASE_LR_END0.0仅 cosine 调度使用即最终学习率build_lr_scheduler会断言BASE_LR_END / BASE_LR落在[0, 1]build.pySOLVER.MOMENTUM0.9SGD 动量SOLVER.NESTEROVFalse是否启用 Nesterov 动量4.3 权重衰减配置项默认值说明SOLVER.WEIGHT_DECAY0.0001全局权重衰减SOLVER.WEIGHT_DECAY_NORM0.0归一化层affine 变换参数的衰减默认不衰减SOLVER.BIAS_LR_FACTOR1.0bias 的学习率倍数Detectron1 遗留不建议修改SOLVER.WEIGHT_DECAY_BIASNonebias 的衰减None表示跟随WEIGHT_DECAY4.4 Warmup配置项默认值说明SOLVER.WARMUP_FACTOR1.0 / 1000warmup 起点相对初始学习率的比例SOLVER.WARMUP_ITERS1000warmup 持续迭代数会被min(iters / MAX_ITER, 1.0)归一化为相对长度build.pySOLVER.WARMUP_METHODlinearlinear或constantSOLVER.RESCALE_INTERVALFalsewarmup 后是否重缩放调度区间4.5 批量、断点与梯度裁剪配置项默认值说明SOLVER.IMS_PER_BATCH16所有机器上的总 batch 数每步看到的图像数SOLVER.REFERENCE_WORLD_SIZE0参考 GPU 数供DefaultTrainer.auto_scale_workers缩放相关配置SOLVER.CHECKPOINT_PERIOD5000每多少迭代存一次 checkpointSOLVER.CLIP_GRADIENTS.ENABLEDFalse是否开启梯度裁剪SOLVER.CLIP_GRADIENTS.CLIP_TYPEvaluevalue按元素绝对值裁剪或norm按每个参数梯度范数裁剪SOLVER.CLIP_GRADIENTS.CLIP_VALUE1.0裁剪阈值SOLVER.CLIP_GRADIENTS.NORM_TYPE2.0norm模式下的 L-p 范数L-inf 填.infSOLVER.AMP.ENABLEDFalse是否启用自动混合精度训练不影响推理行为这些配置项的组装逻辑全部集中在build_optimizer与build_lr_scheduler两个函数中是理解改配置 改行为的关键映射点。五、LazyConfig 时代的实战写法optim.py 与 coco_schedule.py新版配置系统LazyConfig不再用 YAML而是用 Python 文件直接构造对象。仓库提供了两个可直接复用的 solver 模板5.1 优化器模板 det/configs/common/optim.py该文件预置了两个懒加载LazyCall优化器SGD L(torch.optim.SGD)( paramsL(get_default_optimizer_params)(weight_decay_norm0.0), lr0.02, momentum0.9, weight_decay1e-4, ) AdamW L(torch.optim.AdamW)( paramsL(get_default_optimizer_params)( base_lr${..lr}, weight_decay_norm0.0, ), lr1e-4, betas(0.9, 0.999), weight_decay0.1, )要点params不是直接传参而是懒调用get_default_optimizer_params其中weight_decay_norm0.0保证了归一化层不衰减AdamW通过base_lr${..lr}引用上层lr实现一次改两处。VimDet 的 100ep 配置正是选用了AdamW路线见下一节。5.2 调度器模板 det/configs/common/coco_schedule.pydefault_X_scheduler(num_X)生成论文中常说的 1x / 2x / 3x 调度。它以 16 batch、共 1,440,000 张训练图约 12 个 COCO epoch为 1x 基准即total_steps_16bs num_X * 90000num_X 2时milestones 固定为[60000, 80000, 90000]等价于论文的 6/8/9 epoch 衰减点并注明调度器具有 scale-invariance 性质num_X 2时milestones 变为[total-60000, total-20000, total]即最后三次衰减始终对齐训练末尾。最终统一包一层WarmupParamSchedulerwarmup_length1000/total_steps_16bs、warmup_methodlinear、warmup_factor0.001。文件末尾直接导出lr_multiplier_1x/2x/3x/6x/9x五个预设。六、VimDet 实战Vision Mamba 检测模型的 solver 配置全貌Vision MambaICML 2024在检测任务中的落地配置 det/projects/ViTDet/configs/COCO/mask_rcnn_vimdet_b_100ep.py 完整展示了新版 solver 的用法from fvcore.common.param_scheduler import MultiStepParamScheduler from detectron2 import model_zoo from detectron2.config import LazyCall as L from detectron2.solver import WarmupParamScheduler from detectron2.modeling.backbone.vim import get_vim_lr_decay_rate # 调度100 ep 184375 iters * 64 images/iter / 118000 images/ep train.max_iter 184375 lr_multiplier L(WarmupParamScheduler)( schedulerL(MultiStepParamScheduler)( values[1.0, 0.1, 0.01], milestones[163889, 177546], num_updatestrain.max_iter, ), warmup_length250 / train.max_iter, warmup_factor0.001, ) # 优化器AdamW 分层学习率衰减 optimizer model_zoo.get_config(common/optim.py).AdamW optimizer.params.lr_factor_func partial(get_vim_lr_decay_rate, num_layers24, lr_decay_rate0.7) optimizer.params.overrides {pos_embed: {weight_decay: 0.0}}6.1 调度multi-step 在末尾衰减两次milestones[163889, 177546]对应训练进度 88.9% 与 96.3%即最后约 11% 的迭代内学习率连降两档×0.1、×0.01这是 Rethinking ImageNet Pre-training 风格的末段衰减策略与coco_schedule.py中num_X 2的里程碑对齐逻辑一致。6.2 优化器AdamW 分层学习率衰减get_vim_lr_decay_rate定义在 det/detectron2/modeling/backbone/vim.py是 Vim 骨干训练的关键机制。它按参数名推算所在层号backbone.pos_embed/backbone.patch_embed→layer_id 0享受最大学习率backbone.layers.N.xxx且不在.residual.中→layer_id N 1其余参数 →layer_id num_layers 1。衰减系数为lr_decay_rate ** (num_layers 1 - layer_id)配合配置中的lr_decay_rate0.7、num_layers24浅层靠近输入学习率被压低深层保持较高学习率这与 ViT 系模型浅层学通用特征、深层学任务特征的经验一致。同时overrides {pos_embed: {weight_decay: 0.0}}让位置编码不参与权重衰减。这两者正是 build.py 中lr_factor_func与overrides两个参数的真实生产用法。6.3 验证单测确认调度数学det/tests/test_scheduler.py 用lr5的 SGD 逐步驱动调度器并断言每个迭代的学习率序列例如test_warmup_multistep验证 warmup 线性爬升0.005 → 1.004 → 2.003 → 3.002 → 4.001 → 5.0以及 milestone 处 ×0.1 的精确跳变test_warmup_cosine_end_value则断言 cosine 调度收敛到BASE_LR_END。这些测试同时覆盖了LRMultiplierWarmupParamScheduler的新式组合与WarmupStepWithFixedGammaLR含rescale_intervalTrue等边界行为可作为自定义调度器时对照验证的参考。七、从零配置一份自己的 Vim 检测训练最小完整示例综合前文一份可运行的最小 LazyConfig solver 片段如下参考 det/configs/common/optim.py 与 det/projects/ViTDet/configs/COCO/mask_rcnn_vimdet_b_100ep.pyfrom functools import partial from fvcore.common.param_scheduler import MultiStepParamScheduler from detectron2.config import LazyCall as L from detectron2.solver import WarmupParamScheduler from detectron2.modeling.backbone.vim import get_vim_lr_decay_rate # ---------- 调度 ---------- train.max_iter 90000 lr_multiplier L(WarmupParamScheduler)( schedulerL(MultiStepParamScheduler)( values[1.0, 0.1, 0.01], milestones[60000, 80000, 90000], num_updatestrain.max_iter, ), warmup_length1000 / train.max_iter, # 1000 步 warmup warmup_methodlinear, warmup_factor0.001, ) # ---------- 优化器 ---------- optimizer L(torch.optim.AdamW)( paramsL(get_default_optimizer_params)( base_lr1e-4, weight_decay_norm0.0, lr_factor_funcpartial(get_vim_lr_decay_rate, num_layers24, lr_decay_rate0.7), overrides{pos_embed: {weight_decay: 0.0}}, ), lr1e-4, betas(0.9, 0.999), weight_decay0.1, )若改用传统 YACS 配置det/detectron2/config/defaults.py 中的默认值等价写法是SOLVER.LR_SCHEDULER_NAMEWarmupCosineLR、SOLVER.BASE_LR0.001、SOLVER.BASE_LR_END0.0、SOLVER.WARMUP_ITERS1000、SOLVER.WARMUP_FACTOR0.001、SOLVER.WARMUP_METHODlinear、SOLVER.MAX_ITER90000随后由 det/detectron2/solver/build.py 中的build_optimizerbuild_lr_scheduler自动装配。需要梯度裁剪时追加SOLVER: CLIP_GRADIENTS: ENABLED: True CLIP_TYPE: norm # 或 value CLIP_VALUE: 1.0 NORM_TYPE: 2.0八、总结solver 模块的设计要点回顾 det/docs/modules/solver.rst 及其背后实现可以提炼出 detectron2.solver 的三个设计要点解耦相对缩放与绝对学习率LRMultiplier只负责把 fvcore 调度器的输出乘到各参数组base_lr上调度器本身完全无状态、可组合warmup 通过WarmupParamScheduler透明拼接参数分组下沉到源码级控制get_default_optimizer_params的weight_decay_norm、lr_factor_func、overrides三个通道分别解决归一化层衰减、Vim 分层学习率、位置编码零衰减三类高频需求向后兼容但明确弃旧旧版WarmupMultiStepLR/WarmupCosineLR保留仅用于复现旧行为并打印弃用警告引导到新接口。对 Vision Mamba 检测用户而言本文第六节的mask_rcnn_vimdet_b_100ep.py就是最权威的参照物调度用 multi-step 末段双衰减优化器用 AdamW 0.7 分层衰减二者共同支撑了 VimDet 在 COCO 上的稳定训练。若要深挖更多细节可继续阅读 det/detectron2/solver/build.py、det/detectron2/solver/lr_scheduler.py 的源码注释以及 det/tests/test_scheduler.py 与 det/tests/test_solver.py 中逐迭代的学习率断言。赞分享人工智能计算机视觉深度学习预训练微调【免费下载链接】Vim[ICML 2024] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model项目地址https://gitcode.com/gh_mirrors/vim2/Vim点击查看免费下载相关推荐Detectron2 Solver 模块全解析优化器构建、学习率调度与梯度裁剪实战指南Detectron2 Solver 模块全解析优化器构建、学习率调度与梯度裁剪实战指南 导读 detectron2.solver 是 Detectron2 中人工智能计算机视觉深度学习机器学习Detectron2 公共 LazyConfig 组件库完全指南以 configs/common 复用模型、数据加载器、学习率调度器与优化器Detectron2 公共 LazyConfig 组件库完全指南以 configs/common 复用模型、数据加载器、学习率调度器与优化器 Detectro人工智能计算机视觉深度学习机器学习沉浸式翻译使用指南解决99%常见问题的完整方案沉浸式翻译使用指南解决99%常见问题的完整方案 你是否曾在浏览英文网页时感到阅读困难是否需要在不同语言文档间频繁切换沉浸式翻译Immersive Tra前端AI 应用上一篇DeepSeek Harness 作用域运行时设计解析单键路由、事务化创建与权威结算下一篇TDengine PERFORMANCE_SCHEMA 性能数据视图完全指南PERF_APPS 到 PERF_TRANS 全表结构与查询实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表