gpt4 book ai didi

python - 对 tensorflow 图的部分进行基准测试的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 09:37:42 25 4
gpt4 key购买 nike

我想对图表的某些部分进行基准测试,为了简单起见,我使用 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)

    最佳答案

    回答您的主要问题“对 tensorflow 图的部分进行基准测试的正确方法是什么?”:

    Tensorflow 包含一个抽象类,为 tensorflow 基准测试提供帮助:Benchmark .

    所以,一个 Benchmark可以制作对象并用于在 tensorflow 图的一部分上执行基准测试。在下面的代码中,实例化了一个基准对象,然后 run_op_benchmark方法被调用。 run_op_benchmark通过 session ,conv_block张量(在这种情况下),一个 feed_dict ,烧录迭代次数,所需的最小迭代次数,一个 bool 标志,以防止基准测试也计算内存使用情况和一个方便的名称。该方法返回一个包含基准测试结果的字典:

    benchmark = tf.test.Benchmark()
    results = benchmark.run_op_benchmark(sess=sess, op_or_tensor=z_tf,
    feed_dict={x_tf: x_np}, burn_iters=2,
    min_iters=n_iter,
    store_memory_usage=False, name='example')

    可以按如下方式将此代码块插入您的代码中,以比较两个基准测试:
    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.compat.v1.variable_scope('var_scope'):
    w_0 = tf.get_variable('w_0', [kernel_size, kernel_size, in_channels, out_channels], initializer=tf.keras.initializers.glorot_normal())
    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'))

    # USING TENSORFLOW BENCHMARK
    benchmark = tf.test.Benchmark()
    results = benchmark.run_op_benchmark(sess=sess, op_or_tensor=z_tf,
    feed_dict={x_tf: x_np}, burn_iters=2, min_iters=n_iter,
    store_memory_usage=False, name='example')

    return results


    if __name__ == '__main__':
    results = run_graph_part(conv_block, spatial_size=128, n_channels=32, n_iter=100)

    tensorflow 库本身中的基准测试类的这种实现提供了有关您其他问题的答案的提示。由于 tensorflow 实现不需要使用新的 feed_dict对于每个基准测试迭代,问题 1) 的答案似乎是 x_np 可以吗?循环中使用的是相同的还是我每次都需要重新生成它?是可以使用相同的 x_np每个循环。关于问题 2),似乎有必要进行一些“热身”。 tensorflow 库实现建议的默认燃烧迭代次数为 2。关于问题 3), timeit 是测量小代码片段执行时间的绝佳工具。但是,tensorflow 库本身使用 time.time()以与您所做的类似的方式: run_op_benchmark (source) .有趣的是, tensorflow 基准实现报告的是中值而不是操作壁时间的平均值(大概是为了使基准对异常值更加稳健)。

    关于python - 对 tensorflow 图的部分进行基准测试的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61178521/

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