モデルのキューがありますが、GPU が 2 つあるため、並行して実行できるのは 2 つだけです。そのために、コードの最初で、 を使用してどの GPU が利用可能かを判断しようとしますGPUtil
。--runtime=nvidia
関連するかもしれませんが、このコードは、フラグを使用して起動された docker コンテナー内で実行されます。
どの GPU で実行するかを決定するコードは、次のようになります。
import os
import GPUtil
gpu1, gpu2 = GPUtil.getGPUs()
available_gpu = gpu1 if gpu1.memoryFree > gpu2.memoryFree else gpu2
os.environ['CUDA_VISIBLE_DEVICES'] = str(available_gpu.id)
import tensorflow as tf
さて、この方法で 2 つのスクリプトを起動しました (最初のスクリプトが GPU を占有するまで少し遅れました) が、両方とも同じ GPU を使用しようとしました!
さらに問題を調査しました。手動で を設定しos.environ['CUDA_VISIBLE_DEVICES'] = '1'
、モデルを実行させました。トレーニングだったので、出力を確認しnvidia-smi
たところ、次のようになりました
user@server:~$ docker exec awesome_gpu_container nvidia-smi
Mon Mar 12 06:59:27 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111 Driver Version: 384.111 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 980 Ti Off | 00000000:01:00.0 On | N/A |
| 0% 50C P2 131W / 280W | 5846MiB / 6075MiB | 81% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 1080 Off | 00000000:03:00.0 Off | N/A |
| 0% 39C P8 14W / 200W | 2MiB / 8114MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
1
そして、可視デバイスを に設定している間、実際には 0 で実行されていることに気付きました
繰り返しますが、私の使命は、実行を開始する各モデルが使用する GPU を自分で決定する複数のモデルをキューに入れることです。
を調べましallow_soft_placement=True
たが、両方の GPU にメモリが割り当てられたので、プロセスを停止しました。
要するに、トレーニング スクリプトが 1 つの GPU のみを使用し、無料の GPU を選択するようにするにはどうすればよいでしょうか?