GPUで計算させる時、効率が良い並列計算の方法
現状を少し説明し、その後に質問を書かせていただきます。
ここ一か月ほど、GPU(GeForce 1080)を使って、pythonでKeras(Tensorflowバックエンド)で動かしています。(OSはubuntu 16.04を使っています。)
CPUからGPUに変更するだけで、一つのファイルを計算させるときに、
50-100倍ほど早く計算が終了することで非常に満足しておりました。
しかし、最近、その計算させるファイルの数が多くなり、
結果として、また時間がかかるようになってきました。
そこで、(日ごろ使っている)Go言語やpythonを使い、並列計算を試みました。
メモリーの制約などすることで、GPUでも並列で計算できるようになりましたが、一つ疑問が残りました。
一般的には、Goやpythonで並列計算をさせますと、(各)子プロセスは100%を超えないかと認識しています。(現在GO言語を使って、計算させたいファイルを整えたあと、pythonで書かれたKerasを動かすようなscriptを書いています。)しかし、実際には、約2倍(%CPUが平均で150-180)の負荷がかかってしまっていることがわかりました。以下、[top]コマンドの結果を表示します。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24786 user 20 0 19.428g 1.886g 311096 S 162.5 3.0 22:51.55 python3.5
27392 user 20 0 18.720g 1.194g 307708 S 162.5 1.9 7:56.84 python3.5
16550 user 20 0 22.414g 4.879g 318864 S 156.2 7.8 67:30.80 python3.5
27755 user 20 0 18.635g 1.098g 306248 S 150.0 1.8 6:10.02 python3.5
22933 user 20 0 20.062g 2.527g 309140 S 143.8 4.0 33:48.74 python3.5
17685 user 20 0 27.359g 9.743g 317500 R 100.0 15.5 70:30.59 python3.5
また、nvidia-smiの結果は以下のようです。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.69 Driver Version: 384.69 |
|-------------------------------+----------------------+----------------------+
| 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 1080 Off | 00000000:02:00.0 Off | N/A |
| 43% 64C P2 72W / 180W | 7519MiB / 8114MiB | 99% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 17685 C python3.5 995MiB |
| 0 20005 C python3.5 1085MiB |
| 0 22933 C python3.5 1085MiB |
| 0 24786 C python3.5 1087MiB |
| 0 27392 C python3.5 1087MiB |
| 0 27755 C python3.5 1085MiB |
| 0 29106 C python3.5 1085MiB |
+-----------------------------------------------------------------------------+
この予想外に各CPUが2倍も使用しているため、CPU側の制約でこれ以上並列計算できません。
自分の予想では、現在使っているサーバーが16コアもっているので、それを全部別計算で使い切る(16個の並列計算)ことを考えていました。GPUパワーに若干の余裕がありますので、それを全部使いきりたいのです。
そこで質問ですが、
(1)CPUのコア数をなるべく少なく使う(各コアで最高100%)ような制約は可能でしょうか?
(2)もし可能であれば、GPU側だけですべての計算をさせるようなことは可能でしょうか?
(3)また別の方法で、GPUで計算させるときに、より効率が良い並列計算の方法があるのか?
の3点について伺いたいです。
3点すべて回答していただけるは理想ですが、どれか一つでも回答をいただけると幸いです。
ご教授をお願いします。