PyTorch中低FLOPs与参数模型推理耗时更长是否合理?
问题
我用PyTorch结合thop、fvcore.nn的FlopCountAnalysis、ptflops的get_model_complexity_info三种工具统计模型FLOPs,得到以下结果:
- 自定义模型:FLOPs 619.038M,参数4.191M,推理耗时25.911ms
- ResNet50:FLOPs 1.315G,参数26.596M,推理耗时仅8.553545ms
为什么低FLOPs的自定义模型推理耗时反而更长?是FLOPs统计工具漏算了算子吗?
附上我用PyTorch测量推理耗时的代码:
model.eval() model.cuda() dummy_input = torch.randn(1,3,32,32).cuda() #flops = FlopCountAnalysis(model, dummy_input) #print(flop_count_table(flops)) #print(flops.total()) macs, params = profile(model, inputs=(dummy_input,)) macs, params = clever_format([macs, params], "%.3f") print('Flops:',macs) print('Parameters:',params) starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) repetitions = 300 timings=np.zeros((repetitions,1)) for _ in range(10): _ = model(dummy_input) # MEASURE PERFORMANCE with torch.no_grad(): for rep in range(repetitions): starter.record() _ = model(dummy_input) ender.record() # WAIT FOR GPU SYNC torch.cuda.synchronize() curr_time = starter.elapsed_time(ender) timings[rep] = curr_time print('time(s) :',np.average(timings))
分析与解答
低FLOPs模型推理耗时更长完全是可能的,FLOPs只是衡量计算量的指标,不是决定推理速度的唯一因素,具体原因可以从这几点分析:
1. 算子的硬件适配性差异
ResNet50里大量使用的3x3卷积、瓶颈结构这类算子,是GPU硬件厂商深度优化过的,CUDA内核能最大化利用GPU的计算单元。而你的自定义模型可能包含很多碎片化的小算子——比如频繁的小尺寸卷积、逐元素操作、零散的分支合并、自定义激活函数等,这类算子没法充分调动GPU的并行计算能力,反而会因为频繁的内核调度、上下文切换拖慢速度。
2. 内存访问效率的瓶颈
FLOPs只算浮点运算次数,但推理速度还受内存带宽限制。如果自定义模型的参数或中间特征图的内存访问模式不友好——比如频繁的非连续内存读写、小批量的特征图搬运,就算计算量小,也会因为等待数据传输而耗时更久。ResNet50的特征图维度规整,内存访问更连续,能更好地利用GPU的缓存机制,减少数据传输的等待时间。
3. 模型结构的并行性
GPU擅长处理大规模并行任务,ResNet50的结构规整,层与层之间的依赖关系简单,容易被PyTorch的自动并行机制或者TensorRT这类工具做流水线、张量并行优化。而自定义模型如果有大量分支、跳跃连接或者不规则的计算逻辑,会打断并行流水线,增加调度延迟,拖慢整体速度。
4. FLOPs统计的准确性
你用了三种不同工具都得到相似的FLOPs结果,说明漏算算子的概率极低。主流FLOPs统计工具基本能覆盖常见的PyTorch算子,除非你的模型包含完全自定义的C++/CUDA算子且未被工具识别,但这种情况很少见。如果还是怀疑,可以单独统计自定义模块的FLOPs,或者查看工具输出的算子明细,确认有没有遗漏的计算。
5. 推理耗时测量的小优化
你的测量代码已经比较规范,不过可以再做两点优化确保结果更准确:
- 确保模型和输入都正确移到GPU,预热步骤(10次前向传播)已经做了,这部分没问题
- 可以尝试开启
torch.backends.cudnn.benchmark = True,让CuDNN自动选择最优的卷积算法,避免因为算法选择导致的速度波动;如果开启了自动混合精度,也可以暂时关闭,排除精度模式对速度的影响
内容的提问来源于stack exchange,提问作者KBL

