2018年4月15日日曜日

OpenACC 失敗

暇になったので、Dtransu を GPU 上での計算に修正してみることに。

まずは、CPU コードを以下の2種でコンパイル。
・Intel VF 18.0
・PGI Community Edition 17.10

どちらも Win10 上ですが、例の通り微妙に異なる結果が得られます。浸透流はほぼ同じ結果ですが、濃度が異なります。
また、PGI は最後の element をうまく認識していませんね。既にこの時点でダメでしょうか?

次に、OpenACC。
コンパイルはできましたが、計算時に収束しません。GPU (GTX1060)は使用しています。こちらは私の能力不足でしょうか?

次に、OpenMP。4.0より、GPU を指定できるようになっていたのは知りませんでした。
IVF は GPU をサポートしていませんので、PGI のみでコンパイル。
が、計算中に GPU を 使用しません。CPU で正常に進んでいます。
ちなみに、Cygwin + gfortran でも試してみましたが、こちらは強制終了でした。

粘ってみましたが、全くダメ。プロがそばに欲しい。

着手時にプロからは「ライブラリ使わないと遅い」と言われていました。そのままでは NVIDIA の仕様で倍精度の計算は遅くなるとのこと。確かに、そのような仕様になっていますね。
ライブラリまで移行しようとし、サンプルを見ると挫けます。毎回。
プロにお願いすればできるのでしょうけど。

そもそも、CPU コードで正しく element を認識しないとダメですよね。
もう少し寝かせておきましょう。

2018年4月14日土曜日

10. まとめ(Ubuntu + Docker + nvidia-docker + Deep Water)

目指していた Ubuntu + Docker + nvidia-docker + Deep Water を実装できました。

XGBoost を使えるようになったのは収穫です。

Deep Water で DNN を利用できないのは残念ですが、いずれ動くようになるでしょうし、それにこだわる必要もないでしょう。nvidia-docker により、他のフレームワーク等も容易に利用できるようになりましたし、以前の計算では、DNN より Random Forest の方が良い結果を出していましたので。データセット(数字)を扱う場合、機械学習の中の一つとして DNN があるという位置づけの方が妥当なように思われます。

さあ、環境は整いました。これで一安心。
あとはやってくる問題を解くだけです。


9. Driverless AI

Driverless AI のテストです。
https://www.h2o.ai/driverless-ai/

まずは、ホスト側の/home/<ユーザー>/ 以下にディレクトリ作成。dataに学習・検証・テストデータを入れておきます。
$ mkdir data
$ mkdir log
$ mkdir tmp
$ mkdir license

NGC にログイン
$ docker login nvcr.io
user:$oauthtoken
Pass:<登録時に作成した Key>

環境を pull
$ docker pull nvcr.io/partners/h2oai-driverless:latest

Docker スタート。
(env NV_GPU="1" を入れないと、2枚目の GTX1060 を正しく認識しないのは Deep Water と一緒でした。)

$ env NV_GPU="1" nvidia-docker run \
    --rm \
    -u `id -u`:`id -g` \
    -p 12345:12345 \
    -p 54321:54321 \
    -p 8888:8888 \
    -v `pwd`/data:/data \
    -v `pwd`/log:/log \
    -v `pwd`/license:/license \
    -v `pwd`/tmp:/tmp \
    nvcr.io/partners/h2oai-driverless:latest

http://<IP>:12345
でアクセス。

ユーザー名を聞かれましたが、適当に入力して次の画面に。
お試し版として、30日のキーをいただいていましたので、それを入力。

動きました。

チューニング含め、ほぼ自動ですね。かっこ良い!

GPUも稼働しています。


データをそのまま使っているだけでなく、演算もして利用しているようですね。凄い。

が、自動過ぎてよくわかりませんね(楽ですけど)。

そもそも、アルゴリズムは何でしょうか?

調べてみると、FAQにありました。
http://docs.h2o.ai/driverless-ai/latest-stable/docs/userguide/faq.html#
Which algorithms are used in Driverless AI?
Features are engineered with a proprietary stack of statistical models including some of the most sophisticated target encoding and likelihood estimates, but we also employ linear models, neural nets, clustering and dimensionality reduction models and more. On top of the engineered features, XGBoost models (and ensembles thereof) are used to make predictions. More models such as linear models and neural nets are added currently and will be available shortly.
いずれは DNN も含まれるのでしょうね。
個人的には計算時に設定がわかったほうが良いかな?
非技術者の利用を想定されていますので、このスタイルで行くのでしょう。

2018年4月12日木曜日

8. NVIDIA GPU Cloud

