
如何用 benchmark.py 对 timm 模型做离线推理基准测试并对比 float32 与 AMP 精度【免费下载链接】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在 timmpytorch-image-models仓库中根目录的 benchmark.py 是官方提供的推理/训练基准脚本它在合成输入torch.randn上跑指定模型输出 samples/sec 与 ms/step。本文的任务是在 CUDA GPU 上对一个 timm 模型只跑离线推理基准--bench inference并分别以float32与AMP两种精度各跑一次用脚本给出的吞吐和每步耗时对比两者的差异。前提条件有一块 CUDA GPU 可用--device默认为cuda依赖满足 requirements.txttorch1.7、torchvision、pyyaml、huggingface_hub0.17.0、safetensors0.2、numpy在仓库根目录执行命令benchmark.py会导入同目录下的timm包。一个会影响读数的固定行为脚本在 CUDA 可用时会自动设置torch.backends.cuda.matmul.allow_tf32 True和torch.backends.cudnn.benchmark True见 benchmark.py。对比 float32 与 AMP 时两次运行都走同一脚本因此该条件在两次运行中一致不影响相对比较。运行 float32 推理基准--bench的取值为inference、train、both默认是both会连训练步骤一起测。只做推理基准时显式传--bench inference。--precision默认就是float32可以不写这里写出来让意图明确python benchmark.py -m resnet50 --bench inference --precision float32 \ --results-file bench_resnet50_fp32.csv参数说明-m resnet50模型名--model默认值就是resnet50可换成仓库中任意可用模型-b--batch-size默认256。显存小的卡可以调小例如-b 128不显式指定时按默认值执行--num-warm-iter/--num-bench-iter预热与正式计时迭代数默认分别是10和40--results-file把结果写成 CSV--results-format默认csv也支持json上面文件名为示例可替换为任意可写路径--img-size/--input-size不传时使用模型默认输入尺寸。如果默认 batch 256 跑不动脚本会捕获RuntimeError并自动减小 batch 重试日志中会出现Reducing batch size to ... for retry.--no-retry可以关闭这个回退机制。运行 AMP 推理基准float16 autocast--precision的 help 说明取值为amp, float32, float16, bfloat16, tf32。选amp时resolve_precision 的行为是模型权重与输入数据仍为 float32前向被 PyTorch Native AMP 的 autocast 包裹低精度为 float16源码中precision amp对应amp_dtype torch.float16。这与--precision float16模型和输入整体为 float16是两条不同的精度路径。同一模型、同一 batch 下再跑一次python benchmark.py -m resnet50 --bench inference --precision amp \ --results-file bench_resnet50_amp.csv等价的写法是加--amp标志help 明确说明它会覆盖--precision即 use PyTorch Native AMP ... Overrides --precision arg.此时可用--amp-dtype bfloat16把 AMP 低精度从默认的 float16 换成 bfloat16对应内部值amp_bfloat16。做对比时保持两次命令除--precision外完全一致同模型、同 batch、同迭代数否则吞吐差异可能来自输入条件而非精度本身。读取结果并对比两项精度每次运行结束后脚本都会向 stdout 打印--result分隔符加一段 JSON见 benchmark.py推理模式下字段带infer_前缀model、infer_samples_per_sec、infer_step_time、infer_batch_size、infer_img_size、param_count。若安装了 deepspeed 或 fvcore 任一 profiling 组件还会追加infer_gmacs、infer_macts未安装时这两个字段不存在不影响基准本身。--results-file写出的 CSV 使用相同字段。仓库 results/ 目录中已有官方批量跑出的基准 CSV 可作参照文件命名把运行条件编码在文件名里例如 results/benchmark-infer-amp-nchw-pt291-cu130-5090.csv 表示 inference、amp 精度、NCHW 布局、PyTorch 2.9.1、5090 显卡。该文件的表头与一行文档示例数据如下数值来自仓库文件仅作示例不代表任何卡的固定预期model,infer_img_size,infer_samples_per_sec,infer_step_time,infer_batch_size,param_count,infer_gmacs,infer_macts test_vit,160,260723.52,3.909,1024,0.37,0.04,0.48对比方式就是取两次运行中同名模型的infer_samples_per_sec吞吐与infer_step_time每步毫秒做差。仓库 README 的 Whats New 中也记录了这类结果的批量产出方式如 Add new benchmark result csv files for inference timing on all models w/ RTX Pro 6000, 5090, and 4090 cards w/ PyTorch 2.9.1。可选一次测多个模型不需要逐个跑单模型时-m可以传通配符或文件列表-m resnet*不是精确模型名时脚本按通配符从list_models展开成批量清单逐个基准测试每个模型之间sleep(10)结果按infer_samples_per_sec降序排列--model-list names.txt从每行一个模型名的 txt 文件读取清单。python benchmark.py -m resnet* --bench inference --precision amp批量模式只适合同一精度下扫一批模型要对比 float32 与 AMP 时仍需对同一批模型分别跑两次--precision float32与--precision amp再对比输出。限制与已知行为计时方式与设备有关device名中含cuda时每次计时调用torch.cuda.synchronize否则用普通time.perf_counter。用--device cpu跑出的数字与 GPU 结果不可直接比较。运行中遇到无法通过减小 batch 恢复的错误时日志会打印Unrecoverable error encountered while benchmarking {model_name}, skipping.该模型结果中带error字段CSV 中其余正常模型不受影响。--channels-last会切换 NHWC 内存布局对应 results 目录中nhwc命名的文件改变该选项后得到的吞吐应与未改动的结果分开记录不要混在同一次对比里。infer_gmacs/infer_macts依赖 deepspeed 或 fvcore 任一组件属于计算量统计不是计时结果两者都没装时相关字段不出现属正常现象。【免费下载链接】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),仅供参考