gpt4 book ai didi

Tensorflow - 推理时间评估

转载 作者:行者123 更新时间:2023-12-02 20:31:48 30 4
gpt4 key购买 nike

我正在使用 Tensorflow 评估不同的图像分类模型,特别是使用不同设备的推理时间。我想知道我是否必须使用预训练模型。我正在使用生成 1000 张随机输入图像的脚本,将它们一张一张地馈送到网络,并计算平均推理时间。

谢谢!

最佳答案

让我先警告一下:

大多数人以错误的方式完成了神经网络的正确基准测试。对于 GPU,有磁盘 I/O、内存带宽、PCI 带宽和 GPU 速度本身。然后存在实现错误,例如在 TensorFlow 中使用 feed_dict。对于这些模型的高效训练也是如此。

让我们从一个考虑 GPU 的简单示例开始

import tensorflow as tf
import numpy as np

data = np.arange(9 * 1).reshape(1, 9).astype(np.float32)
data = tf.constant(data, name='data')

activation = tf.layers.dense(data, 10, name='fc')

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
sess.run(tf.global_variables_initializer())
print sess.run(activation)

它所做的只是创建一个常量张量并应用一个全连接层。所有操作都放在GPU上:

fc/bias: (VariableV2): /job:localhost/replica:0/task:0/device:GPU:0
2018-01-25 09:55:01.587959: I tensorflow/core/common_runtime/placer.cc:874] fc/bias: (VariableV2)/job:localhost/replica:0/task:0/device:GPU:0
fc/bias/read: (Identity): /job:localhost/replica:0/task:0/device:GPU:0
2018-01-25 09:55:01.587970: I tensorflow/core/common_runtime/placer.cc:874] fc/bias/read: (Identity)/job:localhost/replica:0/task:0/device:GPU:0
fc/bias/Assign: (Assign): /job:localhost/replica:0/task:0/device:GPU:0
2018-01-25 09:55:01.587979: I tensorflow/core/common_runtime/placer.cc:874] fc/bias/Assign: (Assign)/job:localhost/replica:0/task:0/device:GPU:0
fc/kernel: (VariableV2): /job:localhost/replica:0/task:0/device:GPU:0
2018-01-25 09:55:01.587988: I tensorflow/core/common_runtime/placer.cc:874] fc/kernel: (VariableV2)/job:localhost/replica:0/task:0/device:GPU:0
fc/kernel/read: (Identity): /job:localhost/replica:0/task:0/device:GPU:0
...

看起来不错吧?对该图进行基准测试可能会粗略估计 TensorFlow 图的执行速度。只需将 tf.layers.dense 替换为您的网络即可。如果您接受使用 pythons time 包的开销,您就完成了。

但不幸的是,这还不是全部。从张量运算 'fc/BiasAdd:0' 访问设备内存 (GPU) 并将结果复制回主机内存(CPU、RAM)。因此在某些时候存在 PCI 带宽限制。还有一个 python 解释器也在某处,占用 CPU 周期。

此外,操作 放置在 GPU 上,而不是 本身。不确定,您使用的是哪个 TF 版本。但即使是 tf.const 也不能保证在旧版本中放置在 GPU 上。我只在编写自己的 Ops 时才注意到这一点。顺便说一句:请参阅我在 how TF decides where to place operations 上的其他答案.

现在,困难的部分是:这取决于您的图表。在某处放置一个 tf.cond/tf.where 会使基准测试变得更加困难。现在,您需要经历所有这些在有效训练深度网络时需要解决的问题。意思是,一个简单的 const 不能解决所有情况。

解决方案从放置/staging 开始一些值通过运行直接进入GPU内存

stager = data_flow_ops.StagingArea([tf.float32])
enqeue_op = stager.put([dummy])
dequeue_op = tf.reduce_sum(stager.get())

for i in range(1000):
sess.run(enqeue_op)

事先。但同样,TF 资源管理器正在决定它把值放在哪里(并且不能保证排序或丢弃/保留值)。

总结一下:基准测试是一项非常复杂的任务,因为基准测试 CUDA 代码非常复杂。现在,您拥有 CUDA 和 python 部分。这是一个非常主观的任务,取决于您对哪些部分感兴趣(只是图形,包括磁盘 i/o,...)

我通常使用示例中的 tf.const 输入运行图形,并使用 profiler查看图中发生了什么。

有关如何提高运行时性能的一些一般想法,您可能需要阅读 Tensorflow Performance Guide

关于Tensorflow - 推理时间评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438245/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com