Nvidia Tesla K20c GPUを搭載したコンピューターで、Tensorflowバックエンドでkerasを使用しています。 (CUDA 8)
比較的単純な畳み込みニューラルネットワークをトレーニングしています。トレーニング中に端末プログラムを実行しますnvidia-smi
GPUの使用を確認します。次の出力でわかるように、GPUの使用率は一般に約7%-13%を示しています
私の質問は、CNNトレーニング中にGPUの使用量を増やすべきではないということです。これは、不適切なGPU構成またはkeras/tensorflowによる使用の兆候ですか?
いくつかの理由が考えられますが、トレーニングデータを読み取るときにボトルネックが発生している可能性が高いです。 GPUがバッチを処理すると、より多くのデータが必要になります。実装によっては、これにより、GPUはCPUがより多くのデータをロードするのを待機し、GPUの使用量が少なくなり、トレーニング時間が長くなります。
適合する場合はすべてのデータをメモリにロードするか、 QueueRunner を使用して、入力パイプラインがバックグラウンドでデータを読み取るようにします。これにより、GPUがより多くのデータを待機する時間が短縮されます。
TensorFlow Webサイトの Reading Data Guide に詳細が含まれています。
ボトルネックを見つける必要があります。
WindowsでT ask-Manager> Performance を使用して、リソースの使用状況を監視します
Linuxでは、nmon、nvidia-smi、およびhtopを使用してリソースを監視します。
最も可能性のあるシナリオは次のとおりです。
巨大なデータセットがある場合は、ディスクの読み取り/書き込み速度を見てください。頻繁にハードディスクにアクセスする場合は、おそらく、データセットを処理する方法を変更して、ディスクアクセスの回数を減らす必要があります。
メモリを使用して、可能な限りすべてをプリロードします。
安らかなAPIまたは同様のサービスを使用している場合は、必要なものを受け取るのをあまり待たないようにしてください。安らかなサービスの場合、1秒あたりのリクエスト数が制限される場合があります(nmon /タスクマネージャーでネットワークの使用状況を確認してください)
どの場合でもswapスペースを使用しないでください!
何らかの方法で前処理のオーバーヘッドを削減します(キャッシュの使用、ライブラリの高速化など)。
Bach_sizeで遊ぶ(ただし、バッチサイズの値が大きい(> 512)と、精度に悪影響を及ぼす可能性があると言われています)
GPUのパフォーマンスと使用率の測定は、CPUやメモリほど簡単ではありません。 GPUは極端な並列処理ユニットであり、多くの要因があります。 nvidia-smiで表示されるGPU使用率は、少なくとも1つのGPUマルチプロセッシンググループがアクティブだった時間の割合を意味します。この数値が0の場合、GPUが使用されていないことを示しますが、この数値が100の場合、GPUが最大限に使用されているという意味ではありません。
これらの2つの記事には、このトピックに関する多くの興味深い情報があります。 https://www.imgtec.com/blog/a-quick-guide-to-writing-opencl-kernels-for-rogue/ - https://www.imgtec.com/blog/measuring-gpu-compute-performance/