2018年4月30日月曜日

H-Q曲線

「現場の水理学」の続きと「新 現場の水理学」を読みました。

どちらも初心者向けに丁寧に書かれていましたので、一気に読めました。ありがたい。

コードは BASIC を使われているようでした。行番号、懐かしいですね。
河床変動のみでなく、横断図からH-Q曲線を作成するコードも掲載されていました。ちょうど、H-Q曲線を作ろうとソフトを他部署から借りていたのですが、不等流計算のおまけのようで煩雑でした。で、コチラを使えないか?と思案。

BASIC は選択肢としてありえないので、EXCEL VBA を選択。横断座標は EXCEL で整理するでしょうからデータ作成の手間が省けるでしょう、との判断です。

手を動かしてみると、あっさり移植できました。
知らなかったのですが、VB は BASIC をそのまま動かせるのですね。fortran と VF の関係と同じだったようです。無知でしたね。

セル参照・書き込みや不具合を修正し、ついでに曲線と流量ハイドロから水位ハイドロを算出するマクロも追加しました。潤辺を正しく斜距離で計算するコードでしたが、鉛直の場合はダメですね。ま、全部水平距離での簡略化よりはマシでしょう。

ツールは準備できました。手早く整理してしまいましょう。

2018年4月25日水曜日

現場の水理学

河床変動計算プログラムを理解するため、資料を探すことに。

離散化前後の式が記載されていないため、ソースを読んだだけではわからない箇所があります。それらをピックアップし、該当する式を探す作業です。


iRIC の HP を見ていると、良い資料がありました。
「現場のための水理学」
http://i-ric.org/ja/column/pdf/

初心者向きで、一気に第3回の掃流砂まで読めました。
30年前の資料ですが、離散化前後の式から手計算による例題、プログラムソースまで記載されており、一通りのことが理解し易く記載されています。ありがたい。
先日読んだソースも、基本的には同じ流れでしたので、不明であった式の意味や流れがほぼ理解できました。良かった。

オリジナルは寒地土木研究所に掲載されています。
http://river.ceri.go.jp/contents/tool/suirigaku.html

ふと見ると、「新 現場のための水理学」がありました。
http://river.ceri.go.jp/contents/tool/shin-suirigaku.html
平成4年ですから、26年前の資料です。用語の解説も加えられ、さらに初心者向けに作られているようです。
こちらも読んでみましょう。

***************************
20220214追記
「現場のための水理学」令和版だそうです。
https://i-ric.org/yasu/nbook2/index.html


2018年4月23日月曜日

砂防用語

週末に、1次元の河床変動計算のソースを読みました。

頂いたソースで、解説はありません。
が、砂防分野では古典に属するようで、用いられている式の種類も多くなく、2/3程度は理解できました。

どちらかというと、砂防用語がわかりませんでした。変数は英語を略しており、それを日本語に直しても、その意味が分からない、といったことがいくつか出てきました(「径深」など)。

根本的な、知識不足。
砂防分野について少し慣れが必要です。

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'.


続く。

4. Docker (Ubuntu16.04)

AWS や Azure を視野に入れる場合、Docker は使えるようにしておきたい。
(今はぼやっとしかわからなくても、触っているうちに靄も取れるでしょう。)

まずは Docker のインストール
https://docs.docker.com/install/linux/docker-ce/ubuntu/#extra-steps-for-aufs
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

$ sudo docker version

Client:
 Version: 18.03.0-ce
 API version: 1.37
 Go version: go1.9.4
 Git commit: 0520e24
 Built: Wed Mar 21 23:10:01 2018
 OS/Arch: linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version: 18.03.0-ce
  API version: 1.37 (minimum version 1.12)
  Go version: go1.9.4
  Git commit: 0520e24
  Built: Wed Mar 21 23:08:31 2018
  OS/Arch: linux/amd64
  Experimental: false


OK。入りました。

コンテナ一覧の稼働状況と止め方。
$ docker ps -a
$ docker stop <CONTAINER ID>


次は nvidia-docker です。
続く。

2018年4月5日木曜日

3. GTX480・GTX1060(非SLI)Ubuntu16.04

Ubuntu 側で GPU 2枚挿し(非SLI)の確認。

$ nvidia-smi
   
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| 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 |
| 63%   86C    P0    N/A /  N/A |    275MiB /  1469MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 27%   30C    P8     7W / 120W |      1MiB /  3013MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

GTX480とGTX1060の二枚を認識しています。何もしていないのに480 は熱いですね。

