xgboost (Python) in einer von AWS Lambda erstellten EC2 Spot-Instanzumgebung

Ich habe angefangen, xgboost zu berühren, aber ehrlich gesagt ist es schwierig, eine Umgebung für maschinelles Lernen zu erstellen.

Selbst wenn ich ein Verfahrenshandbuch oder ein Skript geschrieben habe, wo habe ich diese Datei später gemacht? Mit EC2 können Sie mit einer Spot-Instanz Geld sparen und parallel mit mehreren Einheiten experimentieren, während Sie Parameter ändern. Wenn die Umgebungskonstruktion jedoch auf einem Verfahrenshandbuch basiert, können Sie sehen, auf welchem Terminal welche Parameter verarbeitet werden. Es ist weg.

Wenn Sie zu dieser Zeit "Dinge erstellen, die mit AWS Lambda eine Umgebung mit einer Schaltfläche oder einem Befehl erstellen", ist es meiner Meinung nach relativ einfach, ad hoc zu arbeiten und verschiedene Fortschritte zu erzielen.

Im Folgenden möchte ich einen Ort schreiben, an dem ich versucht habe, eine Spot-Instanz von EC2 einzurichten und eine Umgebung zu erstellen, in der xgboost auf einmal über Lambda funktioniert.

Lamda function

Code

Fügen Sie Folgendes in Lambdas Hallo-Welt-Vorlage ein, indem Sie es überschreiben, und nehmen Sie dann verschiedene Einstellungen vor.

Da es lang ist, habe ich es auch auf den Punkt gebracht. https://gist.github.com/pyr-revs/d768984ed68500bdbeb9

console.log('Loading function');

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

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

var iamInstanceProfile = 'my_ec2_role';

var availabilityZone = ec2Region + 'a';
var spotPrice = '0.1';
var imageId = 'ami-9a2fb89a';
var instanceType = 'c3.2xlarge';
var securityGroup = 'launch-wizard-1';
var keyName = 'my_ssh_keypair';

