[PYTHON] Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor

Neulich schrieb ich einen Artikel "xgboost (Python) über die von AWS Lambda vorbereitete EC2-Spotinstanzumgebung", aber die Chainer-Version ist habe es gerade geschafft.

Es wäre schön, wenn die Umgebung mit einem einzigen Button oder Cli erstellt werden könnte. Kurz gesagt, der Inhalt des folgenden Artikels, den ich zuvor geschrieben habe, wurde mit Lambda automatisiert.

Richten Sie AWS EC2 g2.2xlarge mit einer Spot-Instanz ein und versuchen Sie, Chainer auszuführen http://qiita.com/pyr_revs/items/e1545e6f464b712517ed

Was machst du

  1. Erstellen Sie eine sh-Datei, um Chainer zu installieren, und speichern Sie sie in S3
  2. Fordern Sie eine Spot-Instanz von EC2 an. Integrieren Sie NVIDIA-Treiber, CUDA und verschiedene andere Abhängigkeiten in UserData.
  3. Wenn die Instanz gestartet wird, führt UserData eine Abhängigkeitsinstallation durch. Laden Sie außerdem die in Schritt 1 erstellte sh-Datei von s3 herunter und übernehmen Sie die Verarbeitung für ec2-user.
  4. Chainer wird von der sh-Datei installiert, die mit ec2-Benutzerrechten ausgeführt wird.
  5. Um den Vorgang zu überprüfen, versuchen Sie, Chainers Mnist auf der GPU auszuführen.
  6. Benachrichtigung an SNS senden, wenn alles erledigt ist

Wo Vorbereitung / Einstellung erforderlich ist

Die Vorbereitung der IAM-Rolle, die Lambda-Einstellungen, die im Code zu spielenden Rollen usw. sind fast die gleichen wie unten.

xgboost (Python) in einer von AWS Lambda # vorbereiteten EC2 Spot-Instanzumgebung # Wo Vorbereitung / Einstellung erforderlich ist 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

Aufgrund des Preises von g2.2xlarge ist EC2 Nord-Virginia (Verfügbarkeitszone ist us-east-1d, was ab heute stabil zu sein scheint). Andere S3 / SNS / Lambda befinden sich vermutlich in der Region Tokio.

Da es lang ist, habe ich es auch auf den Punkt gebracht. 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]');
                }
            });
        }
    });
};

Sucht & Änderungen gegenüber dem vorherigen Artikel

NVIDIA-Treiberversion für Amazon Linux 2015.09

In Amazon Linux 2015.09, das neulich veröffentlicht wurde, wird beim Versuch, den in CUDA enthaltenen NVIDIA-Treiber zu extrahieren und zu installieren, die folgende Fluchmeldung angezeigt.

ERROR: Unable to build the NVIDIA kernel module

Es scheint, dass die Kernel-Version des Betriebssystems hochgefahren ist und die Kernel-Entwicklung und der Treiber nicht übereinstimmten und starben.

NVIDIA-Treiber herunterladen http://www.nvidia.co.jp/Download/Find.aspx?lang=jp

nvidia.png

Unter den Treibern, die dies herausbrachten, lag "346.96 / 1.9.2015" nahe an der vorherigen Versionsnummer. Ich habe es reingelegt und es hat funktioniert, also ist es ein Chaos, aber ich denke, dass das gleiche Problem in Zukunft auftreten wird.

Stellen Sie im schlimmsten Fall NVIDIA AMI auf Anfrage (keine Spot-Instanz), sehen Sie sich die Treiberversion mit nvidia-smi an oder sehen Sie sich die cuda-Version an. Möglicherweise muss der Status der Kernel-Entwicklung überprüft werden.

Festplatteneinstellungen

Um ehrlich zu sein, habe ich vorher nicht wirklich verstanden, was EBS ist und was Instanzspeicher ist, also habe ich EBS schlampig auf 16 GB erhöht, um zu vermeiden, dass tmp ausgeht, aber "HVM ** Instance Store * Ich habe gerade bemerkt, dass Sie kein EBS verwenden müssen, wenn Sie "* 64 bit" ami verwenden. Derzeit wird das Betriebssystem direkt im Basisinstanzspeicher installiert. Mit der SSD 60 GB, die mit dem g2.2xlarge geliefert wird, bin ich im Moment nicht unzufrieden.

