Docker et aws pour l’industrialisation et l’archivage de modèles d’apprentissage 1/2

dans ce premier article nous abordons l’utilisation de Docker dans l’industrialisation de travaux de Data Science, avant d’aborder l’utilisation de GPU selon le même principe dans un second article.

La majorité des data scientists ou ingénieurs machine learning recherchent continuellement la génération de modèles efficaces. Après un grand nombre d’expérimentations et des discussions intenses sur la sélection des meilleurs modèles (deep learning, boosting, bagging ou autres), viennent des tâches toutes aussi importantes, qui sont l’industrialisation et l’archivage des expérimentations.

Dans ce tutoriel, nous allons vous montrer comment déployer vos applications et archiver vos expérimentations sur docker et aws (EC2 et S3).

Alors que l’industrialisation d’un modèle est généralement imposée par le client (interne ou externe), peu de personnes s’intéressent aux expérimentations effectuées avant la génération du modèle final.

Ces expérimentations sont effectuées sur différents modèles d’apprentissage et peuvent être décrites par les résultats des modèles et les commentaires à chaud du data scientists les ayant effectuées. Ces dernières peuvent également être très utiles dans différents cas :

  • Le remplacement du modèle sélectionné à cause d’un comportement imprévu
  • Leur réutilisation dans des datasets similaires
  • Le benchmarking des modèles et la génération d’une base de connaissances.

