こんにちは。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インスタンスを使ったのにも関わらず、次の表のようにかなりの時間がかかりました。
Maschine | run time[sec] |
---|---|
iMac (21.5-inch, Late 2015) | 712.4355142116547 |
c4.large | 1102.43935227394 |
g3s.xlaege(前回) | 79.74062728881836 |
g3s.xlaege(今回) | 971.1256911754608 |
もしかして、CPUのみで実行されているのではないかと考え、 nvidia-smi
でチェックしたところ、使用されているメモリーが前回より少なかったです。
549MiB前回使用されていたのが、今回は67MiBでした。おそらく、これが遅くなった原因ではないかと思われます。
そこで、前回付け足した、GPUのメモリ使用率100%を防ぐためのコードが原因かと思い、その部分をコメントアウトして実行してみましたが、何も変わらず、GPUのメモリ使用は67MiBでした。
おわりに
今回の方法ではうまくいきませんでした。現時点では解決方法がわからないため、分かり次第記事化する予定です。