Unterstützung für Chainer 1.3-Serie

Jetzt, da ich keinen Pycuda mehr einsetzen muss, ist das Setup viel einfacher. Ich denke, dass die Funktionsprüfung von cuDNN in Ordnung ist, wenn Python im interaktiven Modus gestartet wird und true unten zurückgegeben wird.

from chainer import cuda
print cuda.cudnn_enabled

Recommended Posts

Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Code-Server-Online-Umgebung (4) Starten Sie den Code-Server auf der EC2-Instanz
# 2 Erstellen Sie eine Python-Umgebung mit einer EC2-Instanz von AWS (ubuntu18.04).
Bereitstellungsverfahren in den Umgebungseinstellungen von AWS (2) Server (EC2-Instanz)
Bereiten Sie die Chainer-Umgebung unter Windows vor
Bereiten Sie die Entwicklungsumgebung mit anyenv vor
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Verwenden von PhantomJS mit AWS Lambda bis zur Anzeige des HTML-Codes der Website
Bereiten Sie eine Umgebung für die Verwendung von OpenCV und Pillow mit AWS Lambda vor
# 1 Bis zur Bereitstellung der Webanwendung von Django (Erstellen einer Instanz mit EC2 unter AWS)
Bereiten Sie die Entwicklungsumgebung für Python unter AWS Cloud9 vor (Pip-Installation und Zeitumstellung)
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Erstellen Sie eine Python-Umgebung mit pyenv auf EC2 (Ubuntu)
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
[AWS] Lassen Sie uns einen Komponententest der Lambda-Funktion in der lokalen Umgebung durchführen
[AWS S3] Bestätigung des Vorhandenseins von Ordnern in S3
Code-Server-Online-Umgebung (3) Starten Sie eine EC2-Instanz mit Boto3
Die Geschichte des Teilens der Pyenv-Umgebung mit mehreren Benutzern
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Unterstützung für Python 2.7-Laufzeit auf AWS Lambda (ab 2020.1)
Vorbereiten der Ausführungsumgebung von PyTorch mit Docker November 2019
Ich möchte Lambda mit Python auf Mac AWS!
Installieren Sie Ubuntu 20.04 mit GUI und bereiten Sie die Entwicklungsumgebung vor
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
[AWS] Installieren Sie node.js auf der EC2-Instanz und führen Sie das Beispielprogramm aus
Vereinheitlichen Sie die Umgebung des Python-Entwicklungsteams, beginnend mit Poetry
Lesen Sie das Tag, das Ihnen in ec2 mit boto3 zugewiesen wurde
Lassen Sie uns den Befehl pünktlich mit dem Bot der Zwietracht ausführen
Realisieren Sie den automatischen Stopp der EC2-Instanz mit Lambda + CloudWatch-Ereignissen
Erstellen einer Keras-Umgebung auf einer AWS E2 G2-Instanz Februar 2017
Ich habe gerade eine virtuelle Umgebung mit der AWS-Lambda-Schicht erstellt
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack
Erstellen einer Umgebung zum Ausführen von Python-Programmen unter AWS EC2
Rufen Sie den Hostnamen des Host-PCs mit Docker unter Linux ab
Die einfachste AWS Lambda-Implementierung
Bereiten Sie die Python3-Umgebung mit Docker vor
PyTorch mit AWS Lambda [Lambda-Import]
Lesen Sie die Koordinaten des Diagramms in der Grafik mit Python-matplotlib (Super-Anfänger)
Erstellen Sie eine Chainer-Umgebung mit CUDA und cuDNN auf einer p2-Instanz
Umgebungskonstruktion von Tensorflow und Chainer durch Fenster mit CUDA (mit GPU)
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Ich habe mit Kaggle Start Book basierend auf Kaggle studiert [Teil 1]
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Ich habe versucht, den DNN-Teil von OpenPose mit Chainer-CPU auszuführen
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
Bereiten Sie eine verteilte Lasttestumgebung mit dem Python-Lasttest-Tool Locust vor
Erstellen einer Umgebung zum Ausführen von ChainerMN auf einer AWS-GPU-Instanz
Memorandum beim Ausführen von Python auf EC2 mit Apache
Protokollieren Sie die Omron-Umgebungssensorwerte regelmäßig mit Raspberry Pi
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).