2017-07-12 9 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操作はどこに分かれていますか?

ありがとうございました!デフォルトで— TensorFlowは、できるだけ速く、後続の畳み込みを実行する方法を選択することcuDNNの自動チューニング機能を使用しています—ので

答えて

1

tf.nn.conv_2d() opは最初tf.Session.run()の呼び出しで実行するために多くの時間がかかります。オートチューンの呼び出しhereが表示されます。

自動チューニングを無効にするために使用できるundocumented environment variableがあります。使用を無効にするためにTensorFlow(例えば、pythonインタープリタ)を実行しているプロセスを開始するときはTF_CUDNN_USE_AUTOTUNE=0に設定してください。

+0

ありがとう、これは多くの助けになります!これから、私は、通常の操作が複数のストリーム操作に分割され、GPU上で実行されるケースがcuDNNおよび/またはcuBLASに起因すると仮定します。 –

+0

私は100%確信しているわけではありませんが、固有の実装カーネルが複数のストリーム操作(複数の小さなmemcpy操作など)を生成するケースもあると思います。しかし、パフォーマンスに重要なカーネルのほとんどはcuDNN/cuBLASを使用します。 – mrry

関連する問題