[PYTHON] Création d'un environnement Keras sur une instance AWS E2 G2 Février 2017

introduction

Il est naturel que vous ayez besoin d'énormes ressources informatiques pour faire du Deep Learning, mais les spécifications de votre PC ne sont pas suffisantes, donc je pense que c'est aussi une bonne idée de configurer rapidement une instance GPU d'EC2.

Le Framework est Keras et le backend est la version GPU TensorFlow. Il a été configuré pour être installé dans l'environnement virtuel pyenv. TensorFlow 1.0 est sorti l'autre jour Il semble que tf.keras ait été implémenté, mais je ne l'ai pas encore essayé, donc c'est normal J'utiliserai Keras.

Je fais référence ici pour la construction de l'environnement. Exécutez TensorFlow sur l'instance de GPU AWS

Créer une instance

Instance EC2: Ubuntu Server 16.04 LTS (HVM), type de volume SSD dans le démarrage rapide Type : g2.2xlarge Configuration standard pour le stockage, etc. (mémoire 15 Go, stockage 8 Go)

installer

Tout d'abord, connectez-vous avec SSH

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]

Créer un lien symbolique pour faire du stockage éphémère un répertoire de travail

Comme il est assez grand avec CUDA, il n'y a pas assez d'espace libre au milieu du travail. Créez un lien symbolique vers / mnt / tmp / pour utiliser le stockage éphémère pour votre zone de travail.

sudo mkdir /mnt/tmp
sudo chmod 777 /mnt/tmp
sudo rm -rf /tmp
sudo ln -s /mnt/tmp /tmp
cd /tmp

Mettez à niveau Ubuntu vers la dernière

sudo apt-get update
sudo apt-get upgrade -y

Définir les paramètres régionaux

Après la mise à niveau, l'avertissement lié aux paramètres régionaux apparaît et c'est ennuyeux.

sudo apt-get install language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8

Installez les modules requis pour la configuration

sudo apt-get install python
sudo apt-get install -y build-essential python-pip python-dev git python-numpy swig python-dev default-jdk zip zlib1g-dev ipython

Ajouter une liste noire Nouveau pour éviter les conflits avec les pilotes NVIDIA

echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo update-initramfs -u
sudo reboot

Après le redémarrage, connectez-vous et installez linux-image-extra-virtual.

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]
sudo apt-get install -y linux-image-extra-virtual
sudo reboot

Après le redémarrage, connectez-vous et installez les en-têtes linux.

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]
sudo apt-get install -y linux-source linux-headers-`uname -r`

Configurer CUDA Toolkit v8

La dernière version pour le moment est la 8.0. Télécharger et installer

cd /tmp
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
chmod +x cuda_8.0.44_linux-run
./cuda_8.0.44_linux-run  -extract=`pwd`/nvidia_installers
cd nvidia_installers/
sudo ./NVIDIA-Linux-x86_64-367.48.run
#Sélectionnez Accepter. la configuration du noyau a 100 barres de progression%Cela prend un certain temps après être devenu
#Sélectionnez OK
#Sélectionnez OK
#Sélectionnez Oui
#Sélectionnez OK
sudo modprobe nvidia
sudo ./cuda-linux64-rel-8.0.44-21122537.run
#Readme est affiché, alors quittez avec q
#Entrez accepter
# install Path: default
# shortcut?: default

Configurer cuDNN

Téléchargez cuDNN localement une fois depuis https://developer.nvidia.com/cudnn Parce que cuDNN ne peut pas être abandonné sans s'inscrire auprès de Developer. c'est inutile.

Transférez cuDNN téléchargé depuis votre terminal local vers votre instance EC2

scp -i [ec2key].pem cudnn-8.0-linux-x64-v5.1.tgz ubuntu@[Instance IP]:/tmp

Revenir à l'instance EC2

