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 まとめ。 ***********
********************************************* ここまで飛ばしてOK。**************
**********以下、Deep Water まとめ。 ***********
Deep Water 内のモデル(アルゴリズム)として Deep Water を選択した場合、私の環境ではGPU関連に不具合が生じるようです。
・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 件のコメント:
コメントを投稿