Esta ferramenta foi projetada para calcular a quantidade teórica de operações de multiplicação em redes neurais. Ele também pode calcular o número de parâmetros e imprimir o custo computacional por camada de uma determinada rede.
ptflops tem dois back -end, pytorch e aten . O backend pytorch é legado, considera apenas nn.Modules . No entanto, ainda é útil, pois fornece uma análise melhor para a camada par para CNNs. Em todos os outros casos, é recomendável usar aten Backend, que considera as operações da ATEN e, portanto, abrange mais arquiteturas de modelos (incluindo transformadores). O back -end padrão é aten . Por favor, não use o back -end pytorch para arquiteturas de transformadores.
atenverbose=True para ver as operações que não foram consideradas durante a computação da complexidade.nn.Module . Os módulos mais profundos no segundo nível de nidificação não são mostrados nas estatísticas da camada.ignore_modules Opção força ptflops a ignorar os módulos listados. Isso pode ser útil para fins de pesquisa. Por exemplo, pode -se abandonar todas as convoluções do processo de contagem especificando ignore_modules=[torch.ops.aten.convolution, torch.ops.aten._convolution] . pytorchSuporte experimental:
torch.nn.functional.* E tensor.* Operações. Portanto, operações não suportadas não estão contribuindo para a estimativa final da complexidade. Consulte ptflops/pytorch_ops.py:FUNCTIONAL_MAPPING,TENSOR_OPS_MAPPING para verificar o OPS suportado. Às vezes, os ganchos de nível funcional conflitam com ganchos para nn.Module (por exemplo, personalizados). Nesse caso, a contagem dessas operações pode ser desativada passando backend_specific_config={"count_functional" : False} .ptflops lança um determinado modelo em um tensor aleatório e estima a quantidade de cálculos durante a inferência. Modelos complicados podem ter várias entradas, alguns deles podem ser opcionais. Para construir entrada não trivial, pode-se usar o argumento input_constructor do get_model_complexity_info . input_constructor é uma função que toma a resolução espacial de entrada como uma tupla e retorna um ditado com argumentos de entrada nomeados do modelo. Em seguida, esse ditado seria passado para o modelo como argumentos de palavras -chave.verbose permite obter informações sobre módulos que não contribuem para os números finais.ignore_modules Opção força ptflops a ignorar os módulos listados. Isso pode ser útil para fins de pesquisa. Por exemplo, pode -se descartar todas as convoluções do processo de contagem especificando ignore_modules=[torch.nn.Conv2d] . Pytorch> = 2.0. Use pip install ptflops==0.7.2.2 para trabalhar com tocha 1.x.
De Pypi:
pip install ptflopsDeste repositório:
pip install --upgrade git+https://github.com/sovrasov/flops-counter.pytorch.git import torchvision . models as models
import torch
from ptflops import get_model_complexity_info
with torch . cuda . device ( 0 ):
net = models . densenet161 ()
macs , params = get_model_complexity_info ( net , ( 3 , 224 , 224 ), as_strings = True , backend = 'pytorch'
print_per_layer_stat = True , verbose = True )
print ( '{:<30} {:<8}' . format ( 'Computational complexity: ' , macs ))
print ( '{:<30} {:<8}' . format ( 'Number of parameters: ' , params ))
macs , params = get_model_complexity_info ( net , ( 3 , 224 , 224 ), as_strings = True , backend = 'aten'
print_per_layer_stat = True , verbose = True )
print ( '{:<30} {:<8}' . format ( 'Computational complexity: ' , macs ))
print ( '{:<30} {:<8}' . format ( 'Number of parameters: ' , params ))Se o PTFLOPS foi útil para o seu artigo ou relatório de tecnologia, cite -me:
@online{ptflops,
author = {Vladislav Sovrasov},
title = {ptflops: a flops counting tool for neural networks in pytorch framework},
year = 2018-2024,
url = {https://github.com/sovrasov/flops-counter.pytorch},
}
Graças a @warmspringwinds e Horace ele pela versão inicial do script.
| Modelo | Resolução de entrada | Params (m) | Macs (G) ( pytorch ) | Macs (G) ( aten ) |
|---|---|---|---|---|
| Alexnet | 224x224 | 61.10 | 0,72 | 0,71 |
| ConvNext_base | 224x224 | 88.59 | 15.43 | 15.38 |
| Densenet121 | 224x224 | 7.98 | 2.90 | |
| eficienteNET_B0 | 224x224 | 5.29 | 0,41 | |
| eficienteNET_V2_M | 224x224 | 54.14 | 5.43 | |
| googlenet | 224x224 | 13.00 | 1.51 | |
| INCMECCECTION_V3 | 224x224 | 27.16 | 5.75 | 5.71 |
| maxvit_t | 224x224 | 30.92 | 5.48 | |
| mnasNet1_0 | 224x224 | 4.38 | 0,33 | |
| mobileNet_v2 | 224x224 | 3.50 | 0,32 | |
| mobileNet_v3_large | 224x224 | 5.48 | 0,23 | |
| REGNET_Y_1_6GF | 224x224 | 11.20 | 1.65 | |
| Resnet18 | 224x224 | 11.69 | 1.83 | 1.81 |
| Resnet50 | 224x224 | 25.56 | 4.13 | 4.09 |
| Resnext50_32x4d | 224x224 | 25.03 | 4.29 | |
| shufflenet_v2_x1_0 | 224x224 | 2.28 | 0,15 | |
| squeeZenet1_0 | 224x224 | 1.25 | 0,84 | 0,82 |
| VGG16 | 224x224 | 138.36 | 15.52 | 15.48 |
| VIT_B_16 | 224x224 | 86.57 | 17.61 (errado) | 16.86 |
| wide_resnet50_2 | 224x224 | 68,88 | 11.45 |
Modelo | Resolução de entrada | Params (m) | Macs (G)