Detectron2 训练速度基准测试全解读:Mask R-CNN 跨框架吞吐量对比、测试方法与复现指南 📅 发布时间:2026/9/10 3:38:31 👁 浏览次数: Detectron2 训练速度基准测试全解读Mask R-CNN 跨框架吞吐量对比、测试方法与复现指南【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2导读本文以 Detectron2 官方基准测试文档为核心系统讲解其 Mask R-CNNR-50-FPN训练吞吐量测试的完整方案——包括软硬件环境、测试指标定义、主流开源实现的速度对比结果以及每个框架的精确复现命令与超参对齐细节。读完本文你将掌握如何设计公平的 R-CNN 训练速度基准的方法论并能在当前仓库中直接复现 Detectron2 一侧的测量同时理解为何 R-CNN 类模型的训练吞吐量会随训练过程动态变化。一、为什么要为 Mask R-CNN 做跨框架训练速度基准训练速度Training Throughput是评估一个目标检测/实例分割框架实用价值的关键指标之一。相比推理延迟inference latency训练吞吐量更能反映一个框架在真实研究迭代中的产出效率——同样的时间能完成多少轮实验、多少张图片的处理。Detectron2 官方在 docs/notes/benchmarks.md 中发布了一份专门的基准测试其目的非常聚焦在尽量统一的模型与超参数前提下横向对比 Detectron2 与其他主流开源 Mask R-CNN 实现的训练速度从而给使用者提供选型参考。参与对比的实现包括Detectron2PyTorch 框架mmdetectionPyTorch 框架OpenMMLab 出品maskrcnn-benchmarkPyTorch 框架Facebook 早期作品tensorpackTensorFlow 框架SimpleDetMXNet 框架DetectronCaffe2 框架Detectron2 的前身matterport/Mask_RCNNTensorFlow/Keras 框架这是一个极具代表性的对比阵容几乎覆盖了 2020 年前后社区中最主流的 Mask R-CNN 开源实现且框架横跨 PyTorch、TensorFlow、MXNet、Caffe2。值得注意的是该基准测试文档本身不包含任何图片素材表格以 reStructuredText 的eval_rst指令内嵌徽标为外部图片引用因此本文也不引入与本主题无关的配图一切结论以数据表格和源码为据。二、测试设置软硬件环境与指标定义2.1 硬件与软件环境为了让各框架之间的比较尽量公平基准测试固定了统一的运行环境项目配置硬件8 张 NVIDIA V100 GPUNVLink 互联Python3.7CUDA10.1cuDNN7.6.5PyTorch1.5TensorFlow1.15.0rc2Keras2.2.5MXNet1.6.0b20190820需要强调两点不同框架无法运行在同一套深度学习运行时之上。因此这份基准选择了同一硬件、各自框架的当时主流版本的组合属于软硬件尽量对齐的近似公平而非严格同环境的 micro-benchmark。表格中的吞吐量数字绑定这些特定的版本组合。由于软件版本尤其是各框架自身的算子优化与数据流水线实现会显著影响吞吐量本文作者在文档中也明确承认我们观察到的 maskrcnn-benchmark 速度比它的 model zoo 记录更快很可能是软件版本不同的缘故。因此这些数字适合作为同一环境下的横向参考不宜直接迁移到其他硬件或版本组合。2.2 被测模型与 Detectron 基线对齐的 R-50-FPN Mask R-CNN被测模型为端到端end-to-endR-50-FPN Mask R-CNN超参数与 Detectron 基线配置e2e_mask_rcnn_R-50-FPN_1x.yaml 保持一致其关键特征是没有尺度增强no scale augmentation。这一点在当前仓库中可以直接验证基准测试使用的正是仓库内的 configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml该配置继承自 configs/Base-RCNN-FPN.yaml并显式做了以下对齐修改_BASE_: ../Base-RCNN-FPN.yaml MODEL: WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl MASK_ON: True RESNETS: DEPTH: 50 # Detectron1 uses smooth L1 loss with some magic beta values. # The defaults are changed to L1 loss in Detectron2. RPN: SMOOTH_L1_BETA: 0.1111 ROI_BOX_HEAD: SMOOTH_L1_BETA: 1.0 POOLER_SAMPLING_RATIO: 2 POOLER_TYPE: ROIAlign ROI_MASK_HEAD: POOLER_SAMPLING_RATIO: 2 POOLER_TYPE: ROIAlign INPUT: # no scale augmentation MIN_SIZE_TRAIN: (800, )对比基线与 Detectron2 默认行为可以提炼出几处关键差异这在 configs/Detectron1-Comparisons/README.md 中有系统说明维度Detectron2 默认Detectron1-Comparisons本基准所用训练尺度增强多尺度采样MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800)固定短边MIN_SIZE_TRAIN: (800, )无尺度增强边框回归损失L1 losssmooth L1 lossSMOOTH_L1_BETA使用 Detectron1 的取值ROIAlignROIAlignV2默认半像素对齐ROIAlign旧行为POOLER_SAMPLING_RATIO: 2之所以这样对齐是因为这些默认差异会同时影响精度和速度例如尺度增强会改变输入图尺寸分布进而影响每轮迭代的平均计算量。该目录的定位就是尽可能贴近 Detectron 的行为从而给出与 Detectron 之间公平的精度与速度对比见 configs/Detectron1-Comparisons/README.md。2.3 指标定义为什么取第 100–500 轮迭代的平均值这是整个基准测试最容易被忽略、也最重要的方法论细节Metrics: We use the average throughput in iterations 100-500 to skip GPU warmup time.即吞吐量 第 100 到 500 轮迭代之间的平均吞吐images/second目的是跳过 GPU 预热warmup阶段——前若干轮迭代通常伴随算子库 autotune、CUDA 上下文初始化、数据缓存填充等开销会拉低平均速度。文档同时给出了一个深刻的警示R-CNN 类模型的吞吐量在训练过程中通常会变化因为它依赖模型自身的预测结果proposal 数量、ROI 分布等会随训练进行而变化。因此该指标不能直接与 Model Zoo 中的 train speed 比较——Model Zoo 记录的是整个训练过程的平均速度如 MODEL_ZOO.md 表格中的train time (s/iter)列例如 Faster R-CNN R50-FPN 1x 为 0.219 s/iter这些是整轮训练的平均值它更适合用于框架间同口径对比即大家用完全相同的测量窗口100–500 迭代来比。这一设计说明作者深谙 R-CNN 流水线的特性它的计算图前向路径长度不是静态的而是由每张图的 RPN proposal 数量动态决定。三、主结果7 个实现的吞吐量对比原文档以eval_rst表格给出结果这里整理为普通 Markdown 表格实现后括号内为底层深度学习框架实现框架吞吐量img/sDetectron2PyTorch62mmdetectionPyTorch53maskrcnn-benchmarkPyTorch53tensorpackTensorFlow50SimpleDetMXNet39DetectronCaffe219matterport/Mask_RCNNTensorFlow14几点值得展开的观察同框架内部差距源于工程实现三个 PyTorch 实现62 vs 53 vs 53跑出了明显不同的速度说明在相同底层框架下数据流水线、算子融合、分布式训练实现等工程细节对吞吐量的影响甚至超过框架本身的差异。Detectron 的 19 img/s 明显偏低文档给出的解释是其大量算子运行在 CPU 上因此性能受限。matterport/Mask_RCNN 的 14 img/s 最低文档同时提醒该实现中有许多小细节可能与 Detectron 的标准不一致因此这个数字更多代表该实现默认代码的速度而非理论最优。需要注意的边界这些数字是该特定软硬件组合下的实测值本文不将其外推为永恒的速度排名也不据此断言哪个框架最好——任何训练速度排名都会随硬件代际、软件版本与优化投入而改变。四、各实现的复现命令与对齐细节原文档为每个实现都提供了精确到 commit 的复现步骤这是这份基准最大的工程价值。下面逐项展开。4.1 Detectron2本仓库release v0.1.2python tools/train_net.py --config-file configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml --num-gpus 8对应命令的入口是 tools/train_net.py它解析命令行参数后通过launch(main, args.num_gpus, ...)启动多进程分布式训练launch的实现位于 detectron2/engine/launch.py当world_size num_machines * num_gpus_per_machine 1时会为每张 GPU 派生一个子进程用 NCCL 作为后端初始化torch.distributed进程组并自动选择空闲端口dist_urlauto时通过_find_free_port()动态获取。这正是--num-gpus 8能在一台 8 卡机器上无缝工作的底层机制。需要说明命令中的--config-file指向的正是上文展开的 noaug 配置训练脚本同时支持--eval-only、--resume、--num-machines、--machine-rank等标准参数见default_argument_parser可供复现时灵活调整若想仅测量数据加载或前向速度而不跑完整训练仓库还提供了独立的 tools/benchmark.py依赖psutil它支持对 yaml 配置get_cfg路径与 lazy 配置LazyConfig路径分别构建 DataLoader 基准与模型基准可作为官方基准测试方法的本地延伸。4.2 mmdetectioncommit b0d845f./tools/dist_train.sh configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py 8dist_train.sh是 mmdetection 自带的多卡训练启动脚本第二个参数 8 表示使用 8 张 GPU。配置mask_rcnn_r50_caffe_fpn_1x_coco.py对应与 Detectron 基线同口径的 R-50-FPN Mask R-CNN 模型caffe 风格预训练权重。4.3 maskrcnn-benchmarkcommit 0ce8f6f该仓库较老需要先做 PyTorch 1.5 兼容性修补sed -i s/torch.uint8/torch.bool/g **/*.py; sed -i s/AT_CHECK/TORCH_CHECK/g **/*.cu然后以torch.distributed.launch启动python -m torch.distributed.launch --nproc_per_node8 tools/train_net.py --config-file configs/e2e_mask_rcnn_R_50_FPN_1x.yaml文档特别注明其观测到的速度比 maskrcnn-benchmark 自己的 model zoo 记录更快很可能是因为软件版本不同。这再次印证了上一节的观点——版本差异足以改变速度排名复现时必须锁定 commit。4.4 tensorpackcommit caafdaexport TF_CUDNN_USE_AUTOTUNE0 mpirun -np 8 ./train.py --config DATA.BASEDIR/data/coco TRAINERhorovod BACKBONE.STRIDE_1X1True TRAIN.STEPS_PER_EPOCH50 --load ImageNet-R50-AlignPadding.npz要点设置TF_CUDNN_USE_AUTOTUNE0关闭 cuDNN autotune避免预热阶段的 autotune 干扰测量这与官方跳过 100–500 迭代预热的思路一脉相承使用 Horovod 分布式训练器-np 8指定 8 个进程TRAIN.STEPS_PER_EPOCH50等参数用于对齐训练 schedule。4.5 SimpleDetcommit 9187a1python detection_train.py --config config/mask_r50v1_fpn_1x.pySimpleDet 是基于 MXNet 的实现其默认配置即为 8 卡训练。4.6 DetectronCaffe2官方基线配置python tools/train_net.py --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml注意 Detectron 使用--cfg而不是--config-file。文档明确指出其性能受限的原因许多算子运行在 CPU 上——这是它只跑出 19 img/s 的直接解释也恰好衬托出 Detectron2 全算子 GPU 化的工程收益。4.7 matterport/Mask_RCNNcommit 3deaec 超参补丁该实现默认超参与 Detectron 基线差异较大官方提供了一段 diff 来对齐摘要如下完整 diff 见原文档diff --git i/mrcnn/model.py w/mrcnn/model.py - validation_dataval_generator, - validation_stepsself.config.VALIDATION_STEPS, #validation_dataval_generator, #validation_stepsself.config.VALIDATION_STEPS, diff --git i/mrcnn/parallel_model.py w/mrcnn/parallel_model.py class ParallelModel(KM.Model): ... super().__init__() diff --git i/samples/coco/coco.py w/samples/coco/coco.py - # GPU_COUNT 8 GPU_COUNT 8 BACKBONE resnet50 STEPS_PER_EPOCH 50 TRAIN_ROIS_PER_IMAGE 512 ... - # Training - Stage 1 - print(Training network heads) model.train(dataset_train, dataset_val, learning_rateconfig.LEARNING_RATE, epochs40, - layersheads, - augmentationaugmentation) - - # Training - Stage 2 - # Finetune layers from ResNet stage 4 and up - print(Fine tune Resnet stage 4 and up) - model.train(dataset_train, dataset_val, - learning_rateconfig.LEARNING_RATE, - epochs120, - layers4, - augmentationaugmentation) - - # Training - Stage 3 - # Fine tune all layers - print(Fine tune all layers) - model.train(dataset_train, dataset_val, - learning_rateconfig.LEARNING_RATE / 10, - epochs160, - layersall, layers3, augmentationaugmentation)补丁要点解读关闭验证回调model.py原实现每个 epoch 都会跑验证集会严重稀释训练吞吐量的测量因此注释掉validation_data/validation_steps修复 Keras 多进程模型的初始化parallel_model.pyParallelModel缺少super().__init__()在目标 Keras 版本下会报错对齐超参数coco.py开启GPU_COUNT 8、固定BACKBONE resnet50、STEPS_PER_EPOCH 50、TRAIN_ROIS_PER_IMAGE 512并把三阶段训练heads → 4 → all合并为单阶段layers3、40 epochs使训练流程与 Detectron 基线的单阶段 1x schedule 对齐。应用补丁、export TF_CUDNN_USE_AUTOTUNE0之后运行python coco.py train --dataset/data/coco/ --modelimagenet五、如何理解与复现这份基准方法论要点把整份基准拆解为方法论可以提炼出四个可复用的设计原则统一硬件、锁定软件版本8×V100 各框架当时主流版本对老仓库精确到 commitmmdetectionb0d845f、maskrcnn-benchmark0ce8f6f、tensorpackcaafda、SimpleDet9187a1、matterport3deaec。统一模型与超参口径全部采用无尺度增强的 R-50-FPN Mask R-CNN并以 Detectron 官方基线配置为锚点逐项对齐损失函数、ROIAlign 行为、采样比例、每图 ROI 数等。仓库内 configs/Detectron1-Comparisons/ 目录下的三个 noaug/1x 配置Faster R-CNN、Keypoint R-CNN、Mask R-CNN就是这套对齐思想的落地产物。统一测量口径取第 100–500 轮迭代的平均吞吐以跳过预热关闭 cuDNN autotuneTF 侧并明确区分窗口平均吞吐与整轮训练平均速度后者即 MODEL_ZOO.md 的train time (s/iter)列两者不可直接比较。透明披露差异文档不掩盖各实现之间的额外差异如 maskrcnn-benchmark 因版本更快、matterport 的细节差异、Detectron 的 CPU 算子瓶颈并逐一给出原因说明。若要在当前仓库复现 Detectron2 一侧建议# 1. 按 INSTALL.md 安装依赖Python 3.7 / PyTorch / CUDA # 2. 准备 COCO 数据集并按要求注册 python tools/train_net.py \ --config-file configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml \ --num-gpus 8运行时会通过 tools/train_net.py 的setup()加载并冻结配置日志中可通过CommonMetricPrinter观察每轮迭代耗时据此按第 100–500 轮平均的口径自行统计吞吐量。六、延伸阅读基准结论与 Detectron 的精度对比补充configs/Detectron1-Comparisons/README.md其中给出了 Faster/Keypoint/Mask R-CNN 与 Detectron 的 AP 对照以及Detectron2 的 mask AP 高出约 1 个点、源于更正确的实现的说明Detectron2 与旧库Detectron、Caffe2、TensorFlow的兼容性与行为差异docs/notes/compatibility.md覆盖 box 尺寸约定、anchor 量化、类别标签顺序、ROIAlign 半像素对齐、mask 推理函数等各模型的整轮训练速度、推理速度与显存占用train time (s/iter)口径MODEL_ZOO.md训练入口脚本与分布式启动机制tools/train_net.py、detectron2/engine/launch.py独立的基准测试工具DataLoader 与模型两路tools/benchmark.py【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考