Docker (https://www.docker.com/) est une solution très pratique pour l’industrialisation des modèles de machine learning ainsi que pour l’archivage automatique de différentes versions d’applications.

Ce dernier est aujourd’hui devenu très populaire à cause de sa simplicité ainsi qu’aux avantages qu’il offre comparée à la virtualisation. Cet environnement applicatif peut ainsi être utilisé non seulement dans la phase de production, mais également dans la phase de développement pour sauvegarder les différentes versions d’une application sur le Cloud et organiser la phase de développement. Docker offre ainsi les avantages suivants :

  • Sauvegarde de vos application sur le Cloud à partir d’un registre comme Dockerhub ( https://hub.docker.com/ )
  • Gestion automatique des versions par Dockerhub
  • Organisation des applications en dossiers et ajout de tags.
  • Partage de vos applications avec d’autres utilisateurs pour les abonnées (ou les rendre publiques/privées gratuitement)
  • Réutilisation des environnements applicatifs que vous avez générés ou qui ont été rendus publics par des utilisateurs sur docker-hub (permet d’économiser du temps d’installation et de paramétrage)

Avant d’aller plus loins dans ce tutoriel, nous allons faire une brève présentation de Docker dans la section suivante. Si vous le connaissez déjà ou si vous êtes sur vos clavier entrain d’essayer de déployer une application :], allez à la section “déploiement avec docker”.

Présentation de docker

Docker est un environnement applicatif qui se base sur “la conteneurisation des applications”. Un conteneur applicatif est un un environnement d’exécution pour applications. Comme la virtualisation, la conteneurisation permet “d’emprisonner” des application dans des conteneurs, et de les empêcher “de perturber” les autres applications. Etant donné que chaque application fait appel à des packages spécifiques (avec des versions spécifiques), la conteneurisation permet de doter chaque application d’un environnement d’exécution qui lui est adaptée.

Après cette brève présentation, vous devez vous dire que tout ça ressemble beaucoup à la virtualisation. Oui, mais avec certaines différences (voir figure ci-dessous):

La virtualisation installe plusieurs systèmes d’exploitation sur une machine physique (une par machine virtuelle), alors que la conteneurisation réutilise le même système d’exploitation pour tous les conteneurs.

Cette distinction permet à la conteneurisation d’être beaucoup plus efficace en termes d’espace et de temps de déploiement que la virtualisation, tout en ayant les mêmes objectifs.

Déploiement avec docker

Les instructions suivantes présentent le déploiement et l’archivage d’applications avec Docker.

1 Créez un compte sur Dockerhub
2 Téléchargez et installez Docker

Vous pouvez faire cela à partir de la ligne de commande, ou à partir des fichiers sources sur le site officiel de docker.

Avec yum (ex: CentOS, Fedora, RHEL)

sudo yum install docker

avec apt (ex: ubuntu, mint)
sudo apt-get install docker

3 Créez un dossier pour votre application que nous allons appeler “CONTAINER_HOME”. Tous les fichiers que vous allez créer ainsi que votre application devront être dans ce dossier.

4 Créez un fichier Dockerfile sous CONTAINER_HOME.
Ce fichier contient les instructions qui vont générer votre conteneur. La bonne nouvelle est que les instructions nécessaires pour rédiger une Dockerfile sont similaires aux instructions shell.

ci-dessous, un exemple simple de Dockerfile:

FROM python:3-onbuild
CMD ["python", "./chemin/ton_script.py"]

Ce fichier contenant deux ligne indique qu’il faut télécharger l’image source publique python:3-onbuild et qu’il faut ensuite exécuter la commande “python ton_script.py”.
L’image source est une image rendu disponible par Docker. Elle contient certaines applications souvent sollicités par les utilisateurs de Docker.

NB: le fichier docker doit se nommer “Dockerfile”.
NB:./chemin fait référence au chemin sous CONTAINER_HOME. Ainsi, si le script qui lance l’application est directement sous CONTAINER_HOME, la commande pour lancer ce script devient:
CMD ["python", "./ton_script.py"].

5 Créez dans la même racine (CONTAINER_HOME) un fichier requirements.txt qui inclut les packages python qui seront utilisés par votre application.
Voici un exemple de fichier requirements.txt que j’ai créé dans le cadre d’une application :

numpy==1.16.2
pandas==0.24.2
xgboost==0.82
sklearn

N’ayant pas inclus de version pour sklearn, pip va télécharger la dernière disponible.

NB: Il n’est ainsi pas nécessaire d’ajouter un “RUN pip install requirements.txt” dans le Dockerfile pour cette image. L’image source python:3-onbuild va automatiquement chercher requirements.txt dans CONTAINER_HOME et va installer les packages inclus dans ce fichier.

6 Mettez votre application dans CONTAINER_HOME. Le chemin vers le script qui va la lancer doit être le même que celui dans CMD [« python », « ./chemin/ton_script.py »]

7 Construisez une image de votre environnement applicatif avec la commande build.
Pour cela, ouvrez un shell et naviguez vers CONTAINER_HOME.
Utilisez la commande suivante pour construire votre conteneur
docker build -t identifiant_docker/nom_du_conteneur:tag .

remplacez identifiant_docker par votre identifiant sur docker hub, nom_du_conteneur par un nom que vous souhaitez donner à votre conteneur (ex: stationarytimeseries) et remplacez tag par un label qui identifie votre conteneur (ex: xgbregressor-linearmodels).
NB: le point à la fin de la ligne de commande fait référence au dossier à partir duquel le conteneur va être construit.

8 Connectez vous à dockerhub en ligne de commande et insérez votre login et mot de passe.
docker login

9 Téléversez votre image sur Dockerhub pour qu’il soit sauvegardé sur le Cloud.
docker push identifiant_docker/nom_du_conteneur:tag

👏👏 Vous venez de créer votre première image Docker !!!

NB: Vous pouvez maintenant téléverser plusieurs versions de votre conteneur (ex par algo différent, par modèle de données différent ou par métrique optimisée). Dans chacune de ces versions, utilisez un tag différent.

10 Vous pouvez maintenant exécuter votre conteneur sur n’import quelle machine.

Exécution dans le cloud – Ici sur Amazon Web Services


Nous allons l’exécuter sur Amazon EC2, mais vous pouvez utiliser votre machine ou un autre service Cloud. Nous allons utiliser Amazon S3 ( https://aws.amazon.com/fr/s3/ ) pour enregistrer les résultats des modèles exécutés dans le conteneur. S3 est un service de stockage de données sur le Cloud proposé par Amazon.

Ainsi, connectez vous à votre serveur EC2 à travers aws-cli et abonnez vous à un service de stockage S3 (Il existe des versions gratuites de ces services).

Créez un répertoire sur votre serveur EC2 et naviguez vers ce dernier en ligne de commande. Nous allons créer sous ce répertoire un RUN.sh qui télécharge et execute votre Conteneur.

Le RUN.sh devra :

  1. installer et lancer docker sur votre serveur
  2. Vous connecter à S3 à travers votre serveur EC2
  3. Créer un répertoire pour la récupération des résultats à partir de votre conteneur
  4. Télécharger et exécuter le conteneur
  5. Copier les résultats écrits par le conteneur sur S3

La troisième étape est nécessaire parce que Docker empêche les conteneurs de communiquer directement entre eux ou avec l’hôte. Il permet cela de manière contrôlé à partir de réseaux virtuels ou de points de montage. Nous allons utiliser la seconde option en définissant un dossier en commun entre l’hôte, qui est votre serveur EC2 et le conteneur Docker.

Ci-dessous un fichier qui vous permet d’effectuer les quatre tâches décrites plus haut :

yum install docker
service docker start
docker login -u="identifiant" -p="mot de passe"
{ echo ‘AWSAccessKeyId ';
echo 'AWSSecretKey;
echo 'region (ex: eu-west-1)';
echo '\n'
} | aws configure
mkdir res
docker run -v ./res:/usr/src/res:z identifiant_docker/nom_du_conteneur:tag
aws s3 cp /home/ec2-user/scripts/res/test-models.txt s3://test-models

NB: Dans la commande ci-dessous, l’option -v est suivi de deux noms de dossier “dossier hôte:dossier Docker”. Cette option permet de monter le dossier Docker sur le dossier hôte, rendant disponible à l’hôte tout ce qui est écrit par le conteneur et vice-versa. Cela permet à Docker et à l’hôte de communiquer. Cette option est suivi de :z qui permet d’ajouter les autorisations nécessaires pour que Docker écrive sur le fichier hôte.
docker run -v ./res:/usr/src/res:z identifiant_docker/nom_du_conteneur:tag

Pour synthétiser, voici les opérations que nous avons automatisées et que l’on peut inscrire dans un processus d’automatisation plus général (où l’on invoquera selon les goûts Terraform, AWS cloud formation, …)

Avec cette approche, vous pouvez multiplier et reproduire facilement les processus d’entraînement de vos algorithmes.

Omar JAAFOR, Senior Data Scientist @Novagen