NVIDIA GPU cloud (NGC)に登録。
https://www.nvidia.com/ja-jp/gpu-cloud/

Repositories
    nvidia
        caffe
        caffe2
        cntk
        cuda
        digits
        mxnet
        pytorch
        tensorflow
        tensorrt
        theano
        torch
    hpc
        candle
        gamess
        gromacs
        lammps
        lattice-microbes
        namd
        relion
        vmd
    nvidia-hpcvis
        index
        paraview-holodeck
        paraview-index
        paraview-optix
    partners
        chainer
        h2oai-driverless
        kinetica
        mapd
        paddlepaddle


一通りの環境は整っています。h2oai-driverless もありますね。
h2oai-driverless を試用してみましょう(Docker で簡単に環境を再現できる点はありがたいですね)。

続く。

2018年4月11日水曜日

7. Deep Water : XGBoost

XGBoost のテスト。

負荷をかけるという点で ntrees=1000に設定してみました(計算結果を見ると 100 で既に収束していました)。

ホスト側での GPU 稼働状況。

$ nvidia-smi pmon
# gpu        pid  type    sm   mem   enc   dec   command
# Idx          #   C/G     %     %     %     %   name
    1       2809     C     0     0     0     0   java         
    1       2809     C     0     0     0     0   java         
    1       2809     C     0     0     0     0   java         
    1       2809     C     0     0     0     0   java         
    1       2809     C     1     0     0     0   java         
    1       2809     C     2     0     0     0   java         
    1       2809     C     2     0     0     0   java         
    1       2809     C     2     0     0     0   java         
    1       2809     C    26     8     0     0   java         
    1       2809     C    63    21     0     0   java         
    1       2809     C    64    22     0     0   java         
    1       2809     C    63    21     0     0   java         
    1       2809     C    11     3     0     0   java         
    1       2809     C    39    13     0     0   java         
    1       2809     C    64    21     0     0   java         
    1       2809     C    64    21     0     0   java         
    1       2809     C    58    19     0     0   java         
    1       2809     C    63    21     0     0   java         
    1       2809     C    64    21     0     0   java         
    1       2809     C    63    21     0     0   java         
    1       2809     C    14     4     0     0   java         
    1       2809     C     0     0     0     0   java         
    1       2809     C     0     0     0     0   java 

$ nvidia-smi                                   
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
|    1      2809      C   java                                        1329MiB |
+-----------------------------------------------------------------------------+

本格的に稼働させるなら、VRAM は大きな方がよさそうですね。

速度は4倍。負荷が大きいほど威力を発揮しそうです。

GPU:3m27s
CPU(6core):14m12s


結果(AUC)も良好。
Deep Water の XGBoost、良いと思います。

続く。

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 を使ってみましょうか?

続く。

2018年4月8日日曜日

5. nvidia-docker (Ubuntu16.04)

Deep Water では、nvidia-docker が必要。
https://github.com/h2oai/deepwater#pre-release-docker-image
GPU-Enabled Docker Image (Recommended)
To use the GPU-enabled Docker image you need a Linux machine with at least one GPU, a GPU driver, and with docker and nvidia-docker installed.
http://blog.idcf.jp/entry/nvidia-docker
nvidia-dockerはNVIDIAのハードウェアを活用できるGPUコンテナを自動で認識し、セットアップできるようなToolkitを搭載した、DockerをラッピングしたCLI(プラグイン)です。
nvidia-dockerを動作させるには、次の3つのコンポーネントをインストールする必要があります。
・GPUドライバ
・Docker
・nvidia-docker

では、入れましょう。
https://github.com/NVIDIA/nvidia-docker

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd
$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

Unable to find image 'nvidia/cuda:latest' locally
latest: Pulling from nvidia/cuda
22dc81ace0ea: Pull complete
1a8b3c87dba3: Pull complete
91390a1c435a: Pull complete
07844b14977e: Pull complete
b78396653dae: Pull complete
59876c12b10f: Pull complete
92ea808ac02a: Pull complete
569bd533d309: Pull complete
2db1f6a96615: Pull complete
2b9d78c87b7c: Pull complete
Digest: sha256:74570aef804e30486eb74b284fd3091d14ca7144736c44fb48c13e5e6afb963f
Status: Downloaded newer image for nvidia/cuda:latest
 
+-----------------------------------------------------------------------------+
| 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 |
| 57%   81C   P12    N/A /  N/A |    181MiB /  1469MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 27%   32C    P8     7W / 120W |      2MiB /  3019MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+


入りました。

一般ユーザーではダメですと。
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.


続く。