自定义的一个网络模块,为什么使用ptflops, torchstat, thop都算不出来flops,显示的flops都是0

自定义的一个网络模块,为什么使用ptflops, torchstat, thop都算不出来flops,显示的flops都是0

我的模块里面也用到了F.conv2d,但是不知道为什么flops不会被计算

img


img

可能的原因是你的自定义网络模块中没有定义forward函数。这些工具默认会去找forward函数中的计算过程来计算FLOPs, 如果forward函数中没有执行任何计算,那么这些工具就会显示0

另外,如果你使用的是自定义的网络模块,而非torch.nn模块,那么这些工具可能无法正确统计你网络模块的参数量和FLOPs数量。因为这些工具是基于torch.nn模块来实现的,如果自定义的网络模块和torch.nn模块的实现方式不同,那么这些工具可能就不能正确地统计参数和FLOPs的数量。

建议尝试以下方法:

  1. 在自定义的网络模块中定义一个forward函数,并在forward函数中执行一些计算,例如卷积、池化等操作。

  2. 针对自定义的网络模块,可以尝试使用其他的工具来计算参数量和FLOPs。例如,可以使用Netron可视化工具来查看自定义网络模块的参数量和计算图,也可以使用pytorch-summary库来计算参数量。

  3. 确认自定义的网络模块是否支持CUDA。如果自定义模块不支持CUDA,则可能会导致这些工具无法正确计算FLOPs。

  4. 如果你使用的是PyTorch 1.6及以上版本,可以尝试使用torch.profiler模块来查看网络模型的参数量和FLOPs。torch.profiler是一个用于分析和优化 PyTorch 模型性能的内置模块。它提供了许多有用的分析工具,其中包括计算模型的参数量和FLOPs等信息。你可以使用类似于以下代码来使用torch.profiler模块计算模型的参数量和FLOPs:

    import torch
    import torch.profiler as profiler
    
    # 定义一个自定义模型
    ...
    
    # 使用 profiler 来计算 FLOPs 和参数量
    with profiler.profile(profile_memory=True, record_shapes=True) as prof:
        model(torch.randn(1, 3, 224, 224))
    print(prof.table(sorted_by="cpu_time_total"))
    
  5. 最后,检查一下你的自定义网络模块的实现是否有问题,是否正确地实现了计算图以及前向传递的过程。如果存在错误,也可能导致这些工具无法正确计算FLOPs。

  6. 注意一下所使用的工具的版本是否比你的PyTorch版本高,因为不同版本的PyTorch会对计算过程有所改进和优化。如果你使用的工具版本比你的PyTorch版本高,那么可能会影响FLOPs的计算结果。

  7. 如果你仍然无法得到正确的FLOPs计算结果,尝试使用其他的FLOPs计算工具。例如,你可以尝试使用TensorFlow提供的tf.profiler模块,或者使用第三方的开源FLOPs计算库,如Keras FLOPs等。

总之,计算网络模型的FLOPs并不是一件容易的事情,它需要你对深度学习计算过程的细节有一定的了解,并且需要勤奋地进行实验以找到适合自己的方法。希望以上的建议对你有所帮助。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,FLOPs 是指浮点计算次数,主要用于衡量一个模型的计算量大小,因此可以直观地了解一个模型的计算复杂度。在 PyTorch 中,可以使用下面的工具库计算模型的 FLOPs。

    • ptflops:https://github.com/sovrasov/flops-counter.pytorch
    • thop:https://github.com/Lyken17/pytorch-OpCounter
    • torchstat:https://github.com/Swall0w/torchstat

    在使用这些工具计算模型的 FLOPs 时,需要注意以下几点:

    1.模型需要被实例化并加载到设备上,例如:

    import torch
    import ptflops
    
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = ...
    model.to(device)
    

    2.使用安装好的相应工具库对模型进行 FLOPs 计算,例如:

    # 使用 ptflops 计算 FLOPs
    macs, params = ptflops.get_model_complexity_info(model, (input_channels, input_size, input_size), as_strings=True, print_per_layer_stat=False)
    print(f"ptflops - MACs: {macs}, Params: {params}")
    
    # 使用 thop 计算 FLOPs
    from thop import profile
    flops, params = profile(model, inputs=(dummy_input, ))
    print(f"thop - FLOPs: {flops}, Params: {params}")
    
    # 使用 torchstat 计算 FLOPs
    from torchstat import stat
    stat(model, (input_channels, input_size, input_size))
    

    在以上计算中,input_channelsinput_sizedummy_input 均为输入数据的维度,需要根据具体情况进行设置。如果设置不合理,可能导致计算 FLOPs 错误。

    3.对于使用自定义的网络模块,在计算 FLOPs 时也需要注意以下问题:

    • 确认自定义网络模块使用的是 PyTorch 中的标准卷积层 F.conv2d,而不是其他自定义实现的卷积层。
    • 如果定义了一些特殊操作,如形变操作,某些 FLOPs 计算库可能不支持计算该操作,需要手动指定该操作的 FLOPs 计算方式。

    如果以上的操作都没有解决您的问题,则需要详细地检查模型的定义和 FLOPs 计算库的使用方法,确定是否存在其他的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^