driver Version は384.111。これだと、CUDA8.0までしか対応していません。
https://github.com/NVIDIA/nvidia-docker/wiki/CUDA#requirements
Requirements
The machine running the CUDA container only requires the NVIDIA driver, the CUDA toolkit doesn't have to be installed.
NVIDIA drivers are backward-compatible with CUDA toolkits versions
CUDA toolkit version Driver version GPU architecture
6.5 >= 340.29 >= 2.0 (Fermi)
7.0 >= 346.46 >= 2.0 (Fermi)
7.5 >= 352.39 >= 2.0 (Fermi)
8.0 == 361.93 or >= 375.51 == 6.0 (P100)
8.0 >= 367.48 >= 2.0 (Fermi)
9.0 >= 384.81 >= 3.0 (Kepler)
9.1 >= 387.26 >= 3.0 (Kepler)

ドライバーを更新しましょう。

古いVer.を削除
$ sudo apt-get --purge remove nvidia-*

リポジトリ登録
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update

最新Ver.確認
https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
Current official release: `nvidia-390` (390.48)
Current long-lived branch release: `nvidia-390` (390.48)
Old long-lived branch release: `nvidia-384` (384.130)

最新版インストール
$ sudo apt-get install nvidia-390
$ sudo reboot

$ 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 |
| 50%   75C   P12    N/A /  N/A |    199MiB /  1469MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 00000000:04:00.0 Off |                  N/A |
| 27%   31C    P8     7W / 120W |      2MiB /  3019MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                             
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+


これでOK。

次は Docker のインストールです。
続く。

2018年4月4日水曜日

2. GTX480・GTX1060(非SLI)Win10

続きです。

Deep Learning を扱うフレームワークやライブラリは、CUDA Computing Capability 3.0以上を要求しています(Deep Water は3.5以上)。
https://www.tensorflow.org/versions/r1.0/install/install_sources
http://caffe.berkeleyvision.org/installation.html
https://github.com/h2oai/deepwater#pre-release-docker-image

GTX480 は CC 2.0 で使えません。
https://developer.nvidia.com/cuda-gpus

Core i9 を入れた 60万円くらいの PC を買おうかと思いましたが、それに見合う仕事量も期待できません。いずれはクラウドを目指していますし、お試し・繋ぎという意図で安価な NVIDIA GeForce GTX1060 を購入することに。幸い、古いマザー(ASUS P6X58D-E)にはIntel X58 チップセットが搭載されており、レーン数も確保されています。

早速ショップに出向き、3GB モデル を2.9万で購入。

挿してみると絵面がヤバい。きっちり入りましたが、2枚の間隔が狭い。熱が気になりますね。



店員さんに「動かない可能性が高い」と脅されていましたが、Win10を動すると認識していました。


NVIDIAコントロールパネルより、CUDA  GPU をGTX1060に指定。ひとまず、モニタを GTX480 につないで、GTX1060を計算専用に設定しました。(Win10で計算する予定はありませんが。)

次は Ubuntu での設定です。続く。

2018年4月3日火曜日

1. Ubuntu・Windows 10 の dual boot

昨年度にGPU 使用の Deep Learning を断念していました。

ビッグデータを CPU のみで扱えるよう調整して計算していたのですが、これでは少し情けない。時代に追いつくべく、ひと段落したところで環境を整えることに。

といっても、クラウド使用ではなく、まずはローカルで(InfraWorks でも表示の改善を期待しています)。Ubuntu + Docker + nvidia-docker + Deep Water を目指します。Ubuntu は Win10 との dual boot を予定。

まずは Ubuntu 16.04 LTS のインストールから。
ドライブは別にします。余っていた mSATA SSD を 2.5インチに変換し、SATA接続(ケースに2.5インチ用ベイが余っていた。しかも Power ボタン付き。)
これに Ubuntu を入れます。
  1. Win10 上でUbuntu 16.04 iso を DL
  2. unetbootin-windows でブートローダーつけて起動用 USB 作成
  3. Ubuntu を USB から直接起動
  4. IP等ネット周り設定
  5. 動作確認後、mSATA SSD にブートローダー、OSインストール
  6. BIOSで Ubuntu SSD の起動順位を Win10 SSD より上位に設定
  7. 起動確認
    2.5インチ用Powerボタンonで、ローダー経由の Ubuntu 自動起動(Ubuntu ・ Windows 10 選択可)
    2.5インチ用Powerボタンoffで、ローダー経由せずに Windows 10 起動
  8. 「Ubuntu ソフトウェア」「更新」「インストール」でOSを含め最新に更新―再起動
次に GPU を 認識させます。
  1. 「システム設定」「ソフトウェアとアップデート」「追加のドライバー」より NVIDIA GPU ドライバインストール
  2. 再起動後にGPU確認 $ nvidia-smi
これで Ubuntu 上で 古い NVIDIA GeForce GTX480 を認識しました。

続く。


*******************************************
20180404追記

Win10に戻ると時間がズレます。
Ubuntu 側も local で合わせておきましょう。

$ sudo timedatectl set-local-rtc true