我想进行以下简单的实验。
我正在使用Tensorflow。我有一个大型数组(5000x5000 float32元素)。如何测量将此阵列从RAM移动到GPU内存所需的实际时间?
我知道我可以创建一些非常简单的计算图,运行它并测量它花了多长时间。但是有两个问题。首先,我担心测量的时间将由计算所花费的时间占主导地位,而不是通过从RAM移动数据来实现GPU。其次,如果计算不涉及我提到的大数组,Tensorflow将简化计算图,使得大数组不会在其中,并且它根本不会从RAM移动到GPU。
答案 0 :(得分:2)
解决方案是制作一个简单的基准测试,其中存储器的传输占主导地位。要检查TensorFlow是否不优化转移,可以在结果上添加一个小操作。填充等微小操作的开销应该是几微秒,与向GPU加载100MB(> 5毫秒)相比,这是微不足道的。
def feed_gpu_tensor():
params0 = create_array()
with tf.device('/gpu:0'):
params = tf.placeholder(tf.float32)
result = tf.concat([params, tf.fill([1],1.0)], axis=0)
for i in range(args.num_iters):
with timeit('feed_gpu_tensor'):
sess.run(result.op, feed_dict = {params: params0})
要运行此基准测试,您可以执行此操作
wget https://github.com/diux-dev/cluster/blob/master/yuxin_numpy/tf_numpy_benchmark.py
python tf_numpy_benchmark.py --benchmark=feed_gpu_tensor
我发现在p3.16xlarge上,使用tcmalloc(通过LD_PRELOAD),此副本(100MB)将花费8毫秒。
此外,作为完整性检查,您可以查看时间表。时间线将有MEMCPYH2D操作,这是实际的CPU-> GPU拷贝,您可以使用它来确认它支配您的微基准步骤运行时
相关问题:
对D2H和H2D进行基准测试:https://github.com/tensorflow/tensorflow/issues/17204
64字节对齐输入数据:https://github.com/tensorflow/tensorflow/issues/17233