2018年4月9日月曜日

6. Deep Water : DeepWater

Deep Water を動かすための docker image を入れましょう。

https://www.h2o.ai/deep-water/
https://github.com/h2oai/deepwater#pre-release-docker-image
Optional Step. Make docker run without sudo. Instructions for Ubuntu 16.04:
    sudo groupadd docker
    sudo gpasswd -a ${USER} docker
    sudo service docker restart
入れなかったのでリブートして
$ nvidia-docker run -it --rm --net host -v $PWD:/host opsh2oai/h2o-deepwater

OK。動き初めました。
なるほど。毎回、環境を構築するわけですね。
先に言われていたように、メリットは
・使いたい環境(Ver.の組み合わせ等)を選択できる。
・複数の環境を共存させることが可能。
・動作する環境を組み合わせて提供してくれるので、悩まない。時間がかからない。
いろいろなフレームワークを試す場合にメリットが大きい!素晴らしいですね。

それでは、Deep Water を使いましょう。
$ java -jar /opt/h2o.jar

あとは H2O と一緒。指定されたアドレスを CTRL 押しながらクリック。
http://<IPアドレス>:54321/flow/index.html

Deep Water 入りの Flow が立ち上がりました。



********* ここから、つまづきました。**********
*********飛ばしてOK。要点は最後。***********

が、import file で検索してもデータファイルが表示されません。
リブートしてもダメ。
(今度は pull せずに即立ち上がりました。一度データをDLしとけば良いのね。優秀。)
pathを通してもダメ。
root権限でもダメ。
exit、 ctrl-d 効かない。
終わらない。リブート。

ふと思いついて Upload file にすると、何事もなかったように動きます。こちらでした。
コンテナ内からホスト側のファイルを見に行くというのは、PC間を跨いで見に行くようなものでしょうから、何か設定がいるのでしょうね。

モデル(アルゴリズム)は Deep Water を選択。
設定はほぼ今までどおり。H2O と同様で迷いません。
Deep Learning Backend (MXNet、Caffe、TensorFlow )を指定できますね。これは嬉しい。
GPU の device_id も指定できます。GTX1060は id1 でしたので1を入力。

で、計算開始!

が、error


MXNet の場合

Saving the model parameters.
[] /home/jenkins/slave_dir_from_mr-0xb1/workspace/deepwater-master/thirdparty/mxnet/dmlc-core/include/dmlc/logging.h:235: [] /home/jenkins/slave_dir_from_mr-0xb1/workspace/deepwater-master/thirdparty/mxnet/mshadow/mshadow/./stream_gpu-inl.h:125: Check failed: (err) == (CUDNN_STATUS_SUCCESS) CUDNN_STATUS_ARCH_MISMATCH
[] /home/jenkins/slave_dir_from_mr-0xb1/workspace/deepwater-master/thirdparty/mxnet/dmlc-core/include/dmlc/logging.h:235: [] /home/jenkins/slave_dir_from_mr-0xb1/workspace/deepwater-master/thirdparty/mxnet/mshadow/mshadow/./stream_gpu-inl.h:125: Check failed: (err) == (CUDNN_STATUS_SUCCESS) CUDNN_STATUS_ARCH_MISMATCH
terminate called after throwing an instance of 'dmlc::Error'
terminate called recursively
  what():  [] /home/jenkins/slave_dir_from_mr-0xb1/workspace/deepwater-master/thirdparty/mxnet/mshadow/mshadow/./stream_gpu-inl.h:125: Check failed: (err) == (CUDNN_STATUS_SUCCESS) CUDNN_STATUS_ARCH_MISMATCH
Aborted (core dumped)


googling では、cc で引っかかっているとのこと。あれ?GTX480 で計算しようとしている?


Caffeだと

・・・
Ignoring device_id
PYTHONPATH: /opt/caffe/python
Detected 2 GPUs
Started Caffe backend
・・・
54321      11     FJ-1-31   ERRR: java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0 <= 470341 < 273652
・・・


TensorFlow では

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGILL (0x4) at pc=0x00007fb022e3d92d, pid=11, tid=0x00007fb0b6eee700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libtensorflow_jni.so28445ce9-1982-4eea-b7cf-90bb2f0f6553+0x211992d]
#
# Core dump written. Default location: //core or core.11
#
# An error report file with more information is saved as:
# //hs_err_pid11.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Aborted (core dumped)


MXNet で GPU Device id0 (GTX480)で計算してみると、 Cafe と似た以下のエラーを吐く。

No GPU found - not loading CUDA library.
・・・
04-03 00:41:21.783 10.11.56.1:54321      733    FJ-1-13   ERRR: java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0 <= 500004 < 273725
・・・

試しにGTX480を抜いて、GTX1060の1枚刺しで計算してみました。
が、Cafe、TensorFlow 共に同じエラーを吐くので、GPU 2枚刺しで引っかかっているわけではない。

他のモデルではどうか?と XGBoost を試してみると、OK。問題なく走ります。AUC 0.9超えで、ちゃんと計算しています。

GPU:1分45秒
CPU:3分44秒

GPU使ってますね。

では、2枚刺しに戻してXGBoost。

NG。GPUの指定がまずいとErrorを吐きます。これか?

GPU backend (gpu_id: 1) is not functional. Check CUDA_PATH and/or GPU installation.

