【发布时间】:2020-07-25 11:01:05
【问题描述】:
我想对图表的某些部分进行基准测试,为了简单起见,我使用 conv_block 即 conv3x3。
- 循环中使用的
x_np可以相同还是每次都需要重新生成? - 在运行实际基准测试之前是否需要进行一些“热身”运行(似乎这是 GPU 基准测试所必需的)?如何正确地做到这一点?
sess.run(tf.global_variables_initializer())够了吗? - 在 python 中测量时间的正确方法是什么,即更精确的方法。
- 在运行脚本之前我是否需要在 linux 上重置一些系统缓存(也许禁用 np.random.seed 就足够了)?
示例代码:
import os
import time
import numpy as np
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
np.random.seed(2020)
def conv_block(x, kernel_size=3):
# Define some part of graph here
bs, h, w, c = x.shape
in_channels = c
out_channels = c
with tf.variable_scope('var_scope'):
w_0 = tf.get_variable('w_0', [kernel_size, kernel_size, in_channels, out_channels], initializer=tf.contrib.layers.xavier_initializer())
x = tf.nn.conv2d(x, w_0, [1, 1, 1, 1], 'SAME')
return x
def get_data_batch(spatial_size, n_channels):
bs = 1
h = spatial_size
w = spatial_size
c = n_channels
x_np = np.random.rand(bs, h, w, c)
x_np = x_np.astype(np.float32)
#print('x_np.shape', x_np.shape)
return x_np
def run_graph_part(f_name, spatial_size, n_channels, n_iter=100):
print('=' * 60)
print(f_name.__name__)
tf.reset_default_graph()
with tf.Session() as sess:
x_tf = tf.placeholder(tf.float32, [1, spatial_size, spatial_size, n_channels], name='input')
z_tf = f_name(x_tf)
sess.run(tf.global_variables_initializer())
x_np = get_data_batch(spatial_size, n_channels)
start_time = time.time()
for _ in range(n_iter):
z_np = sess.run(fetches=[z_tf], feed_dict={x_tf: x_np})[0]
avr_time = (time.time() - start_time) / n_iter
print('z_np.shape', z_np.shape)
print('avr_time', round(avr_time, 3))
n_total_params = 0
for v in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='var_scope'):
n_total_params += np.prod(v.get_shape().as_list())
print('Number of parameters:', format(n_total_params, ',d'))
if __name__ == '__main__':
run_graph_part(conv_block, spatial_size=128, n_channels=32, n_iter=100)
【问题讨论】:
-
我认为您的做法是合理的,尽管您也可以考虑使用
timeit模块。我只需要更改几件事:1)在开始测量时间之前至少运行一次计算,因为 TF 在第一次评估中通常需要更长的时间 2)在开始循环之前将[z_tf]和{x_tf: x_np}保存到变量中在每次调用中重复使用它们,以节省创建列表和字典的时间。
标签: python linux tensorflow time benchmarking