请问MXNet Gluon如何求出网络的计算量(乘法和加法次数), 即论文中使用的GFLOPS?

以下的讨论是基于:
MXNet版本: 可运行这个来得到pip show mxnet; python -c 'import mxnet; print mxnet.__version__'
操作系统:

目前我们是手算的。。如果要自动化就需要对每个layer定义出计算FLOPs的函数。

求一个实现呀!

这个难点在于每个op都要加一个算flops的method…工作量有点大:joy:

准确的说是要每个都加,实际上不需要实现那么多,基本的conv,pool,fc有就可以,这样至少可以涵盖90%的网络和需求,特殊的层(需求)自己算就好了。很多开源的实现也是这样的,只是他们的API不太好用,各种各样的报错。这个需求的痛点在于实际上我就只有这三个op要算,但是有一堆,每个输入输出形状还不一样,手算起来太头疼。

这么说是的。有兴趣的话,你可以到 MXNet Issue 或者是 dev list 上开一个讨论,把主要要用到的block加进来(不只是CV领域的),这样可以比较清楚地估计做这个计算要大约多大的工作量。

我觉得把模型保存为onnx,然后用第三方工具计算flops会好一些。因为在实现上,即使是同一个模型,不同框架算出的flops可能不一样。

我还是去开个issue吧,对于我而言gluon直接能算是最简单的.
@wkcn 不过能介绍下onnx的工具吗,mxnet实现之前我可能会用到.不同框架算的不一样是因为支持层的数量不同,op计算量的公式都是固定的.

我没找过这方面的工具。
比如RoIPooling层,不同的实现flops不一样,有一个标准会好比较一些。

这种层不应该在最迫切的需求范围内,他们的数量很少,即使手算区别也不大,而且计算量还不确定.(而且two stage的检测是不是都快凉了:joy:)

我搜了一下,根据onnx模型计算flops的库比较少。

这里有一个:

我写了一个issue
@hetong007 看看有什么建议

这个计算量也和实现有关系。比如convoluiton,direct的和winograd的实现计算量就不同。
另外知道多少flops的目的是什么?

Conv是有公式的吧,不考虑特殊的优化公式是故定的呀.
flops可以直接量化网络的推理速度,我近期的需求是有一个项目直接限制了模型了GFLOPs.
我要在这个限制下设计修改网络.但是手算简直太麻烦了.
还有就是很多研究也要比较模型的推理速度.GFLOPs是一个非常理想的指标.

@pengzhao-intel 我看了您的回帖,我的意思是只考虑标准情况下计算量.不考虑任何优化的实现.
在这种情况下所有的基础的操作(conv, pooling, relu)的计算量都是可以被唯一的公式量化(不同操作公式不同), 这样也就有可比性了.

明白,你需要的是一个静态分析。个人一般是用个excel自己算下~~~

哈哈,我这不是只会用python吗:joy::joy:

刚发现一个项目,感觉不错
里面有计算GFlops的代码

我可以自己写一个,感觉不难…


随便写了一个,只写了Conv2d 和Dense. 按需自取吧.

2赞