gpu_id: 0 だと、走ります。
ただし、ホスト側では id 1 の GTX1060 が動いています。

$ nvidia-smi pmon
# gpu        pid  type    sm   mem   enc   dec   command
# Idx          #   C/G     %     %     %     %   name
    1       5898     C     1     0     0     0   java         
    1       5898     C     2     0     0     0   java         
    1       5898     C     1     0     0     0   java         
    1       5898     C     1     0     0     0   java         
    1       5898     C    15     4     0     0   java         
    1       5898     C    14     4     0     0   java 

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 480     Off  | 00000000:03:00.0 N/A |                  N/A |
| 44%   66C   P12    N/A /  N/A |    278MiB /  1469MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 27%   41C    P2    31W / 120W |    919MiB /  3019MiB |     57%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
|    1      5898      C   java                                         907MiB |
+-----------------------------------------------------------------------------+

XGBoostでは、gpu_id: 0 がGTX1060を指すようです。なぜでしょう?
このあたり、プロがいたらすぐに聞けるのでしょうけど。

再び、DeepWater。

今度はできるだけデフォルトに近い設定からテスト。gpu_id は 0 指定。

隠れ層2層だとOK。GTX1060 を使用しています。
以下、順次テスト。
3層 OK
Problem type:Dataset OK
balance_classes:on NG

これでしたか。balance_classes を使えないのは痛いですね。
balance_classes:off に戻して続けます。

score_each_iteration:on OK
backend:Caffe OK
backend:TensorFlow NG

TensorFlow はダメですか。残念。backend:mxnet に戻して続けます。

input_dropout_ratio:0.1 OK
mini_batch_size:100 OK


これで計算は進みますが、ほとんどGPUを使っていないようです。やはり gpu_id 周りを解決しないとダメでしょうか?

$ nvidia-smi pmon
# gpu        pid  type    sm   mem   enc   dec   command
# Idx          #   C/G     %     %     %     %   name
    1       7612     C     0     0     0     0   java         
    1       7612     C     0     0     0     0   java         
    1       7612     C     0     0     0     0   java         
    1       7612     C     1     0     0     0   java         
    1       7612     C     0     0     0     0   java         
    1       7612     C     0     0     0     0   java         
    1       7612     C     0     0     0     0   java         
    1       7612     C     0     0     0     0   java

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 480     Off  | 00000000:03:00.0 N/A |                  N/A |
| 44%   59C   P12    N/A /  N/A |    278MiB /  1469MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 28%   46C    P2    30W / 120W |    199MiB /  3019MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
|    1      7612      C   java                                         187MiB |
+-----------------------------------------------------------------------------+


コンテナには GPU を1つだけ渡すように設定してみます。
env NV_GPU="1" nvidia-docker run -it --rm --net host -v $PWD:/host opsh2oai/h2o-deepwater

# nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 27%   34C    P8     7W / 120W |      2MiB /  3019MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

これで GPU 周りはスッキリ。


java -jar /opt/h2o.jar

#read-142 WARN: Swapping!  OOM, (K/V:1.03 GB + POJO:4.07 GB + FREE:131.5 MB == MEM_MAX:5.23 GB), desiredKV=762.3 MB OOM!

INFO: Java heap totalMemory: 362.5 MB
INFO: Java heap maxMemory: 5.23 GB
INFO: JVM launch parameters: []
INFO: Machine physical memory: 23.54 GB

javaアプリで エラーが出るので、最大メモリサイズを指定。

java -Xmx18g -jar /opt/h2o.jar

INFO: Java heap totalMemory: 362.5 MB
INFO: Java heap maxMemory: 16.00 GB
INFO: JVM launch parameters: [-Xmx18g]
INFO: Machine physical memory: 23.54 GB

GPUの稼働率は変わりませんね。
DeepWater 1.37h
H20 18m15s

DeepWater のAUC が0.6弱。使えません。

うまく走ったとしても、答えは当然異なるようです。
https://stackoverflow.com/questions/48274614/deeplearning-and-deepwater-models-give-very-different-logloss-0-4-vs-0-6
  • h2o.deeplearning is H2O's built-in deep-learning algorithm. It parallelizes very well, works well with large data, but does not use GPUs.
  • h2o.deepwater is a wrapper around (probably) Tensorflow, and (probably) using your GPU (but it can use the CPU, and it can use different back-ends).





***********************************
********** ここまで飛ばしてOK。**************
**********以下、Deep Water まとめ。 ***********
***********************************


Deep Water 内のモデル(アルゴリズム)として Deep Water を選択した場合、私の環境ではGPU関連に不具合が生じるようです。

残念ながら、当面は Deep Water 以外を選択する方が良さそうです。選択する場合の注意点は、以下の通り。

・docker image を読み込む際に、env NV_GPU="1"をつける。(Deep Water 全体)
$ env NV_GPU="1" nvidia-docker run -it --rm --net host -v $PWD:/host opsh2oai/h2o-deepwater
・Upload file でデータ読み込み。(Deep Water 全体)
・gpu_id: 0 を使用。(Deep Water 全体)
・balance_classes は使えません。(Deep Water:DeepWater )
・backend:TensorFlow は使えません。(Deep Water:DeepWater )


H2Oとか、XGBoost(GPU)は優秀ですね。
XGBoost を使ってみましょうか?

続く。

0 件のコメント:

コメントを投稿