เครื่องมือนี้ถูกออกแบบมาเพื่อคำนวณปริมาณเชิงทฤษฎีของการดำเนินการเพิ่มจำนวนมากในเครือข่ายประสาท นอกจากนี้ยังสามารถคำนวณจำนวนพารามิเตอร์และพิมพ์ค่าใช้จ่ายในการคำนวณแบบเลเยอร์ของเครือข่ายที่กำหนด
ptflops มีสองแบ็กเอนด์ pytorch และ aten pytorch Backend เป็นมรดกที่พิจารณาแล้วว่า nn.Modules เท่านั้น อย่างไรก็ตามมันยังคงมีประโยชน์เนื่องจากมีการวิเคราะห์แบบพาร์-เลเยอร์ที่ดีกว่าสำหรับ CNNs ในกรณีอื่น ๆ ทั้งหมดขอแนะนำให้ใช้ aten Backend ซึ่งพิจารณาการดำเนินงานของ ATEN และดังนั้นจึงครอบคลุมสถาปัตยกรรมแบบจำลองมากขึ้น (รวมถึงหม้อแปลง) แบ็กเอนด์เริ่มต้นคือ aten กรุณาอย่าใช้แบ็กเอนด์ pytorch สำหรับสถาปัตยกรรมหม้อแปลง
aten Backendverbose=True เพื่อดูการดำเนินการที่ไม่ได้รับการพิจารณาในระหว่างการคำนวณความซับซ้อนnn.Module โมดูลที่ลึกกว่าในระดับที่สองของการทำรังไม่ได้แสดงในสถิติต่อชั้นignore_modules บังคับให้ ptflops เพิกเฉยต่อโมดูลที่ระบุไว้ สิ่งนี้มีประโยชน์สำหรับวัตถุประสงค์ในการวิจัย ตัวอย่างเช่นหนึ่งสามารถวาง convolutions ทั้งหมดจากกระบวนการนับที่ระบุ ignore_modules=[torch.ops.aten.convolution, torch.ops.aten._convolution] pytorchการสนับสนุนการทดลอง:
torch.nn.functional.* และ tensor.* การดำเนินการ ดังนั้นการดำเนินการที่ไม่ได้รับการสนับสนุนจึงไม่ได้มีส่วนร่วมในการประมาณความซับซ้อนขั้นสุดท้าย ดู ptflops/pytorch_ops.py:FUNCTIONAL_MAPPING,TENSOR_OPS_MAPPING เพื่อตรวจสอบ ops ที่รองรับ บางครั้งตะขอระดับการทำงานขัดแย้งกับตะขอสำหรับ nn.Module (ตัวอย่างเช่นที่กำหนดเอง) ในกรณีนั้นการนับด้วย ops เหล่านี้สามารถปิดใช้งานได้โดยผ่าน backend_specific_config={"count_functional" : False}ptflops เปิดตัวโมเดลที่กำหนดในเทนเซอร์แบบสุ่มและประมาณจำนวนการคำนวณระหว่างการอนุมาน โมเดลที่ซับซ้อนอาจมีอินพุตหลายอย่างบางตัวอาจเป็นทางเลือก ในการสร้างอินพุตที่ไม่ใช่เรื่องสำคัญเราสามารถใช้อาร์กิวเมนต์ input_constructor ของ get_model_complexity_info input_constructor เป็นฟังก์ชั่นที่ใช้ความละเอียดเชิงพื้นที่อินพุตเป็น tuple และส่งคืน dict พร้อมอาร์กิวเมนต์อินพุตที่มีชื่อของโมเดล ถัดไปคำสั่งนี้จะถูกส่งผ่านไปยังโมเดลเป็นอาร์กิวเมนต์คำหลักverbose อนุญาตให้รับข้อมูลเกี่ยวกับโมดูลที่ไม่ได้มีส่วนร่วมกับตัวเลขสุดท้ายignore_modules บังคับให้ ptflops เพิกเฉยต่อโมดูลที่ระบุไว้ สิ่งนี้มีประโยชน์สำหรับวัตถุประสงค์ในการวิจัย ตัวอย่างเช่นหนึ่งสามารถวาง convolutions ทั้งหมดจากกระบวนการนับที่ระบุ ignore_modules=[torch.nn.Conv2d] Pytorch> = 2.0 ใช้ pip install ptflops==0.7.2.2 เพื่อทำงานกับคบเพลิง 1.x
จาก PYPI:
pip install ptflopsจากที่เก็บนี้:
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 ))หาก ptflops มีประโยชน์สำหรับรายงานกระดาษหรือเทคโนโลยีของคุณโปรดอ้างอิงฉัน:
@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},
}
ขอบคุณ @warmspringwinds และ Horace เขาสำหรับสคริปต์เวอร์ชันเริ่มต้น
| แบบอย่าง | ความละเอียดอินพุต | 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 | |
| efficientnet_b0 | 224x224 | 5.29 | 0.41 | |
| Efficientnet_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 (ผิด) | 16.86 |
| wide_resnet50_2 | 224x224 | 68.88 | 11.45 |
รุ่น | ความละเอียดอินพุต Params (M) | Macs (G)