当前位置: 首页 > 面试题库 >

TensorFlow:有没有一种方法可以测量模型的FLOPS?

阳建弼
2023-03-14
问题内容

在此问题中找到了我能找到的最接近的示例:https
:
//github.com/tensorflow/tensorflow/issues/899

使用此最小的可复制代码:

import tensorflow as tf
import tensorflow.python.framework.ops as ops 
g = tf.Graph()
with g.as_default():
  A = tf.Variable(tf.random_normal( [25,16] ))
  B = tf.Variable(tf.random_normal( [16,9] ))
  C = tf.matmul(A,B) # shape=[25,9]
for op in g.get_operations():
  flops = ops.get_stats_for_node_def(g, op.node_def, 'flops').value
  if flops is not None:
    print 'Flops should be ~',2*25*16*9
    print '25 x 25 x 9 would be',2*25*25*9 # ignores internal dim, repeats first
    print 'TF stats gives',flops

但是,返回的FLOPS始终为“无”。有没有一种方法可以具体测量FLOPS,尤其是PB文件?


问题答案:

有点晚了,但也许将来对某些访客有帮助。对于您的示例,我成功测试了以下代码段:

g = tf.Graph()
run_meta = tf.RunMetadata()
with g.as_default():
    A = tf.Variable(tf.random_normal( [25,16] ))
    B = tf.Variable(tf.random_normal( [16,9] ))
    C = tf.matmul(A,B) # shape=[25,9]

    opts = tf.profiler.ProfileOptionBuilder.float_operation()    
    flops = tf.profiler.profile(g, run_meta=run_meta, cmd='op', options=opts)
    if flops is not None:
        print('Flops should be ~',2*25*16*9)
        print('25 x 25 x 9 would be',2*25*25*9) # ignores internal dim, repeats first
        print('TF stats gives',flops.total_float_ops)

也可以将分析器与Keras以下代码段结合使用:

import tensorflow as tf
import keras.backend as K
from keras.applications.mobilenet import MobileNet

run_meta = tf.RunMetadata()
with tf.Session(graph=tf.Graph()) as sess:
    K.set_session(sess)
    net = MobileNet(alpha=.75, input_tensor=tf.placeholder('float32', shape=(1,32,32,3)))

    opts = tf.profiler.ProfileOptionBuilder.float_operation()    
    flops = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='op', options=opts)

    opts = tf.profiler.ProfileOptionBuilder.trainable_variables_parameter()    
    params = tf.profiler.profile(sess.graph, run_meta=run_meta, cmd='op', options=opts)

    print("{:,} --- {:,}".format(flops.total_float_ops, params.total_parameters))

希望我能帮上忙!



 类似资料:
  • 问题内容: doIt函数将打印“ dad”。有没有办法让它打印“儿子”? 问题答案: 是。但是就变量而言,它会被覆盖(将新值赋予变量。将新定义赋予函数是Override)。 在父类的块中使用时,该值将得到反映 如果变量是静态的,则在初始化时使用静态块更改其值, 否则更改构造函数。 你还可以稍后在任何块中更改该值。它将反映在超一流

  • 问题内容: 我在做游戏,遇到一个问题…当我尝试保存时,JSON失败,并报告正在某处进行循环引用。我认为它实际上不是,我看不到它,因此是否有一种算法或其他任何方法可以告诉我确切的位置(在哪些对象和事物之间)?另外,是否有可以保存循环引用的JSON替代方案?我正在运行一个node.js服务器,我看到了,但是我无法使其正常工作(它不是作为模块组成的,我可以在我的代码中使用require())。 问题答案

  • 问题内容: 如果通过创建缓冲区,则该内存将位于Java堆之外。有没有一种方法可以以跨平台的方式测量应用程序中此类内存的使用情况,类似于我可以使用and 来测量Java堆使用情况的方法? 问题答案: 您可以使用反射来获取Java 7的OpenJDK / HotSpot。没有独立于平台的方式,它仅通过ByteBuffer.allocateDirect()向您显示用法,而没有其他分配本地内存的方式。 另

  • 我知道一个测试可以通过运行来运行,在sbt中, 有没有办法告诉sbt/scalatest在没有标签的情况下运行单个测试?例如: 这意味着“在类中运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心去标记它们,那么有没有办法在没有标签的情况下运行单个测试?

  • 问题内容: 我希望能够在一个程序包中编写一个Java类,该程序包可以访问另一个程序包中某个类的非公共方法,而不必使其成为另一个类的子类。这可能吗? 问题答案: 这是我在JAVA中用来复制朋友机制的一个小技巧。 可以说我有一节课和另外一节课。由于仇恨原因,他们处于不同的包裹(家庭)中。 想要并且只想让她。 在中,将声明Romeo为(情人),friend但是在Java中没有这样的东西。 这是类和技巧:

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。