神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

news/2025/2/8 19:08:48/

引言

最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。

看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数),而很多其他文章提到的还是FLOPs(Floating Point Operations,浮点运算次数)。
Pytorch: 采用thop库正确计算模型计算量FLOPs和模型参数Params 【误区更正】
因此对这两种方法进行测试,来验证thop库函数得到的运算量到底是MACs还是Flops。

1 使用deepspeed库函数计算参数量和运算量

对于deepspeed库的安装就不多介绍了,对于window系统,deepspeed的最新版本可以直接通过pip下载。不需要像以前一样安装过程一把辛酸泪。(2025.2.3)

win10上安装看一下文档:
链接: windows系统安装deepspeed说明文档

以下以resnet18为例子

import sys
import torch
from deepspeed.profiling.flops_profiler import get_model_profile
torch.backends.cudnn.deterministic = True
import torchvision.models as modelsdef main(argv):device = "cuda:0"net = models.resnet18()net.to(device).eval()width, height = 224, 224flops, macs, params = get_model_profile(net, (1,3,width,height))print("params: ", params)print("flops: ", flops)print("macs: ", macs)
if __name__ == "__main__":main(sys.argv)

结果如下:
打印了每一层的运算量和参数量:
在这里插入图片描述
最后打印的结果如下:
在这里插入图片描述

2 使用thop库函数计算运算量和参数量

import torch
from thop import profile
from thop import clever_format
import torchvision.models as models# 假设我们有一个预训练的模型
model = models.resnet18()
model.eval()# 使用thop分析模型的运算量和参数量
input = torch.randn(1, 3, 224, 224)  # 随机生成一个输入张量,这个尺寸应该与模型输入的尺寸相匹配
MACs, params = profile(model, inputs=(input,))# 将结果转换为更易于阅读的格式
MACs, params = clever_format([MACs, params], '%.3f')print(f"运算量:{MACs}, 参数量:{params}")

在这里插入图片描述

3.结论

从以上两种方法对于ResNet-18的运算量的比较可以得知,
deepspeed库统计ResNet-18的运算量FLOPs为3.64G,MACs为1.81G。
thop库统计 ResNet-18的运算量为1.824G,这个数值上更接近deepspeed库的MACs或者是FLOPs/2。

所以 thop库获得的运算量更可能是MACs而不是Flops


http://www.ppmy.cn/news/1570386.html

相关文章

【分块解决大文件上传的最佳实践】

前言 前几天看了一篇关于大文件上传分块实现的博客,代码实现过于复杂且冗长,而且没有进行外网上传的测试。因此,我决定自己动手实现一个大文件上传,并进行优化。 实现思路 在许多应用中,大文件上传是常见的需求&…

低代码开发中的创新实践

在软件开发领域,传统开发模式长期占据主导地位,其严谨的流程和规范为众多大型系统的构建奠定了基础。但随着数字化浪潮的席卷,业务需求的快速变化和对开发效率的高要求,传统开发思维逐渐显露出局限性。低代码开发的兴起&#xff0…

数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…

docker常用基础

镜像 拉取 docker pull id删除 docker rmi id查看 docker images容器 运行 docker run -p 本:远 id查看 docker ps停止 docker stop id转换 导出容器(镜像实例的文件变化) docker export id > 名.tar导入容器(镜像实例的文件变化…

C++多线程编程——call_once和单例模式

目录 1. 前言 2. call_once和once_flag 3. 后记 3.1 单例类的析构问题 3.2 饿汉式单例模式的线程安全问题 1. 前言 之前在讲解单例模式时,有提到懒汉式单例模式使用了双重检测Double-Checked Locking Pattern (DCLP)来解决多线程的安全访问问题。但是该方法也…

第30节课:前端架构与设计模式—构建高效可维护的Web应用

目录 前端架构设计前端架构的重要性前端架构设计原则模块化可维护性可扩展性性能优化 前端架构设计方法MVC(Model-View-Controller)MVVM(Model-View-ViewModel)单页应用(SPA) 设计模式在前端的应用设计模式…

PHP-综合3

[题目信息]: 题目名称题目难度PHP-综合32 [题目考点]: PHP综合训练[Flag格式]: SangFor{IoOvaUFeUjE1Lt2hatHL_z9uKyTLu0Cn}[环境部署]: docker-compose.yml文件或者docker tar原始文件。 http://分配ip:2047[题目writeup]:…

Oracle迁移到MySQL

Oracle迁移到MySQL业务需要全面改造适配,数据库对象和业务SQL语法需要一对一映射分析如何改写,根据业务使用实际情况评估改造适配成本较高。 目前,已有数据库产品能力缺少自动化迁移工具,需要依赖生态产品能力,比如云和…