xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda

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

Qu'est-ce que tu fais

  1. Créez un fichier sh pour installer xgboost et enregistrez-le dans S3
  2. Demandez une instance ponctuelle d'EC2 et écrivez le traitement initial dans UserData
  3. Au démarrage de l'instance, exécutez yum etc. avec UserData. De plus, téléchargez le fichier sh créé à l'étape 1 à partir de s3 et remettez-le à ec2-user.
  4. xgboost est installé par le fichier sh qui s'exécute avec les privilèges utilisateur ec2.
  5. Envoyez une notification à SNS lorsque tout est fait

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

Où une préparation / un réglage est nécessaire

Délai d'exécution Lambda

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

Rôle IAM pour le profil d'instance EC2

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

Autres réglages

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';

Contrôle de fonctionnement

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. lambda.png

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.

Mémo où j'étais accro

UserData Section

Dépendances à mettre en yum

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/

Dépendances à mettre en place avec pip

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

installation de xgboost

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.

en conclusion

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

xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda
Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Procédure de déploiement sur les paramètres d'environnement du serveur AWS (2) (instance EC2)
Création d'un environnement pour exécuter des programmes Python sur AWS EC2
Exécutez Python selon la planification sur AWS Lambda
Créer un environnement de développement AWS Cloud9 sur une instance Amazon EC2
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
[Python] Exécutez Headless Chrome sur AWS Lambda
J'ai facilement créé un environnement d'exploitation pour Python3 + Tornado sur AWS EC2.
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda
Exécutez régulièrement des programmes Python sur AWS Lambda
[Version 2020] Comment installer Python3 sur EC2 d'AWS
Créer un environnement python avec pyenv sur EC2 (ubuntu)
environnement en ligne du serveur de code (4) Lancer le serveur de code sur l'instance EC2
Développement Python sur Ubuntu sur AWS EC2 (à l'aide de Jupyter Lab)
J'ai essayé de réduire les coûts en démarrant / arrêtant EC2 dans un lot avec AWS Lambda
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Prise en charge de l'environnement d'exécution Python 2.7 sur AWS Lambda (à partir de 2020.1)
Je veux AWS Lambda avec Python sur Mac!
Exécutez la version GPU tensorflow sur une instance ponctuelle d'AWS EC2
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
[AWS] Installez node.js sur l'instance EC2 et exécutez l'exemple de programme
Création d'un environnement Keras sur une instance AWS E2 G2 Février 2017
Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack
[Python] Permet d'importer les packages pip3 sur AWS Lambda
[Python] Scraping dans AWS Lambda
Créer un environnement Python sur Windows
Construire un environnement Python avec Windows
Python --Installez MySQLDB sur EC2
Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Construire un environnement Python sur Mac
Récapitulatif si vous utilisez AWS Lambda (Python)
Configurer un environnement de développement Python sur Ubuntu
Construction de l'environnement Anaconda Python sous Windows 10
Prise en charge de la variable d'environnement AWS Lambda
Construire un environnement Python sur Ubuntu
Kivy + Python3 sur la maintenance de l'environnement OSX
Installez xgboost (version python) sur Windows
Créer un environnement Python sur Mac (2017/4)
Ecrire une fonction AWS Lambda en Python
Utiliser jupyter sur une instance GPU sur AWS
Mémo de construction de l'environnement Python sur Mac
Construction de l'environnement de développement Python sur macOS
Configurer l'environnement Python sur CentOS
Essayez de fournir des variables d'environnement AWS Lambda?
Créer un environnement python dans centos
Construire un environnement pour python3.8 sur Mac
Installer l'environnement de développement Python sur Windows 10
Notifier HipChat avec AWS Lambda (Python)
Créer un environnement Python 3.8 + Pipenv sur Ubuntu 18.04
Créer un environnement python3 sur CentOS7
Présentation de l'environnement Python 3.5.2 sur Amazon Linux
Construction d'environnements OpenCV3 et Python3 sur Ubuntu
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World