

現状を少し説明し、その後に質問を書かせていただきます。

ここ一か月ほど、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]コマンドの結果を表示します。

[code]

      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
    
[/code]

また、nvidia-smiの結果は以下のようです。

[code]

    +-----------------------------------------------------------------------------+
    | 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 |
    +-----------------------------------------------------------------------------+
    
[/code]

この予想外に各CPUが2倍も使用しているため、CPU側の制約でこれ以上並列計算できません。  
自分の予想では、現在使っているサーバーが16コアもっているので、それを全部別計算で使い切る（16個の並列計算）ことを考えていました。GPUパワーに若干の余裕がありますので、それを全部使いきりたいのです。

そこで質問ですが、  
(1)CPUのコア数をなるべく少なく使う（各コアで最高100%）ような制約は可能でしょうか？  
(2)もし可能であれば、GPU側だけですべての計算をさせるようなことは可能でしょうか？  
(3)また別の方法で、GPUで計算させるときに、より効率が良い並列計算の方法があるのか？  
の3点について伺いたいです。

3点すべて回答していただけるは理想ですが、どれか一つでも回答をいただけると幸いです。  
ご教授をお願いします。


CC BY-SA 3.0
2017-09-15T16:42:32.257
37979
2018-04-13T04:13:44.073
11048
question
python go keras gpu
GPUで計算させる時、効率が良い並列計算の方法


> (1)CPUのコア数をなるべく少なく使う（各コアで最高100%）ような制約は可能でしょうか？

cpulimit というコマンドで出来るかもしれません。

<http://news.mynavi.jp/articles/2010/09/27/cpulimit-on-ubuntu/>


CC BY-SA 3.0
2017-09-16T20:47:37.450
37997
2017-09-16T20:47:37.450
13926
37979
answer


各プロセスを並列化しなければ100%を超えることはないが、スケールを勘違いしている可能性が大。「100%」はCPU一つ分で、
**並列化されていれば100%を超える** し負荷の合計が16コア分(1600%)付近なら全コア使い切ってることになる。

が、上二つ以外のプロセスで負荷が並列化の上限と思しき162%に達していないところを見るとボトルネックはCPU負荷ではない。GPUかI/O、ひょっとしたらメインメモリが限界に達していると考えるのが妥当。
**まぁGPUが限界だろ。**


CC BY-SA 3.0
2017-09-17T06:04:50.357
38001
2017-09-17T06:04:50.357
25435
37979
answer