2017-07-12 19 views
1

這裏是爲了澄清我的意思是一個例子:
首先session.run():
First run of a TensorFlow session第一個tf.session.run()與以後的運行有很大不同。爲什麼?

後來session.run():
Later runs of a TensorFlow session

我明白TensorFlow在這裏做一些初始化,但我想知道這在源代碼中的位置。這發生在CPU和GPU上,但在GPU上效果更加突出。例如,在明確的Conv2D操作的情況下,第一次運行在GPU流中具有更大量的Conv2D操作。事實上,如果我改變Conv2D的輸入大小,它可能會從幾十到幾百個流Conv2D操作。但是,在稍後的運行中,GPU流中始終只有5個Conv2D操作(無論輸入大小如何)。在CPU上運行時,與第一次運行相比,我們在第一次運行中保留相同的操作列表,但我們確實看到相同的時間差異。

TensorFlow源的哪個部分負責此行爲? GPU操作在哪裏「分裂」?

感謝您的幫助!

回答

1

tf.nn.conv_2d()運算需要更長的時間,因爲—默認— TensorFlow使用cuDNN的自動調諧設備來選擇如何儘可能快地運行後續迴旋第一tf.Session.run()調用運行。您可以看到自動調諧調用here

有一個undocumented environment variable,您可以使用它來禁用自動調諧。當您啓動運行TensorFlow的進程(例如python解釋器)以禁用其使用時,請設置TF_CUDNN_USE_AUTOTUNE=0

+0

謝謝,這有助於很多!因此,我認爲所有在GPU上運行時將常規操作拆分爲多個流操作的情況都是由於cuDNN和/或cuBLAS造成的? –

+0

我不是100%確定的,但我認爲還有一些情況是Eigen實現的內核會生成多個流操作(例如多個小型memcpy操作)。但是,大多數性能關鍵的內核使用cuDNN/cuBLAS。 – mrry

相關問題