var userData = (function () {/*#!/bin/bash
tmp=/root/sudoers_tmp
cat /etc/sudoers > $tmp
cat >> $tmp <<EOF
Defaults:ec2-user !requiretty
EOF
cat $tmp > /etc/sudoers
yum -y update
yum groupinstall -y "Development tools"
yum -y install gcc-c++ python27-devel atlas-sse3-devel lapack-devel
pip install numpy
pip install scipy
pip install pandas
aws s3 cp %s /home/ec2-user/launch_xgboost.sh
chown ec2-user /home/ec2-user/launch_xgboost.sh
chmod +x /home/ec2-user/launch_xgboost.sh
su - ec2-user /home/ec2-user/launch_xgboost.sh
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

var shellScriptContents = (function () {/*#!/bin/bash
git clone --recursive https://github.com/dmlc/xgboost.git
cd xgboost
./build.sh > build.log 2>&1
cd python-package
sudo -s python setup.py install > setup.log 2>&1
export AWS_DEFAULT_REGION=%s
aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:My-Sns-Topic --subject "Launch xgboost Done" --message "Launch xgboost Done!!"
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

exports.handler = function(event, context) {
    var util = require('util');
    var AWS = require('aws-sdk');
    
    // Write sh file for xgboost 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};
    //console.log(shellScriptContentsFormatted);
    
    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, shellScriptS3Path);
            var userDataBase64 = new Buffer(userDataFormatted).toString('base64');
    
            var ec2LaunchParams = {
                SpotPrice: spotPrice, 
                LaunchSpecification : {
                    IamInstanceProfile: {
                      Name: iamInstanceProfile
                    },
                    ImageId: imageId,
                    InstanceType: instanceType,
                    KeyName: keyName,
                    Placement: {
                      AvailabilityZone: availabilityZone
                    },
                    SecurityGroups: [
                        securityGroup
                    ],
                    UserData: userDataBase64
                }
            };
            //console.log(params);
            
            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]');
                }
            });
        }
    });
};

Was machst du

  1. Erstellen Sie eine sh-Datei, um xgboost zu installieren, und speichern Sie sie in S3
  2. Fordern Sie eine Spot-Instanz von EC2 an und schreiben Sie die Erstverarbeitung in UserData
  3. Wenn die Instanz gestartet wird, führen Sie yum usw. mit UserData aus. Laden Sie außerdem die in Schritt 1 erstellte sh-Datei von s3 herunter und übergeben Sie sie an ec2-user.
  4. xgboost wird von der sh-Datei installiert, die mit ec2-Benutzerrechten ausgeführt wird.
  5. Benachrichtigung an SNS senden, wenn alles erledigt ist

Grundsätzlich handelt es sich um eine Erweiterung des folgenden Artikels.

Erstellen Sie eine Spot-Instanz mit AWS Lambda und lassen Sie UserData automatisch die Umgebungskonstruktion und die lange Verarbeitung ausführen http://qiita.com/pyr_revs/items/c7f33d1cdee3118590e3

Wo Vorbereitung / Einstellung erforderlich ist

Lambda-Ausführungszeitlimit

Das Lambda-Zeitlimit beträgt standardmäßig nur 3 Sekunden. Erhöhen Sie es daher auf 60 Sekunden. Der Standardspeicher sollte 128 MB betragen.

IAM Role for Lambda

** Als IAM-Rolle **, auf der Lambda ausgeführt wird, müssen Sie eine Rolle mit den Berechtigungen "EC2-Instanz erstellen" und "Zugriff auf S3" erstellen. Es bedeutet, dass Sie die Verwaltungsrichtlinien "Amazon EC2 Full Access" und "Amazon S3 Full Access" anhängen sollten, aber aus irgendeinem Grund können Sie nicht in S3 schreiben, daher schüttle ich "Administrator Access". .. ..

Erstellen Sie eine IAM-Rolle für Ihre Benutzer. Erste Schritte mit AWS Lambda (1). Behandeln Sie Ereignisse aus Benutzeranwendungen http://dev.classmethod.jp/cloud/aws/getting-started-with-aws-lambda-1st-user-application/#prepare-iam-role

IAM-Rolle für das EC2-Instanzprofil

Als Rolle zum Anhängen an das EC2-Instanzprofil ** muss eine Rolle mit den Berechtigungen "Zugriff auf S3" und "Zugriff auf SNS" erstellt werden. Sie können die Verwaltungsrichtlinien "Amazon EC2 Full Access" und "Amazon SNS Full Access" anhängen. Schreiben Sie nach dem Erstellen den folgenden Teil neu.

var iamInstanceProfile = 'my_ec2_role';

Gewähren Sie mithilfe von IAM-Rollen Zugriff auf Anwendungen, die auf Amazon EC2-Instanzen ausgeführt werden http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

SNS Topic

Bitte machen Sie ein passendes SNS-Thema. Sie werden benachrichtigt, wenn xgboost installiert ist. Schreiben Sie den folgenden Arn am Ende des Shell-Skriptabschnitts neu.

aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:My-Sns-Topic --subject "Launch xgboost Done" --message "Launch xgboost Done!!"

Nun, es ist nicht unbedingt erforderlich, aber wenn Sie die E-Mail über SNS abonnieren, können Sie den Status mit Ihrem Smartphone verfolgen, auch wenn Sie sich nicht an der Vorderseite des PCs befinden. Daher wird dies empfohlen.

Erste Schritte mit Amazon Simple Notification Service https://docs.aws.amazon.com/ja_jp/sns/latest/dg/GettingStarted.html

Andere Einstellungen

Das Folgende ist, wie Sie sehen können, daher werde ich die Details weglassen, aber bitte ändern Sie es gegebenenfalls. Der s3-Bucket-Name und das Schlüsselpaar müssen jedoch geändert werden. Die imageId stammt von "Amazon Linux AMI 2015.09 / HVM (SSD) EBS-gestütztes 64-Bit / Asien-Pazifik-Tokio". Ändern Sie daher die Region. Es ist notwendig zu ändern, wenn ein Update kommt.

var s3Bucket = 'mybucket';

var availabilityZone = ec2Region + 'a';
var spotPrice = '0.1';
var imageId = 'ami-9a2fb89a';
var instanceType = 'c3.2xlarge';
var securityGroup = 'launch-wizard-1';
var keyName = 'my_ssh_keypair';

Funktionsprüfung

Es ist am einfachsten, es über Lambdas Test-Schaltfläche auszuführen. Natürlich können Sie auch von aws cli treffen. lambda.png

Bitte warten Sie eine Weile, nachdem Sie bestätigt haben, dass die Spot Instance-Anforderung erfolgt ist. Ist es ungefähr 15-20 Minuten? Die Installation von Numpy, Scipy und Pandas dauert eine Weile.

Sobald Sie eine EC2-Instanz und xgboost installiert haben, melden Sie sich mit ssh an. Führen Sie die Demo binary_classification aus, um den Vorgang zu überprüfen.

cd /home/ec2-user/xgboost/demo/binary_classification
./runexp.sh

Sofort kehrte es wie folgt zurück.

6513x126 matrix with 143286 entries is loaded from agaricus.txt.train
6513x126 matrix with 143286 entries is saved to agaricus.txt.train.buffer
1611x126 matrix with 35442 entries is loaded from agaricus.txt.test
1611x126 matrix with 35442 entries is saved to agaricus.txt.test.buffer
boosting round 0, 0 sec elapsed
tree prunning end, 1 roots, 12 extra nodes, 0 pruned nodes ,max_depth=3
[0]     test-error:0.016139     train-error:0.014433
boosting round 1, 0 sec elapsed
tree prunning end, 1 roots, 10 extra nodes, 0 pruned nodes ,max_depth=3
[1]     test-error:0.000000     train-error:0.001228

updating end, 0 sec in all
1611x126 matrix with 35442 entries is loaded from agaricus.txt.test.buffer
start prediction...
writing prediction to pred.txt
...[Abkürzung]...
booster[1]:
0:[odor=none] yes=2,no=1
        1:[bruises?=bruises] yes=4,no=3
                3:leaf=1.1457
                4:[gill-spacing=close] yes=8,no=7
                        7:leaf=-6.87558
                        8:leaf=-0.127376
        2:[spore-print-color=green] yes=6,no=5
                5:[gill-size=broad] yes=10,no=9
                        9:leaf=-0.0386054
                        10:leaf=-1.15275
                6:leaf=0.994744

Ich würde es gerne etwas länger sehen, also werde ich die Kaggle-Higgs-Demo ausprobieren. Die Daten müssen separat von Kaggle heruntergeladen und an EC2 gesendet werden.

cd /home/ec2-user/xgboost/demo/kaggle-higgs
mkdir data
# Copy training.csv and test.csv
./run.sh

Ergebnis. Dies dauert ebenfalls weniger als eine Minute.

[0]     train-auc:0.910911      [email protected]:3.699574
[1]     train-auc:0.915308      [email protected]:3.971228
[2]     train-auc:0.917743      [email protected]:4.067463
...[Abkürzung]...
[118]   train-auc:0.945648      [email protected]:5.937291
[119]   train-auc:0.945800      [email protected]:5.935622
finish training
finish loading from csv 

Nun, so ist es eine Anerkennung, dass es ohne Probleme funktioniert.

Memo, wo ich süchtig war

UserData Section

Abhängigkeiten in yum setzen

yum groupinstall -y "Development tools"
yum -y install gcc-c++ python27-devel atlas-sse3-devel lapack-devel

Entwicklungswerkzeuge wie gcc und Blas / Lapack usw. sind erforderlich, daher habe ich sie aufgenommen. Ich bezog mich auf Folgendes.

Installing scikit-learn on Amazon EC2 http://dacamo76.com/blog/2012/12/07/installing-scikit-learn-on-amazon-ec2/

Abhängigkeiten, die mit pip eingegeben werden sollen

pip install numpy
pip install scipy
pip install pandas

numpy und scipy sind erforderlich. Ich mag Pandas, weil die Installation sehr lange dauert, aber es scheint, dass es verschiedene Verbesserungen gibt, daher denke ich, dass es in Ordnung ist, sie einzuschließen.

Verbesserte Integration von Python XGBoost + Pandas http://sinhrks.hatenablog.com/entry/2015/10/03/080719

/etc/sudoers

tmp=/root/sudoers_tmp
cat /etc/sudoers > $tmp
cat >> $tmp <<EOF
Defaults:ec2-user !requiretty
EOF
cat $tmp > /etc/sudoers

In EC2 (oder AMI) ist standardmäßig ein anderes sudo als root erforderlich (sudo kann nicht im Shell-Skript ausgeführt werden). Dies wird später ein Problem sein. Fügen Sie daher am Ende der Datei "Defaults: ec2-user! Requiretty" hinzu, damit ec2-user auch im Shell-Skript sudo kann.

Beziehen Sie sich auf Folgendes und setzen Sie es grob unter der Annahme, dass die Instanz nach Abschluss schnell gelöscht wird.

Lassen Sie die Passworteingabe weg, die oft benötigt wird http://qiita.com/yuku_t/items/5f995bb0dfc894c9f2df

ShellScript Section

xgboost Installation

git clone https://github.com/dmlc/xgboost.git
cd xgboost
./build.sh > build.log 2>&1
cd python-package
sudo -s python setup.py install > setup.log 2>&1

Von der Quelle installieren. Führen Sie zuerst xgboost / build.sh aus, um eine Binärdatei zu erstellen, und installieren Sie sie dann in Python mit xgboost / python-package / setup.py.

python setup.py install erfordert sudo. Wenn Sie / etc / sudoers nicht einstellen, werden Sie süchtig nach "sudo: Entschuldigung, Sie müssen eine tty haben, um sudo auszuführen".

abschließend

Wenn Sie die automatische Beendigung beenden möchten, wenn Sie fertig sind, oder nachts stapeln möchten, kann Folgendes hilfreich sein.

Cron Lambda von der AWS Data Pipeline (ohne EC2 zu starten) http://qiita.com/pyr_revs/items/d2ec88a8fafeace7da4a

Erstellen Sie eine Spot-Instanz mit AWS Lambda und lassen Sie UserData automatisch die Umgebungskonstruktion und die lange Verarbeitung ausführen http://qiita.com/pyr_revs/items/c7f33d1cdee3118590e3

Recommended Posts

xgboost (Python) in einer von AWS Lambda erstellten EC2 Spot-Instanzumgebung
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
# 2 Erstellen Sie eine Python-Umgebung mit einer EC2-Instanz von AWS (ubuntu18.04).
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Bereitstellungsverfahren in den Umgebungseinstellungen von AWS (2) Server (EC2-Instanz)
Erstellen einer Umgebung zum Ausführen von Python-Programmen unter AWS EC2
Führen Sie Python planmäßig auf AWS Lambda aus
Erstellen Sie eine AWS Cloud9-Entwicklungsumgebung auf einer Amazon EC2-Instanz
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
[Python] Führen Sie Headless Chrome unter AWS Lambda aus
Ich habe problemlos eine Betriebsumgebung für Python3 + Tornado unter AWS EC2 erstellt.
Das Modul kann nicht in Python auf EC2 importiert werden, das von AWS Lambda ausgeführt wird
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
[Version 2020] So installieren Sie Python3 auf EC2 von AWS
Erstellen Sie eine Python-Umgebung mit pyenv auf EC2 (Ubuntu)
Code-Server-Online-Umgebung (4) Starten Sie den Code-Server auf der EC2-Instanz
Python-Entwicklung unter Ubuntu unter AWS EC2 (mit Jupyter Lab)
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
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)
Ich möchte Lambda mit Python auf Mac AWS!
Führen Sie den Tensorflow der GPU-Version vor Ort in AWS EC2 aus
Gepostet als Anhang zu Slack auf AWS Lambda (Python)
[AWS] Installieren Sie node.js auf der EC2-Instanz und führen Sie das Beispielprogramm aus
Erstellen einer Keras-Umgebung auf einer AWS E2 G2-Instanz Februar 2017
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
[Python] Scraping in AWS Lambda
Erstellen Sie eine Python-Umgebung unter Windows
Erstellen Sie eine Python-Umgebung mit Windows
Python - Installieren Sie MySQLDB auf EC2
Best Practice für die Anmeldung im JSON-Format unter AWS Lambda / Python
Erstellen einer Umgebung zum Ausführen von ChainerMN auf einer AWS-GPU-Instanz
Erstellen einer Python-Umgebung auf einem Mac
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Richten Sie eine Python-Entwicklungsumgebung unter Ubuntu ein
Aufbau einer Anaconda-Python-Umgebung unter Windows 10
Berühren Sie Unterstützung für AWS Lambda-Umgebungsvariablen
Erstellen einer Python-Umgebung unter Ubuntu
Kivy + Python3 zur Wartung der OSX-Umgebung
Installieren Sie xgboost (Python-Version) unter Windows
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Schreiben Sie die AWS Lambda-Funktion in Python
Verwenden Sie jupyter für eine GPU-Instanz in AWS
Konstruktionsnotiz für die Python-Umgebung auf dem Mac
Aufbau einer Python-Entwicklungsumgebung unter macOS
Richten Sie die Python-Umgebung unter CentOS ein
Versuchen Sie, AWS Lambda-Umgebungsvariablen anzugeben?
Erstellen Sie eine Python-Umgebung in Centos
Erstellen einer Umgebung für Python3.8 auf einem Mac
Installieren Sie die Python-Entwicklungsumgebung unter Windows 10
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Erstellen Sie die Python 3.8 + Pipenv-Umgebung unter Ubuntu 18.04
Erstellen Sie eine Python3-Umgebung unter CentOS7
Führen Sie die Python 3.5.2-Umgebung unter Amazon Linux ein
OpenCV3 & Python3 Umgebungskonstruktion unter Ubuntu
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus