Alat ini dirancang untuk menghitung jumlah teoritis operasi multiply-add dalam jaringan saraf. Ini juga dapat menghitung jumlah parameter dan mencetak biaya komputasi per-lapisan dari jaringan yang diberikan.
ptflops memiliki dua backends, pytorch dan aten . pytorch Backend adalah warisan, ia hanya mempertimbangkan nn.Modules . Namun, ini masih berguna, karena memberikan analitik par-layer yang lebih baik untuk CNNs. Dalam semua kasus lain, disarankan untuk menggunakan aten backend, yang mempertimbangkan operasi aten, dan oleh karena itu mencakup lebih banyak arsitektur model (termasuk transformator). Backend default adalah aten . Tolong, jangan gunakan backend pytorch untuk arsitektur transformator.
aten Backendverbose=True untuk melihat operasi yang tidak dipertimbangkan selama perhitungan kompleksitas.nn.Module . Modul yang lebih dalam di tingkat kedua sarang tidak ditunjukkan dalam statistik per-layer.ignore_modules memaksa ptflops untuk mengabaikan modul yang terdaftar. Ini bisa berguna untuk tujuan penelitian. Misalnya, seseorang dapat menjatuhkan semua konvolusi dari proses penghitungan yang menentukan ignore_modules=[torch.ops.aten.convolution, torch.ops.aten._convolution] . pytorchDukungan Eksperimental:
torch.nn.functional.* Dan tensor.* Oleh karena itu operasi yang tidak didukung tidak berkontribusi pada estimasi kompleksitas akhir. Lihat ptflops/pytorch_ops.py:FUNCTIONAL_MAPPING,TENSOR_OPS_MAPPING untuk memeriksa OP yang didukung. Terkadang konflik kait tingkat fungsional dengan kait untuk nn.Module (misalnya, yang kustom). Dalam hal ini, menghitung dengan OPS ini dapat dinonaktifkan dengan melewati backend_specific_config={"count_functional" : False} .ptflops meluncurkan model yang diberikan pada tensor acak dan memperkirakan jumlah perhitungan selama inferensi. Model yang rumit dapat memiliki beberapa input, beberapa di antaranya bisa opsional. Untuk membangun input non-sepele, seseorang dapat menggunakan argumen input_constructor dari get_model_complexity_info . input_constructor adalah fungsi yang mengambil resolusi spasial input sebagai tuple dan mengembalikan dikt dengan argumen input yang disebutkan dari model. Selanjutnya, dikt ini akan diteruskan ke model sebagai argumen kata kunci.verbose memungkinkan untuk mendapatkan informasi tentang modul yang tidak berkontribusi pada angka akhir.ignore_modules memaksa ptflops untuk mengabaikan modul yang terdaftar. Ini bisa berguna untuk tujuan penelitian. Misalnya, seseorang dapat menjatuhkan semua konvolusi dari proses penghitungan yang menentukan ignore_modules=[torch.nn.Conv2d] . Pytorch> = 2.0. Gunakan pip install ptflops==0.7.2.2 untuk bekerja dengan Torch 1.x.
Dari pypi:
pip install ptflopsDari repositori ini:
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 ))Jika PTFLOPS berguna untuk kertas atau laporan teknologi Anda, silakan kutip saya:
@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},
}
Terima kasih kepada @WarmSpringWinds dan Horace He untuk versi awal skrip.
| Model | Resolusi input | 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 | |
| efisienNet_B0 | 224x224 | 5.29 | 0.41 | |
| efisiensinet_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 (salah) | 16.86 |
| wide_resnet50_2 | 224x224 | 68.88 | 11.45 |
Model | Resolusi Input | Params (m) | Mac (g)