077、GroupConv 分组数消融实验:g=2/4/8/16 对精度与延迟的影响曲线
077、GroupConv 分组数消融实验:g=2/4/8/16 对精度与延迟的影响曲线
上周调一个YOLOv11n的轻量化版本,在T4上跑推理延迟,发现一个诡异现象:把某个C2f模块里的标准卷积换成GroupConv后,分组数从2调到4,mAP掉了0.8个点,但延迟反而增加了。当时第一反应是代码写错了,查了半天发现是分组卷积的访存特性在作祟——分组数不是越大越好,也不是越小越好,这个平衡点跟硬件、特征图尺寸、通道数都有关系。
今天这篇笔记就专门记录一下GroupConv分组数的消融实验,从g=2到g=16,看精度和延迟到底怎么变。代码基于YOLOv11的ultralytics框架,PyTorch 2.1,CUDA 12.1。
从一次翻车现场说起
先还原一下那个让我怀疑人生的场景。YOLOv11的backbone里有个C2f模块,默认是标准卷积(groups=1)。我想做轻量化,把里面的Conv改成GroupConv,顺手设了groups=4。跑完COCO val2017,mAP从37.2掉到36.4,这能接受。但测延迟时傻眼了:原来1.2ms的模块,改完变成1.5ms。
这里踩过坑:分组卷积的FLOPs确实比标准卷积低,但实际推理时间受限于CUDA kernel的启动开销和显存带宽。分组数越多,每个group的通道数越少,计算密度越低,GPU的SM利用率上不去。特别是当每个group的通道数小于32时(NVIDIA Tensor Core的warp size),性能会断崖式下跌。
