URL(s)存在问题的:
- https://www.tensorflow.org/guide/eager#performance
- https://www.tensorflow.org/guide/intro_to_graphs#seeing_the_speed-up
- https://www.tensorflow.org/api_docs/python/tf/experimental/async_scope
问题描述(需要改变的地方):
在https://www.tensorflow.org/guide/eager#performance示例代码中的注解指出:
# tf.matmul can return before completing the matrix multiplication
# (e.g., can return after enqueing the operation on a CUDA stream).
# The x.numpy() call below will ensure that all enqueued operations
# have completed
然而,在https://www.tensorflow.org/guide/intro_to_graphs#seeing_the_speed-up的基准脚本中并没有包含numpy()
调用:
def power(x, y):
result = tf.eye(10, dtype=tf.dtypes.int32)
for _ in range(y):
result = tf.matmul(x, result)
return result
print("Eager execution:", timeit.timeit(lambda: power(x, 100), number=1000))
power_as_graph = tf.function(power)
print("Graph execution:", timeit.timeit(lambda: power_as_graph(x, 100), number=1000))
第二个示例是否正确?我们是否需要一个numpy()
调用来确保计算完成?
改进图函数执行文档
在阅读https://www.tensorflow.org/guide/intro_to_graphs#graph_execution_vs_eager_execution和https://www.tensorflow.org/guide/function指南时,我没有找到任何关于函数执行可能异步性质的引用。
我们能否通过声明
A graph function can return before completing the computation (e.g., can return after enqueing the operation on a CUDA stream).
来改进指南?如果不是这样,那么我们能明确地声明吗?
async_scope
在https://www.tensorflow.org/api_docs/python/tf/experimental/async_scope的描述中提到:“范围内的函数调用可以在实际执行完成之前返回。”但是查看源代码表明,这个范围控制远程执行是否同步。
本地GPU上的函数执行状态如何?这是否受到此范围的影响?您能否用这些信息扩展文档字符串?
5条答案
按热度按时间vuktfyat1#
看起来,关于“同步”这个术语,我们的意思似乎有所不同。
async_scope
和tf.config.experimental.set_synchronous_execution
使用的意义与我们在CUDA术语中使用的含义不同。参考:async_wait(由
set_synchronous_execution
使用)调用SyncExecutors,它使用WaitForAllPendingNodes。C Package 器的文档字符串如下:相反,在GPU编程的背景下,当我们提到同步或异步内核执行时,我们指的是主机和设备之间的同步。
对于那些正在对TF模型的性能进行基准测试的人来说,如果文档能澄清这个区别,那将是非常有用的。
hsgswve42#
与此相反,https://www.tensorflow.org/guide/intro_to_graphs#seeing_the_speed-up 中的基准脚本不包含
numpy()
调用。[...]
第二个示例是否正确?我们是否需要一个
numpy()
调用来确保计算完成?我使用 Nsight 分析工具运行了一些基准测试,以调查这个问题,确实需要一个
numpy()
调用。否则测量到的时间只对应于启动时间。我还确认set_synchronous_execution
和async_scope
不影响 GPU 同步。(没有
numpy()
调用的测量时间用绿色高亮显示)w9apscun3#
由于在文档 https://www.tensorflow.org/guide/intro_to_graphs#seeing_the_speed-up 中,比较的是 eager 和
tf.function
,如果你使用 numpy() 会抛出错误,因为numpy()
不适用于图模式或 tf.function 内部。pdkcd3nj4#
这个问题已经被自动标记为过时,因为它没有最近的活动。如果没有进一步的活动发生,它将被关闭。谢谢。
uoifb46i5#
感谢@sachinprasadhs的回答。如果我们想要比较任何计算的性能,我们需要确保计算已经完成。关于这个问题:当我们使用GPU内核进行工作时,如何确保计算已经完成。对于https://www.tensorflow.org/guide/intro_to_graphs#seeing_the_speed-up链接,这是如何插入numpy调用以确保同步的方法: