计算PyTorch模型的FLOPs:calflops工具详解

Ray

calculate-flops.pytorch

计算PyTorch模型的FLOPs:calflops工具详解

随着深度学习模型日益复杂,准确评估模型的计算复杂度变得越来越重要。FLOPs(浮点运算次数)是衡量模型计算复杂度的重要指标之一。本文将介绍一个强大的FLOPs计算工具 - calflops,它可以方便地计算各种PyTorch神经网络模型的FLOPs、MACs和参数数量。

calflops简介

calflops是一个专门用于计算PyTorch模型理论FLOPs、MACs(乘加运算次数)和参数数量的Python库。它具有以下主要特点:

  1. 支持各种神经网络结构,包括Linear、CNN、RNN、GCN、Transformer等。

  2. 可计算大语言模型(如BERT、LLaMA等)的FLOPs。

  3. 支持自定义模型,只要基于PyTorch实现。

  4. 可打印每个子模块的FLOPs、参数等详细信息。

  5. 支持在线计算Hugging Face模型的FLOPs,无需下载完整权重。

安装和基本使用

calflops可以通过pip安装:

pip install --upgrade calflops

基本使用示例:

from calflops import calculate_flops
from torchvision import models

model = models.alexnet()
batch_size = 1
input_shape = (batch_size, 3, 224, 224)

flops, macs, params = calculate_flops(model=model,
                                      input_shape=input_shape,
                                      output_as_string=True)

print(f"AlexNet FLOPs:{flops} MACs:{macs} Params:{params}")

这将输出AlexNet模型的FLOPs、MACs和参数数量。

计算Transformer模型

对于Transformer类模型,calflops提供了更便捷的使用方式:

from calflops import calculate_flops
from transformers import AutoModel, AutoTokenizer

model_name = "bert-base-uncased"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

flops, macs, params = calculate_flops(model=model,
                                      input_shape=(1, 128),
                                      transformer_tokenizer=tokenizer)

print(f"BERT FLOPs:{flops} MACs:{macs} Params:{params}")

通过传入transformer_tokenizer,calflops可以自动生成合适的输入数据。

在线计算Hugging Face模型

calflops还支持直接计算Hugging Face上的模型,无需下载完整权重:

from calflops import calculate_flops_hf

model_name = "meta-llama/Llama-2-7b"
flops, macs, params = calculate_flops_hf(model_name=model_name,
                                         input_shape=(1, 128))

print(f"{model_name} FLOPs:{flops} MACs:{macs} Params:{params}")

这对于计算大型语言模型的FLOPs特别有用。

详细输出

calflops可以打印每个子模块的详细计算结果:

flops, macs, params = calculate_flops(model, 
                                      input_shape=(1,3,224,224),
                                      print_results=True,
                                      print_detailed=True)

这将输出类似下面的详细信息:

-------------------------------- Detailed Calculated FLOPs Results --------------------------------
Each module caculated is listed after its name in the following order:
params, percentage of total params, MACs, percentage of total MACs, FLOPS, percentage of total FLOPs

AlexNet(
  61.1 M = 100% Params, 715.51 MMACs = 100% MACs, 1.43 GFLOPS = 50% FLOPs
  (features): Sequential(
    2.47 M = 4.04% Params, 666.52 MMACs = 93.15% MACs, 1.33 GFLOPS = 46.58% FLOPs
    (0): Conv2d(23.3 K = 0.04% Params, 105.71 MMACs = 14.77% MACs, 211.41 MFLOPS = 7.39% FLOPs, 3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))
    (1): ReLU(0 = 0% Params, 0.29 MMACs = 0.04% MACs, 0.58 MFLOPS = 0.02% FLOPs, inplace=True)
    (2): MaxPool2d(0 = 0% Params, 0.29 MMACs = 0.04% MACs, 0.58 MFLOPS = 0.02% FLOPs, kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
    ...
  )
  (avgpool): AdaptiveAvgPool2d(0 = 0% Params, 0.01 MMACs = 0% MACs, 0.03 MFLOPS = 0% FLOPs, output_size=(6, 6))
  (classifier): Sequential(
    58.63 M = 95.96% Params, 48.98 MMACs = 6.85% MACs, 97.96 MFLOPS = 3.42% FLOPs
    (0): Dropout(0 = 0% Params, 0 MACs = 0% MACs, 0 FLOPS = 0% FLOPs, p=0.5, inplace=False)
    (1): Linear(37.75 M = 61.79% Params, 37.75 MMACs = 5.28% MACs, 75.5 MFLOPS = 2.64% FLOPs, in_features=9216, out_features=4096, bias=True)
    (2): ReLU(0 = 0% Params, 0 MACs = 0% MACs, 0.01 MFLOPS = 0% FLOPs, inplace=True)
    ...
  )
)

这种详细输出可以帮助我们更好地理解模型中各部分的计算复杂度分布。

其他功能

除了基本的FLOPs计算,calflops还提供了一些高级功能:

  1. 计算反向传播的FLOPs:

    flops, macs, params = calculate_flops(model, 
                                          input_shape=(1,3,224,224),
                                          include_backPropagation=True)
    
  2. 忽略特定模块:

    flops, macs, params = calculate_flops(model, 
                                          input_shape=(1,3,224,224),
                                          ignore_modules=[nn.ReLU, nn.Dropout])
    
  3. 计算模型生成过程的FLOPs:

    flops, macs, params = calculate_flops(model, 
                                          input_shape=(1,128),
                                          forward_mode="generate")
    

结语

calflops是一个功能强大且易用的工具,可以帮助研究人员和工程师快速评估PyTorch模型的计算复杂度。无论是传统的CNN模型还是最新的大语言模型,calflops都能提供准确的FLOPs、MACs和参数统计。通过使用calflops,我们可以更好地理解和优化深度学习模型的计算效率。

在实际应用中,准确计算模型的FLOPs可以帮助我们:

  1. 评估模型在不同硬件上的运行时间
  2. 比较不同模型架构的计算效率
  3. 指导模型压缩和加速
  4. 估算训练和推理的能耗

总之,calflops为PyTorch模型的性能分析提供了一个简单而强大的工具,值得每个深度学习从业者掌握和使用。

avatar
0
0
0
最新项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号