J'ai commencé à toucher xgboost, mais honnêtement, il est difficile de créer un environnement d'apprentissage automatique.
Même si j'ai écrit un manuel de procédure ou un script, où ai-je fait ce fichier plus tard? Avec EC2, vous pouvez économiser de l'argent avec une instance ponctuelle et expérimenter en parallèle avec plusieurs unités tout en modifiant les paramètres, mais si la construction de l'environnement est basée sur un manuel de procédure, vous pouvez voir quel est le terminal exécutant quel traitement de paramètre. C'est parti.
Dans ce domaine, si vous créez "des choses qui créent un environnement avec un bouton ou une commande avec AWS Lambda", j'estime qu'il est relativement facile de faire des ad hoc et de faire divers progrès.
Dans ce qui suit, j'aimerais écrire un endroit où j'ai essayé de configurer une instance ponctuelle d'EC2 et de créer un environnement dans lequel xgboost fonctionne d'un seul coup via Lambda.
Lamda function
Code
Collez ce qui suit dans le modèle hello-world de Lambda en écrasant, puis définissez divers paramètres.
Comme il est long, je l'ai également soulevé pour l'essentiel. 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]');
}
});
}
});
};
En gros, c'est une extension de l'article suivant.
Créez une instance ponctuelle avec AWS Lambda et laissez UserData exécuter automatiquement la construction de l'environnement et le long traitement http://qiita.com/pyr_revs/items/c7f33d1cdee3118590e3
Le délai d'expiration Lambda est aussi court que 3 secondes par défaut, augmentez-le donc à 60 secondes. La mémoire par défaut doit être de 128 Mo.
IAM Role for Lambda
** En tant que rôle IAM ** qui exécute Lambda, vous devez créer un rôle doté des autorisations "Créer une instance EC2" et "Accéder à S3". Cela signifie que vous devez attacher les politiques de gestion «Amazon EC2 Full Access» et «Amazon S3 Full Access», mais pour une raison quelconque, vous ne pouvez pas écrire dans S3, donc je secoue «Administrator Access». .. ..
Créez un rôle IAM pour vos utilisateurs - Premiers pas avec AWS Lambda (1). Gérez les événements des applications utilisateur http://dev.classmethod.jp/cloud/aws/getting-started-with-aws-lambda-1st-user-application/#prepare-iam-role
En tant que rôle à attacher au profil d'instance EC2 **, il est nécessaire de créer un rôle avec les autorisations «accès à S3» et «accès à SNS». Vous pouvez joindre les politiques de gestion "Accès complet Amazon EC2" et "Accès complet Amazon SNS". Après l'avoir fait, réécrivez la partie suivante.
var iamInstanceProfile = 'my_ec2_role';
Accorder l'accès aux applications exécutées sur des instances Amazon EC2 à l'aide de rôles IAM http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
SNS Topic
Veuillez créer un sujet SNS approprié. Vous serez averti lorsque xgboost sera installé. Réécrivez l'arn suivant à la fin de la section du script shell.
aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:My-Sns-Topic --subject "Launch xgboost Done" --message "Launch xgboost Done!!"
Eh bien, ce n'est pas essentiel, mais si vous vous abonnez à l'e-mail sur SNS, vous pouvez suivre l'état avec votre smartphone même si vous êtes loin de l'avant du PC, c'est donc recommandé.
Premiers pas avec Amazon Simple Notification Service https://docs.aws.amazon.com/ja_jp/sns/latest/dg/GettingStarted.html
Ce qui suit est comme vous pouvez le voir, donc je vais omettre les détails, mais veuillez les modifier si nécessaire. Cependant, le nom du compartiment s3 et la paire de clés doivent être modifiés. L'imageId provient de «Amazon Linux AMI 2015.09 / HVM (SSD) EBS-Backed 64-bit / Asia Pacific Tokyo», changez donc la région. Il est nécessaire de changer lorsqu'une mise à jour arrive.
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';
Il est plus simple de l'exécuter à partir du bouton Test de Lambda. Bien sûr, vous pouvez également frapper à partir de aws cli.
Veuillez patienter quelques instants après avoir confirmé que la demande d'instance Spot a été effectuée. Est-ce environ 15-20 minutes? Il faut un certain temps pour installer numpy, scipy et pandas.
Une fois que vous avez installé une instance EC2 et xgboost, connectez-vous avec ssh. Lançons la démo de binary_classification pour vérifier l'opération.
cd /home/ec2-user/xgboost/demo/binary_classification
./runexp.sh
Immédiatement, il est revenu comme suit.
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
...[Abréviation]...
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
Je veux le voir un peu plus longtemps, alors je vais essayer la démo de kaggle-higgs. Les données doivent être téléchargées séparément de Kaggle et envoyées à EC2.
cd /home/ec2-user/xgboost/demo/kaggle-higgs
mkdir data
# Copy training.csv and test.csv
./run.sh
résultat. Cela prend également moins d'une 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
...[Abréviation]...
[118] train-auc:0.945648 [email protected]:5.937291
[119] train-auc:0.945800 [email protected]:5.935622
finish training
finish loading from csv
Eh bien, comme ça, c'est une reconnaissance que cela fonctionne sans problèmes.
UserData Section
yum groupinstall -y "Development tools"
yum -y install gcc-c++ python27-devel atlas-sse3-devel lapack-devel
Des outils de développement tels que gcc et Blas / Lapack etc. sont nécessaires, donc je les ai inclus. J'ai évoqué ce qui suit.
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 et scipy sont nécessaires. J'aime les pandas parce que l'installation prend beaucoup de temps, mais il semble qu'il y ait diverses améliorations, donc je pense que c'est correct de l'inclure.
Amélioration de l'intégration de 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
Dans EC2 (ou AMI), sudo autre que root est requis par défaut tty (sudo ne peut pas être fait dans le script shell). Ce sera un problème plus tard, alors ajoutez Defaults: ec2-user! Requireetty
à la fin du fichier afin que ec2-user puisse également sudo dans le script shell.
Reportez-vous à ce qui suit et définissez-le approximativement en supposant que l'instance sera supprimée rapidement lorsqu'elle sera terminée.
Omettez l'entrée de mot de passe qui est requise plusieurs fois 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
Installer à partir de la source. Tout d'abord, exécutez xgboost / build.sh pour créer un binaire, puis installez-le en Python avec xgboost / python-package / setup.py.
python setup.py install
nécessite sudo. Si vous ne définissez pas / etc / sudoers, vous deviendrez accro à sudo: sorry, vous devez avoir un tty pour exécuter sudo
.
Si vous souhaitez effectuer une résiliation automatique lorsque vous avez terminé, ou un lot la nuit, ce qui suit peut être utile.
Cron Lambda à partir d'AWS Data Pipeline (sans lancer EC2) http://qiita.com/pyr_revs/items/d2ec88a8fafeace7da4a
Créez une instance ponctuelle avec AWS Lambda et laissez UserData exécuter automatiquement la construction de l'environnement et le long traitement http://qiita.com/pyr_revs/items/c7f33d1cdee3118590e3
Recommended Posts