Esta herramienta está diseñada para calcular la cantidad teórica de operaciones multiplicadas en redes neuronales. También puede calcular el número de parámetros e imprimir el costo computacional por capa de una red determinada.
ptflops tiene dos backends, pytorch y aten . pytorch Backend es un legado, considera solo nn.Modules . Sin embargo, sigue siendo útil, ya que proporciona un mejor análisis de la capa par para CNN. En todos los demás casos, se recomienda utilizar aten Backend, lo que considera las operaciones de Aten y, por lo tanto, cubre más arquitecturas de modelos (incluidos los transformadores). El backend predeterminado es aten . Por favor, no use pytorch Backend para las arquitecturas de transformadores.
aten backendverbose=True para ver las operaciones que no se consideraron durante el cálculo de la complejidad.nn.Module . Los módulos más profundos en el segundo nivel de anidación no se muestran en las estadísticas de por capa.ignore_modules La opción obliga ptflops a ignorar los módulos enumerados. Esto puede ser útil para fines de investigación. Por ejemplo, uno puede eliminar todas las convoluciones del proceso de conteo que especifica ignore_modules=[torch.ops.aten.convolution, torch.ops.aten._convolution] . pytorchApoyo experimental:
torch.nn.functional.* Y tensor.* . Por lo tanto, las operaciones no respaldadas no contribuyen a la estimación de complejidad final. Consulte ptflops/pytorch_ops.py:FUNCTIONAL_MAPPING,TENSOR_OPS_MAPPING para verificar las operaciones compatibles. A veces, los ganchos de nivel funcional entran en conflicto con ganchos para nn.Module (por ejemplo, personalizados). En ese caso, contar con estos OP se puede deshabilitar pasando backend_specific_config={"count_functional" : False} .ptflops lanza un modelo dado en un tensor aleatorio y estima la cantidad de cálculos durante la inferencia. Los modelos complicados pueden tener varias entradas, algunas de ellas podrían ser opcionales. Para construir entrada no trivial, uno puede usar el argumento input_constructor del get_model_complexity_info . input_constructor es una función que toma la resolución espacial de entrada como una tupla y devuelve un dict con argumentos de entrada con nombre del modelo. A continuación, este dict se pasaría al modelo como argumentos de palabras clave.verbose permite obtener información sobre módulos que no contribuyen a los números finales.ignore_modules La opción obliga ptflops a ignorar los módulos enumerados. Esto puede ser útil para fines de investigación. Por ejemplo, uno puede eliminar todas las convoluciones del proceso de conteo que especifica ignore_modules=[torch.nn.Conv2d] . Pytorch> = 2.0. Use pip install ptflops==0.7.2.2 para trabajar con la antorcha 1.x.
De Pypi:
pip install ptflopsDe este repositorio:
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 ))Si Ptflops fue útil para su informe de papel o tecnología, por favor cíqueme:
@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},
}
Gracias a @WarmSpringWinds y Horace, él por la versión inicial del script.
| Modelo | Resolución de entrada | Parámetros (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 | |
| Inception_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 (incorrecto) | 16.86 |
| Wide_Resnet50_2 | 224x224 | 68.88 | 11.45 |
Modelo | Resolución de entrada | Parámetros (m) | Macs (g)