[PYTHON] Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda

L'autre jour, j'ai écrit un article "xgboost (python) sur l'environnement d'instance spot EC2 préparé par AWS Lambda", mais la version Chainer est vient de le faire.

Ce serait bien si l'environnement pouvait être construit avec un seul bouton ou cli, donc en bref, le contenu de l'article suivant que j'ai écrit plus tôt était automatisé avec Lambda.

Configurez AWS EC2 g2.2xlarge avec une instance spot et essayez d'exécuter chainer http://qiita.com/pyr_revs/items/e1545e6f464b712517ed

Qu'est-ce que tu fais

  1. Créez un fichier sh pour installer Chainer et enregistrez-le dans S3
  2. Demandez une instance ponctuelle d'EC2. Incorporez le pilote NVIDIA, CUDA et diverses autres dépendances dans UserData.
  3. Lorsque l'instance est lancée, UserData effectuera une installation de dépendances. De plus, téléchargez le fichier sh créé à l'étape 1 à partir de s3 et reprenez le traitement à ec2-user.
  4. Chainer est installé par le fichier sh qui s'exécute avec les privilèges utilisateur ec2.
  5. Pour vérifier le fonctionnement, essayez d'exécuter mnist de Chainer sur le GPU.
  6. Envoyez une notification à SNS lorsque tout est fait

Où une préparation / un réglage est nécessaire

La préparation du rôle IAM, les paramètres Lambda, les parties à jouer dans le code, etc. sont presque les mêmes que ci-dessous.

xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda # Où une préparation / configuration est requise http://qiita.com/pyr_revs/items/4cc188a63eb9313cd232#%E6%BA%96%E5%82%99%E8%A8%AD%E5%AE%9A%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D

Lambda Function

En raison du prix de g2.2xlarge, EC2 est le nord de la Virginie (la zone de disponibilité est us-east-1d qui semble être stable à ce jour). L'autre S3 / SNS / Lambda est supposé être dans la région de Tokyo.

Comme il est long, je l'ai également soulevé pour l'essentiel. https://gist.github.com/pyr-revs/31dba1c9aeff575f58b9

console.log('Launch-Chainer: Start');

var ec2Region = 'us-east-1';
var s3Region = 'ap-northeast-1';
var snsRegion = 'ap-northeast-1';

var s3Bucket = 'mybucket';
var shellScriptS3Key = 'sh/launch_chainer.sh';
var shellScriptS3Path = 's3://' + s3Bucket + '/' + shellScriptS3Key;

var cuDnnAS3Path = 's3://' + s3Bucket + '/cuda/cudnn-6.5-linux-x64-v2.tgz'; // optional

var availabilityZone = ec2Region + 'd';
var spotPrice = '0.2';
var imageId = 'ami-65116700'; // us-east-1, Amazon Linux 2015.09, HVM Instance Store 64 bit
//var imageId = 'ami-e3106686'; // us-east-1, Amazon Linux 2015.09, HVM(SSD)EBS-Backed 64 bit
//var imageId = 'ami-a22fb8a2'; // ap-northeast-1, Amazon Linux 2015.09, HVM Instance Store 64 bit
//var imageId = 'ami-9a2fb89a'; // ap-northeast-1, Amazon Linux 2015.09, HVM(SSD)EBS-Backed 64 bit

var instanceType = 'g2.2xlarge';
var iamInstanceProfile = 'my_ec2_role';
var securityGroup = 'launch-wizard-1';
var keyName = 'my_ssh_keypair';

var userData = (function () {/*#!/bin/bash
cd /root
# Update sudoers
tmp_sudoers=/root/sudoers_tmp
cat /etc/sudoers > $tmp_sudoers
cat >> $tmp_sudoers <<EOF
Defaults:ec2-user !requiretty
EOF
cat $tmp_sudoers > /etc/sudoers
# Install yum deps
yum update -y
yum groupinstall -y "Development tools"
yum -y install gcc-c++ python27-devel atlas-sse3-devel lapack-devel
yum install -y kernel-devel-`uname -r`
# Install NVIDIA Driver
wget -q http://us.download.nvidia.com/XFree86/Linux-x86_64/346.96/NVIDIA-Linux-x86_64-346.96.run
chmod +x NVIDIA-Linux-x86_64-346.96.run
./NVIDIA-Linux-x86_64-346.96.run -s > driver.log 2>&1
# Install CUDA (without driver installation... for Amazon Linux 2015.09)
wget -q http://developer.download.nvidia.com/compute/cuda/7_0/Prod/local_installers/cuda_7.0.28_linux.run
chmod +x cuda_7.0.28_linux.run
./cuda_7.0.28_linux.run -extract=/root
./cuda-linux64-rel-7.0.28-19326674.run -noprompt > cuda.log 2>&1
# Install cuDNN (Optional)
#aws s3 cp %s ./
#tar zxvf cudnn-6.5-linux-x64-v2.tgz
#cd cudnn-6.5-linux-x64-v2
#cp lib* /usr/local/cuda/lib64/
#cp cudnn.h /usr/local/cuda/include/
# Install python deps
pip install numpy
pip install six
# Update .bashrc for ec2-user
tmp_bashrc=/home/ec2-user/.bashrc_backup
cat /home/ec2-user/.bashrc > $tmp_bashrc
cat >> $tmp_bashrc <<EOF
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
EOF
cat $tmp_bashrc > /home/ec2-user/.bashrc
# Launch post-installation script with ec2-user
aws s3 cp %s /home/ec2-user/launch_chainer.sh
chown ec2-user /home/ec2-user/launch_chainer.sh
chmod +x /home/ec2-user/launch_chainer.sh
su - ec2-user /home/ec2-user/launch_chainer.sh
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

var shellScriptContents = (function () {/*#!/bin/bash
cd /home/ec2-user
# Install Chainer
git clone https://github.com/pfnet/chainer
cd /home/ec2-user/chainer
sudo -s python setup.py install > setup.log 2>&1
# Run Chainer Sample with GPU
cd /home/ec2-user/chainer/examples/mnist
python train_mnist.py --gpu=0 > run.log 2>&1
# Send SNS Message
export AWS_DEFAULT_REGION=%s
aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:My-SNS-Topic --subject "Launch Chainer Done" --message "Launch Chainer Done!!"
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

exports.handler = function(event, context) {
    var util = require('util');
    var AWS = require('aws-sdk');
    
    // Write sh file for chainer launch to S3
    AWS.config.region = s3Region;
    var shellScriptContentsFormatted = util.format(shellScriptContents, snsRegion);
    var s3 = new AWS.S3();
    var s3Params = {Bucket: s3Bucket, Key: shellScriptS3Key, Body: shellScriptContentsFormatted};
    var s3Options = {partSize: 10 * 1024 * 1024, queueSize: 1};
    
    s3.upload(s3Params, s3Options, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            context.fail('[Fail]');
        }
        else {
            console.log(data);
            
            // Lauch EC2 Spot Instance with UserData
            var userDataFormatted = util.format(userData, cuDnnAS3Path, shellScriptS3Path);
            var userDataBase64 = new Buffer(userDataFormatted).toString('base64');
    
            var ec2LaunchParams = {
                SpotPrice: spotPrice, 
                LaunchSpecification : {
                    IamInstanceProfile: {
                      Name: iamInstanceProfile
                    },
                    // EBS Setting (for ami-e3106686)
                    /*
                    BlockDeviceMappings : [
						{
                          DeviceName : '/dev/xvda',
                          Ebs : { VolumeSize : 16 }
                        },
					],
                    */
                    // Instance Storage Setting (for ami-65116700)
                    BlockDeviceMappings : [
						{
					      DeviceName  : '/dev/sdb',
					      VirtualName : 'ephemeral0'
					    }
					],
                    ImageId: imageId,
                    InstanceType: instanceType,
                    KeyName: keyName,
                    Placement: {
                      AvailabilityZone: availabilityZone
                    },
                    SecurityGroups: [
                        securityGroup
                    ],
                    UserData: userDataBase64
                }
            };
            
            AWS.config.region = ec2Region;
            var ec2 = new AWS.EC2();
            ec2.requestSpotInstances(ec2LaunchParams, function(err, data) {
                if (err) {
                    console.log(err, err.stack);
                    context.fail('[Fail]');
                }
                else {
                    console.log(data);
                    context.succeed('[Succeed]');
                }
            });
        }
    });
};

Addictif et changements par rapport à l'article précédent

Version du pilote NVIDIA pour Amazon Linux 2015.09

Dans Amazon Linux 2015.09 publié l'autre jour, lorsque j'essaie d'extraire et d'installer le pilote NVIDIA inclus dans CUDA, je reçois le message de malédiction suivant.

ERROR: Unable to build the NVIDIA kernel module

Il semble que la version du noyau du système d'exploitation soit montée et que le noyau-devel et le pilote ne correspondent pas et sont morts.

Téléchargement du pilote NVIDIA http://www.nvidia.co.jp/Download/Find.aspx?lang=jp

nvidia.png

Parmi les pilotes qui en sont sortis, "346.96 / 1.9.2015" était proche du numéro de version précédente. Je l'ai mis et cela a fonctionné, donc c'est un gâchis, mais je pense que le même problème se produira à l'avenir.

Au pire, mettez NVIDIA AMI à la demande (pas d'instance ponctuelle), consultez la version du pilote avec nvidia-smi, ou consultez la version cuda. Ou vous devrez peut-être vérifier l'état de kernel-devel.

Paramètres du disque

Auparavant, pour être honnête, je ne comprenais pas vraiment ce qu'était EBS et ce qu'était le stockage d'instance, alors j'ai lentement augmenté EBS à 16 Go pour éviter de manquer de tmp, mais "HVM ** Instance Store * J'ai remarqué que si vous utilisez un ami "* 64 bits", vous n'avez pas besoin d'utiliser EBS. Actuellement, le système d'exploitation est installé directement dans le stockage d'instance de base. Avec le SSD 60 Go fourni avec le g2.2xlarge, je ne suis pas mécontent pour le moment.

Prise en charge de la série Chainer 1.3

Maintenant que je n'ai plus besoin de mettre pycuda, la configuration est beaucoup plus simple. Je pense que le contrôle de fonctionnement de cuDNN est OK si python est démarré en mode interactif et que true est renvoyé ci-dessous.

from chainer import cuda
print cuda.cudnn_enabled

Recommended Posts

Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
Remarque: préparez l'environnement de CmdStanPy avec docker
Préparer l'environnement d'exécution de Python3 avec Docker
environnement en ligne du serveur de code (4) Lancer le serveur de code sur l'instance EC2
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
Procédure de déploiement sur les paramètres d'environnement du serveur AWS (2) (instance EC2)
Préparer l'environnement Chainer sous Windows
Préparez l'environnement de développement avec anyenv
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Utilisation de PhantomJS avec AWS Lambda jusqu'à l'affichage du html du site Web
Préparer un environnement pour utiliser OpenCV et Pillow avec AWS Lambda
# 1 Jusqu'au déploiement de l'application Web de Django (création d'une instance avec EC2 sur AWS)
Préparer l'environnement de développement pour Python sur AWS Cloud9 (installation de pip et changement d'heure)
Essayez Tensorflow avec une instance GPU sur AWS
Créer un environnement python avec pyenv sur EC2 (ubuntu)
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
[AWS] Lançons un test unitaire de la fonction Lambda dans l'environnement local
[AWS S3] Confirmation de l'existence de dossiers sur S3
environnement en ligne de serveur de code (3) Lancer une instance EC2 avec Boto3
L'histoire du partage de l'environnement pyenv avec plusieurs utilisateurs
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Prise en charge de l'environnement d'exécution Python 2.7 sur AWS Lambda (à partir de 2020.1)
Préparation de l'environnement d'exécution de PyTorch avec Docker Novembre 2019
Je veux AWS Lambda avec Python sur Mac!
Installez Ubuntu 20.04 avec GUI et préparez l'environnement de développement
Comment obtenir les informations des organisations, Cost Explorer d'un autre compte AWS avec Lambda (python)
[AWS] Installez node.js sur l'instance EC2 et exécutez l'exemple de programme
Unifier l'environnement de l'équipe de développement Python en commençant par Poetry
lire le tag qui vous est attribué dans ec2 avec boto3
Exécutons la commande à temps avec le bot discord
Réalisez l'arrêt automatique de l'instance EC2 avec Lambda + CloudWatch Events
Création d'un environnement Keras sur une instance AWS E2 G2 Février 2017
Je viens de créer un environnement virtuel avec la couche AWS lambda
Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack
Création d'un environnement pour exécuter des programmes Python sur AWS EC2
Obtenez le nom d'hôte du PC hôte avec Docker sous Linux
L'implémentation la plus simple d'AWS Lambda
Préparer l'environnement python3 avec Docker
PyTorch avec AWS Lambda [importation Lambda]
Lire les coordonnées du tracé sur le graphe avec Python-matplotlib (super débutant)
Créer un environnement Chainer à l'aide de CUDA et cuDNN sur une instance p2
Construction d'environnement de Tensorflow et Chainer par Window avec CUDA (avec GPU)
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
J'ai étudié avec Kaggle Start Book basé sur kaggle [Partie 1]
Grattage sans serveur régulier avec AWS lambda + scrapy, partie 1
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
Préparez un environnement de test de charge distribué avec l'outil de test de charge Python Locust
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Mémorandum lors de l'exécution de Python sur EC2 avec Apache
Consigner périodiquement les valeurs des capteurs d'environnement Omron avec Raspberry Pi
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)