You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:54:26