尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

timm 的 fast-norm 开关怎么在 benchmark.py 中启用并验证 GroupNorm/LayerNorm 推理提速?

timm 的 fast-norm 开关怎么在 benchmark.py 中启用并验证 GroupNorm/LayerNorm 推理提速? timm 的 fast-norm 开关怎么在 benchmark.py 中启用并验证 GroupNorm/LayerNorm 推理提速【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models如果你在 timm 中跑 Vision Transformer 这类以 LayerNorm 为主、或含 GroupNorm 的模型并想量化快速归一化对推理速度的实际影响仓库自带的 benchmark.py 就提供了现成的入口一个--fast-norm命令行开关配合--bench inference做同条件对比最后从samples/sec和ms/step读数判断收益。适用前提是已安装 timm依赖见 requirements.txttorch1.7、torchvision、pyyaml、huggingface_hub、safetensors、numpy并在 CUDA 环境下运行脚本--device默认cuda且 AMP 路径只在 autocast 启用时生效。--fast-norm开关的生效链路理解开关如何进入模型才能解释为什么两次运行结果会有差异。整条链路是benchmark.py 定义参数parser.add_argument(--fast-norm, defaultFalse, actionstore_true, helpenable experimental fast-norm)注意官方 help 文本把它标注为experimental。main()中在创建任何模型之前执行if args.fast_norm: set_fast_norm()set_fast_norm来自timm.layers。timm/layers/fast_norm.py 中模块级标志_USE_FAST_NORM默认是Falseset_fast_norm(enableTrue)将其置位is_fast_norm()读取该标志。模型里的归一化层在__init__时把标志缓存为self._fast_norm is_fast_norm()见 timm/layers/norm.py 的GroupNorm/LayerNorm及 timm/layers/norm_act.py 的GroupNormAct/LayerNormAct等forward中据此二选一def forward(self, x): if self._fast_norm: x fast_layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps) else: x F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps) ...fast 版函数与标准版的差别在 timm/layers/fast_norm.py 的模块 docstring 里写得很明确For GroupNorm and LayerNorm these functions bypass typical AMP upcast to float32. Additionally, for LayerNorm, the APEX fused LN is used if available (which also does not upcast)具体行为fast_group_norm在 autocast 启用时把输入和 weight/bias 转为 autocast 的低精度 dtype并在关闭 autocast 的上下文中执行F.group_norm从而跳过 AMP 对 GroupNorm 输入上转到 float32 的默认行为fast_layer_norm则优先调用 apex 的fused_layer_norm_affine如果安装了 apex否则走同样的跳过上转逻辑。由此推出两条判断依据后面读数时会用到fast_group_norm的行为分支只在is_autocast_enabled为真时改变也就是说 GroupNorm 要看到 fast-norm 的效果必须开 AMP--ampLayerNorm 的 fast 路径在安装了 apex 时无需 AMP 也会走 fused LN两者都没有时float32 下 fast 版与标准版执行路径基本一致。另有一个顺序约束标志是在归一化层__init__时捕获的benchmark.py中set_fast_norm()位于create_model之前满足这一顺序如果你在自己的脚本里复刻这个流程也必须先调set_fast_norm()再建模型否则模型仍使用标准归一化。执行步骤选一个使用 LayerNorm 的模型做测试对象比较合理——ViT 系模型是 benchmark 覆盖过的标准对象例如results/下各 benchmark-infer-amp-*.csv 中都有vit_base_patch16_224的记录。用同一个模型跑两组命令除--fast-norm外其余参数完全一致才能归因于开关本身。先跑基线不带开关python benchmark.py -m vit_base_patch16_224 --bench inference --amp -b 256再跑启用 fast-norm 的对照组python benchmark.py -m vit_base_patch16_224 --bench inference --amp -b 256 --fast-norm各参数含义均来自 benchmark.py 的参数定义--bench inference只跑推理基准跳过训练步骤默认值是both此处限定任务--amp启用 PyTorch 原生 AMP 混合精度这是 GroupNorm fast 路径生效的必要条件-b 256batch size-b的默认值就是 256显存不足时脚本会自动递减 batch size 重试--no-retry可关闭该重试预热与测量轮数用默认即可--num-warm-iter 10、--num-bench-iter 40。如果只想留档对比给命令追加--results-file输出 CSV例如--results-file baseline.csv与--results-file fast_norm.csv。单模型模式下该文件的字段由脚本的结果字典决定model、infer_samples_per_sec、infer_step_time、infer_batch_size、infer_img_size、param_count安装了 deepspeed 或 fvcore 时还会多出infer_gmacs/infer_macts。如何读结果、判断有没有提速每次运行结束时日志会输出这样一行收尾信息数值随你的硬件和配置变化不是固定预期Inference benchmark of vit_base_patch16_224 done. 0000.00 samples/sec, 00.00 ms/step同时 stdout 末尾会打印一段 JSON--result分隔符后代码注释说明它是供 runner 脚本解析的其中的infer_samples_per_sec与infer_step_time就是对比依据分别记录两次运行的infer_samples_per_sec越大越快和infer_step_timems/step越小越快两次运行在相同infer_batch_size、相同infer_img_size下才可比若某次触发了 batch size 递减重试日志中会出现Reducing batch size to ... for retry.此时先对齐 batch size 再比仓库results/目录下的 CSV如 benchmark-infer-amp-nchw-pt210-cu121-rtx3090.csv是官方在不同显卡/PyTorch 版本上留下的基准记录只能用于参考同环境量级不能当作你本机的预期值。关于提速本身需要保持克制fast-norm 改变的是归一化在 AMP 下是否跳过 float32 上转收益大小取决于该模型中 GroupNorm/LayerNorm 在总耗时里的占比。文档没有给出固定收益数字所以正确的做法就是以上述 A/B 读数为准读数无差异不代表配置错误可能只是该模型上归一化开销占比小。边界与已知限制开关在 help 文本中被标注为 experimentaltimm/layers/fast_norm.py 中也有注释fast (ie lower precision LN) can be disabled with this flag if issues crop up即这是官方预留的精度行为变更点出问题时可去掉开关回到标准路径。--fast-norm是进程级全局标志只影响之后创建的模型。benchmark.py的单模型流程没有顺序问题但用--model-list跑批量模型时所有模型都在标志置位后创建全部走 fast 路径。与--torchscript组合时不会生效fast_group_norm/fast_layer_norm内部有torch.jit.is_scripting()分支直接回退到标准F.group_norm/F.layer_norm。精度相关实验不要混入对比--precision、--channels-last、--reparam等会独立改变计时结果A/B 两次运行中保持它们一致。不要把 fast-norm 理解为量化或改变整体计算精度它只改变 GroupNorm/LayerNormfast_norm.py 中还有对应 RMSNorm 的 fast 变体在 AMP 下的上转行为。如果确认 fast-norm 对你的模型有效下一步可以在 ImageNet 验证集上核对精度影响validate.py 提供了同名--fast-norm开关用法与 benchmark 一致。【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表