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]');
}
});
}
});
};
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
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
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
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';
Es ist am einfachsten, es über Lambdas Test-Schaltfläche auszuführen. Natürlich können Sie auch von aws cli treffen.
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.
UserData Section
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/
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
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".
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