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
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]');
}
});
}
});
};
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
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.
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.
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