cd /tmp
tar -xzf cudnn-8.0-linux-x64-v5.1.tgz
sudo mv ./cuda/lib64/* /usr/local/cuda/lib64/
sudo mv ./cuda/include/* /usr/local/cuda/include/

Ajoutez ce qui suit à ~ / .bashrc

.bashrc


# cuDNN
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
source ~/.bashrc

Construire un environnement virtuel Python

python -V
Python 2.7.12
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

Créez ~ / .bash_profile et écrivez ce qui suit

.bash_profile


# pyenv
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
# virtualenv
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
source ~/.bash_profile

Créer un environnement virtuel pour Keras

pyenv install 3.5.3
pyenv virtualenv 3.5.3 keras
pyenv activate keras
python -V
Python 3.5.3

Installez Tensorflow

pip install tensorflow-gpu

Vérifiez la version de TensorFlow et si elle ressemble à ce qui suit, vous pouvez utiliser le GPU.

python -c 'import tensorflow as tf; print(tf.__version__)'
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
1.0.0

Installez Keras

pip install pillow
pip install h5py
pip install matplotlib
pip install keras

Essayez d'exécuter des exemples de Keras

cd /tmp
git clone https://github.com/fchollet/keras.git
cd keras/examples

Pour le moment, essayez d'exécuter celui qui résout MNIST avec CNN

python mnist_cnn.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.pkl.gz
X_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
60000/60000 [==============================] - 13s - loss: 0.3770 - acc: 0.8839 - val_loss: 0.0932 - val_acc: 0.9709
Epoch 2/12
60000/60000 [==============================] - 11s - loss: 0.1363 - acc: 0.9603 - val_loss: 0.0632 - val_acc: 0.9801
Epoch 3/12
60000/60000 [==============================] - 11s - loss: 0.1064 - acc: 0.9687 - val_loss: 0.0509 - val_acc: 0.9835
Epoch 4/12
60000/60000 [==============================] - 11s - loss: 0.0900 - acc: 0.9736 - val_loss: 0.0443 - val_acc: 0.9857
Epoch 5/12
60000/60000 [==============================] - 11s - loss: 0.0769 - acc: 0.9775 - val_loss: 0.0405 - val_acc: 0.9865
Epoch 6/12
60000/60000 [==============================] - 11s - loss: 0.0689 - acc: 0.9795 - val_loss: 0.0371 - val_acc: 0.9870
Epoch 7/12
60000/60000 [==============================] - 11s - loss: 0.0649 - acc: 0.9803 - val_loss: 0.0361 - val_acc: 0.9881
Epoch 8/12
60000/60000 [==============================] - 11s - loss: 0.0594 - acc: 0.9823 - val_loss: 0.0356 - val_acc: 0.9886
Epoch 9/12
60000/60000 [==============================] - 11s - loss: 0.0547 - acc: 0.9841 - val_loss: 0.0321 - val_acc: 0.9889
Epoch 10/12
60000/60000 [==============================] - 11s - loss: 0.0525 - acc: 0.9841 - val_loss: 0.0320 - val_acc: 0.9889
Epoch 11/12
60000/60000 [==============================] - 11s - loss: 0.0506 - acc: 0.9850 - val_loss: 0.0323 - val_acc: 0.9892
Epoch 12/12
60000/60000 [==============================] - 11s - loss: 0.0471 - acc: 0.9856 - val_loss: 0.0314 - val_acc: 0.9897
Test score: 0.0314083654978
Test accuracy: 0.9897

Le temps d'exécution est: 2:23 (hors temps de téléchargement des données) Cela a pris environ 35 minutes avec mon MBA, donc c'est plus de 10 fois plus rapide. C'est environ 10 secondes par époque.

J'ai aussi essayé le LSTM d'IMDB, qui semble lourd.

python imdb_cnn_lstm.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Loading data...
25000 train sequences
25000 test sequences
Pad sequences (samples x time)
X_train shape: (25000, 100)
X_test shape: (25000, 100)
Build model...
Train...
Train on 25000 samples, validate on 25000 samples
Epoch 1/2
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
   30/25000 [..............................] - ETA: 1397s - loss: 0.6936 - acc: 0.4333I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 3811 get requests, put_count=2890 evicted_count=1000 eviction_rate=0.346021 and unsatisfied allocation rate=0.530307
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 100 to 110
  360/25000 [..............................] - ETA: 160s - loss: 0.6935 - acc: 0.4833I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 2156 get requests, put_count=2374 evicted_count=1000 eviction_rate=0.42123 and unsatisfied allocation rate=0.373377
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 256 to 281
  870/25000 [>.............................] - ETA: 94s - loss: 0.6925 - acc: 0.5287I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 4249 get requests, put_count=4491 evicted_count=1000 eviction_rate=0.222668 and unsatisfied allocation rate=0.192281
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 655 to 720
25000/25000 [==============================] - 63s - loss: 0.3815 - acc: 0.8210 - val_loss: 0.3519 - val_acc: 0.8456
Epoch 2/2
25000/25000 [==============================] - 60s - loss: 0.1970 - acc: 0.9238 - val_loss: 0.3471 - val_acc: 0.8534
24990/25000 [============================>.] - ETA: 0sTest score: 0.347144101623
Test accuracy: 0.853440059948

Temps d'exécution: 2:25 (hors temps de téléchargement des données). C'était écrasant car il a fallu plus de 40 minutes pour le MBA.

Continuons et essayons quelque chose qui semble plus lourd. mnist_acgan.py semble résoudre MNIST avec un gars appelé ACGAN (Auxiliary Classifier Generative Adversarial Network). Est-ce un parent de DCGAN? Pour plus de détails, il semble être listé dans ici, mais c'est difficile, je vais donc le reporter. Ce sera lourd car c'est GAN pour le moment. Comment est-ce?

python mnist_acgan.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Epoch 1 of 50
  0/600 [..............................] - ETA: 0sI tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
W tensorflow/core/common_runtime/bfc_allocator.cc:217] Ran out of memory trying to allocate 3.74GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
599/600 [============================>.] - ETA: 1s   
Testing for epoch 1:
component              | loss | generation_loss | auxiliary_loss
-----------------------------------------------------------------
generator (train)      | 3.88 | 1.49            | 2.39 
generator (test)       | 3.36 | 1.04            | 2.32 
discriminator (train)  | 2.11 | 0.53            | 1.58 
discriminator (test)   | 2.12 | 0.70            | 1.43 
Epoch 2 of 50
 44/600 [=>............................] - ETA: 732s

Il a fallu environ 15 minutes pour terminer 1 époque. Il reste 48 époques. .. C'était interminable et coûteux, alors je me suis arrêté à mi-chemin. Eh bien, si vous le tournez pendant une demi-journée, vous obtiendrez des résultats. C'est incroyable.

État libre de disque après le travail

df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             7679880       0   7679880   0% /dev
tmpfs            1539900    8800   1531100   1% /run
/dev/xvda1       8117828 6149060   1533492  81% /
tmpfs            7699496       0   7699496   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs            7699496       0   7699496   0% /sys/fs/cgroup
/dev/xvdb       66946696 3017852  60521484   5% /mnt
tmpfs            1539904       0   1539904   0% /run/user/1000

L'utilisation du disque système est de 81%. Le stockage éphémère se volatilise lorsque l'instance est arrêtée, donc si vous vous inquiétez des 8 Go par défaut, vous devez étendre la procédure de stockage.

J'obtiens une erreur lorsque j'essaye de créer une instance g2.xlarge après en avoir fait une AMI

J'ai pris un instantané de l'instance que j'ai pu construire et j'ai créé une instance g2.xlarge à partir de l'AMI. Essayez de travailler correctement.

pyenv activate keras
python -V
 Python 3.5.3
python -c 'import tensorflow as tf; print(tf.__version__)'
Traceback (most recent call last):
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 61, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/__init__.py", line 24, in <module>
    from tensorflow.python import *
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 72, in <module>
    raise ImportError(msg)
ImportError: Traceback (most recent call last):
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 61, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory


Failed to load the native TensorFlow runtime.

See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md#import_error

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

TensorFlow renvoie une erreur. Je ne suis pas sûr, mais est-ce lié à CUDA? Il peut être nécessaire d'examiner plus tard s'il peut être converti en AMI. Si vous souhaitez l'utiliser par intermittence, vous pouvez arrêter l'instance et la laisser.

Résumé

La création de l'environnement Keras ci-dessus prend moins d'une heure. Vous pouvez arrêter l'instance et la laisser, mais ce n'est pas trop compliqué de la créer à partir de Sara lorsque vous voulez l'utiliser. Il vaut mieux réfléchir en fonction de la fréquence d'utilisation et du cas. C'est beaucoup plus facile qu'avant la création de l'environnement GPU TensorFlow.

Recommended Posts

Création d'un environnement Keras sur une instance AWS E2 G2 Février 2017
Version de juin 2017 pour créer un environnement Tensorflow / Keras sur une instance GPU d'AWS
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Créez un environnement WardPress sur AWS avec Pulumi
Procédure de déploiement sur les paramètres d'environnement du serveur AWS (2) (instance EC2)
Créer un environnement Python sur Windows
Construire un environnement Python avec Windows
Créer un environnement Chainer à l'aide de CUDA et cuDNN sur une instance p2
xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda
Créer un environnement de développement AWS Cloud9 sur une instance Amazon EC2
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Construction de l'environnement Anaconda sur Mac (version 2018)
Utiliser jupyter sur une instance GPU sur AWS
Créer un environnement Python 3.8 + Pipenv sur Ubuntu 18.04
Créer un environnement python3 sur CentOS7
Créer un environnement de gestion de version pour Python, Ruby, Perl, Node.js sous UNIX
Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
Exécutez TensorFlow sur une instance GPU sur AWS
Créer un environnement Python 3 et OpenCV sur Ubuntu 18.04
Construire un environnement python sur MacOS (Catallina)
Créer un environnement Python avec Anaconda sur Mac
Procédure de déploiement sur AWS ① Paramètres d'environnement réseau
Construire WordPress sur CentOS 8 dans l'environnement LAMP
Construire un environnement OpenCV-Python sur Raspberry Pi B +
Créer un environnement Python + OpenCV sur Cloud9