Deep Learning Base AMIをGPUインスタンスで使ってみた(失敗?)

こんにちは。hacknoteのr.katoです。

前回はGPUインスタンスにDeep Learning AMIを入れてmnistをやりました。

Deep Learning向けのAMIにはBaseというTensorflowなどのフレームワークが含まれない、CUDAなどのみ入っているものがあります。

今回はこのAMIを使ってmnistを行ったのでその紹介です。

(タイトルで失敗?とつけているのは、プリインストールのものを利用したらエラーがでて、GPUインスタンスを使ったのに、処理時間がCPUインスタンスと変わらなくなってしまったためです。)

やったこと

推奨環境(GPU)でDeep Learning AMI(DLAMI)を使ってkerasサンプルコードのmnistを実行する。

インスタンス情報

  • g3s.xlarge
  • Deep Learning Base AMI (Ubuntu 18.04) Version 21.0 – ami-096da10df231117a7
  • Driver 418.87.01
  • CUDA 10.1
  • cuDNN 7.5.1
  • NVIDIA Tesla M60
  • python 3.6.5 anaconda
  • tensorflow 2.0.0
  • keras 2.3.0
  • ボリュームタイプ standard 100GB

実際に実行したサンプルコード

https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py

実際の様子

login

Deep Learning AMIと比較するとactivateコマンドがないので簡素なものです。

tensorflowのインストール

pip3 install tensorflow をしたところエラーでできなかったので、pyenv内にanaconda環境を作成し、condaの仮想環境を作成しました。(後ほど、 –ignore-installed –user を末尾につけることでインストールできましたが、今回の失敗?には関係ないので割愛します。)

↓でpyenvのインストール、pyenv内にanacondaのインストール、condaコマンドを使ってanaconda内に仮想環境を作成後、tensorflowとkerasのインストールをしています。

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

$ curl https://pyenv.run | bash

#vimで追加

export PATH="/home/ubuntu/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

$ exec $SHELL
$ pyenv update
$ pyenv install -l |grep anaconda  #インストール可能なanacondaを確認
$ pyenv install anaconda3-2019.10
$ conda create -n dlami python=3.6.5 anaconda
$ conda activate dlami
$ pip install tensorflow-gpu==2.0.0
$ pip install keras==2.3.0

この状態でmnistを実行したところ、エラーlogでcuDNNの7.6が必要と言われたので、tensorflowの公式サイトのインストール方法を参考にインストールしました。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt-get update
$ wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo  apt-get install --no-install-recommends cuda-10-1 libcudnn7=7.6.4.38-1+cuda10.1 libcudnn7-dev=7.6.4.38-1+cuda10.1

mnistのときの出力は次のようになっていました。

$ python mnist_cnn.py 
2020-01-16 06:26:12.122323: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2020-01-16 06:26:14.260912: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1006] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-01-16 06:26:14.265467: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: Tesla M60 major: 5 minor: 2 memoryClockRate(GHz): 1.1775
pciBusID: 0000:00:1e.0
2020-01-16 06:26:14.265693: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:14.265863: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10.0'; dlerror: libcublas.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:14.266064: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcufft.so.10.0'; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:14.266250: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcurand.so.10.0'; dlerror: libcurand.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:14.266426: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusolver.so.10.0'; dlerror: libcusolver.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:14.266593: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10.0'; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /home/ubuntu/src/cntk/bindings/python/cntk/libs:/usr/local/cuda/lib64:/usr/local/lib:/usr/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/efa/lib:/usr/local/cuda/lib:/opt/amazon/efa/lib:/usr/local/mpi/lib:
2020-01-16 06:26:15.897133: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-01-16 06:26:15.897184: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1641] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
Using TensorFlow backend.
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
2020-01-16 06:26:16.341325: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-16 06:26:16.366021: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2300040000 Hz
2020-01-16 06:26:16.366343: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x559e849b1480 executing computations on platform Host. Devices:
2020-01-16 06:26:16.366384: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version
2020-01-16 06:26:16.410742: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1006] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-01-16 06:26:16.411389: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x559e84a23b50 executing computations on platform CUDA. Devices:
2020-01-16 06:26:16.411416: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Tesla M60, Compute Capability 5.2
2020-01-16 06:26:16.411520: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-01-16 06:26:16.411539: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.2626 - accuracy: 0.9196 - val_loss: 0.0573 - val_accuracy: 0.9819
Epoch 2/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0881 - accuracy: 0.9732 - val_loss: 0.0432 - val_accuracy: 0.9860
Epoch 3/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0658 - accuracy: 0.9806 - val_loss: 0.0341 - val_accuracy: 0.9892
Epoch 4/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0549 - accuracy: 0.9834 - val_loss: 0.0306 - val_accuracy: 0.9892
Epoch 5/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0481 - accuracy: 0.9854 - val_loss: 0.0311 - val_accuracy: 0.9908
Epoch 6/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0428 - accuracy: 0.9872 - val_loss: 0.0292 - val_accuracy: 0.9902
Epoch 7/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0375 - accuracy: 0.9891 - val_loss: 0.0277 - val_accuracy: 0.9909
Epoch 8/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0337 - accuracy: 0.9898 - val_loss: 0.0293 - val_accuracy: 0.9895
Epoch 9/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0307 - accuracy: 0.9903 - val_loss: 0.0324 - val_accuracy: 0.9893
Epoch 10/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0284 - accuracy: 0.9910 - val_loss: 0.0252 - val_accuracy: 0.9923
Epoch 11/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0271 - accuracy: 0.9917 - val_loss: 0.0307 - val_accuracy: 0.9912
Epoch 12/12
60000/60000 [==============================] - 80s 1ms/step - loss: 0.0253 - accuracy: 0.9922 - val_loss: 0.0306 - val_accuracy: 0.9902
Test loss: 0.0306024126781831
Test accuracy: 0.9901999831199646
経過時間1:971.1256911754608

まず、前半の読み込みにかなり時間がかかりました。

そして、GPUインスタンスを使ったのにも関わらず、次の表のようにかなりの時間がかかりました。

Maschinerun time[sec]
iMac (21.5-inch, Late 2015)712.4355142116547
c4.large1102.43935227394
g3s.xlaege(前回)79.74062728881836
g3s.xlaege(今回)971.1256911754608

もしかして、CPUのみで実行されているのではないかと考え、 nvidia-smiでチェックしたところ、使用されているメモリーが前回より少なかったです。

549MiB前回使用されていたのが、今回は67MiBでした。おそらく、これが遅くなった原因ではないかと思われます。

そこで、前回付け足した、GPUのメモリ使用率100%を防ぐためのコードが原因かと思い、その部分をコメントアウトして実行してみましたが、何も変わらず、GPUのメモリ使用は67MiBでした。

おわりに

今回の方法ではうまくいきませんでした。現時点では解決方法がわからないため、分かり次第記事化する予定です。