CodaLab - Concours de Data Science
17 déc. 2018
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
CodaLab Competition est une plateforme servant à l’exécution de code dans le domaine de la Data Science. Elle se présente sous la forme d’une interface web sur laquelle un utilisateur peut soumettre du code ou des résultats et se comparer aux autres. Voyons ensemble comment fonctionne et comment installer CodaLab On-Premise.
La compétition est omniprésente dans nos vies personnelles et professionnelles. Son objectif n’est pas forcément la volonté d’être meilleure que les autres. Au contraire, le but principal est de pouvoir constamment se surpasser tout en y prenant du plaisir. Dans le monde du Big Data et plus généralement celui de l’informatique, le fait de participer à des compétitions présente plusieurs avantages. Par exemple, y concourir permet de monter en compétences sur de nouvelles technologies et d’évaluer ses réelles capacités. En effet, en étant confronté à d’autre personnes, on peut évaluer ses propres aptitudes. Organiser des compétitions en interne peut revitaliser le groupe, motiver davantage les membres au sein d’une équipe. Cela encourage à développer un bon esprit de compétition et peut inciter, par exemple, les Data Scientists à écrire des codes de plus en plus performants.
Dans ce sens, à la demande d’un client, il nous fut demandé de rechercher différents outils disponibles. Nous avons sélectionné une solution permettant l’organisation de compétitions en interne dans les entreprises : CodaLab et CodaLab Competition. Codalab permet l’exécution et le partage de code au sein d’une équipe. Codalab Compétition permet l’organisation de concours et se base sur une infrastructure Codalab.
CodaLab
CodaLab a été créé en 2013 en tant que co-entreprise entre Microsoft et l’Université de Stanford. À l’origine, le but était la création d’un écosystème afin de mener des recherches informatiques de manière plus efficace, reproductible et collaborative, combinant des feuilles de calcul. Avec cette plateforme Web Open Source, les chercheurs et développeurs collaborent à la progression de domaines de recherche. Principalement les domaines où le Machine Learning et le calcul avancé sont utilisés. En effet, via CodaLab il est possible de partager facilement ses travaux avec une communauté. La collaboration est alors plus efficace. Les feuilles de travail décrivent de manière reproductible des pipelines de recherche complexes et créent des “documents exécutables”. CodaLab propose essentiellement la résolution de problèmes multiples et communs, dans le domaine de la recherche orientée données. Néanmoins, il peut aussi solutionner des problématiques plus complexes lorsque la réponse peut être apportée sous la forme d’une archive zip.
CodaLab Competition
Depuis 2016, CodaLab offre la possibilité d’organiser des compétitions en ligne directement sur ses serveurs. CodaLab Competition héberge principalement des concours de data science, mais n’est pas limité à ce domaine d’application. Pour participer à une compétition, il suffit de s’inscrire et de proposer une solution. Il s’agit d’une soumission de résultat ou bien de codes. Les compétitions les plus simples ne nécessitent que la soumission de résultats, qui sont comparés à une solution (ou clé) par un programme de notation. Les défis de soumission de résultats sont moins coûteux en calcul que ceux de soumission de codes. En effet, il s’agit juste d’une comparaison de résultats, impliquant peu de possibilités. La soumission de code permet de réaliser des tests de performance équitables en exécutant le code soumis dans le même état pour tous les participants. En 2014, ChaLearn, qui organise des défis dans le domaine du Machine Learning, pour stimuler la recherche, s’est associé à CodaLab. Le but était le développement conjointement des compétitions CodaLab. Nouveauté particulièrement intéressante de CodaLab Competition, les organisateurs peuvent désormais connecter leurs propres agents de calcul en backend de CodaLab pour rediriger les soumissions de code. Cette caractéristique est intéressante car elle permet l’organisation de concours en interne dans une architecture propre à l’entreprise. On peut ainsi s’affranchir de certaines limites, concernant par exemple la sécurité des données.
L’architecture est la suivante :
- Le serveur CodaLab qui permet principalement le partage via une interface web
- Le service CodaLab Competition qui vient se reposer sur le serveur CodaLab qui nous permet d’avoir la possibilité de mettre en place des compétitions.
Il faut par conséquent, avoir dans un premier temps un serveur CodaLab fonctionnel. Focalisons nous maintenant sur l’architecture et l’installation de ce dernier.
Architecture de CodaLab
Docker
CodaLab utilise Docker pour gérer le développement en local et le déploiement des environnements car il offre un niveau de reproductibilité accru. Auparavant, il fallait des heures pour installer chaque morceau de CodaLab.
Django
Django représente la partie la plus importante de CodaLab Competition. Django est utilisé pour interagir avec la base de données MySQL, migrer l’état de la base de données et exécuter les tâches asynchrones.
MySQL
MySQL est la base de données qu’utilise CodaLab.
RabbitMQ
RabbitMQ est utilisé comme courtier de messages de tâches.
Celery
C’est la file d’attente où il est possible d’exécuter les tâches longues, telles que :
- Créer un concours
- Evaluer une soumission
- Envoyer des emails en masse
- Ré exécuter toutes les soumissions dans une phase
- Planifier des tâches
Nginx
Nginx est un serveur HTTP qui permet de gérer les requêtes Web. Nous pouvons l’utiliser pour mettre en cache des pages statiques et gérer un afflux important de trafic si nécessaire.
Comment CodaLab utilise-t-il Docker ?
Le code soumis sur la plateforme CodaLab est exécuté dans un conteneur Docker. Cet environnement peut être reproduit à l’identique sur un ordinateur local en téléchargeant l’image correspondante. L’environnement par défaut CodaLab contient un grand nombre de programmes pré-chargés, tels que Python. Il est possible de télécharger ou de personnaliser l’image par défaut docker-codalab-legacy-worker
depuis le hub de Docker en recherchant codalab/codalab-legacy.
Installation de CodaLab
Concernant l’installation, le wiki est disponible. Il montre pas à pas la mise en place de CodaLab sur une machine Ubuntu. Cependant après plusieurs échecs lors de l’installation, nous allons vous proposer un manuel d’installation pour CentOS 7 résumant les principales actions à réaliser. En premier lieu, il faut télécharger les codes sources hébergés sur GitHub :
git clone https://github.com/codalab/codalab-worksheets
git clone https://github.com/codalab/codalab-cli
Dans ce qui suit, la variable d’environnement $HOME
fera référence au répertoire dans lequel sont téléchargés les dépôts GIT de codalab-worksheets
et codalab-cli
. Les fichiers de configuration seront stockés dans $CODALAB_HOME
, qui est par défaut ~/.codalab
. Des paquets spécifiques doivent être installés au préalable.
Installation des paquets
Les dépendances Python et virtualEnv
yum install -y python-virtualenv
Nodejs
yum install -y epel-release
yum install npm
yum install -y gcc make
MySQL
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum -y install mysql-server
yum install -y python-devel mysql-devel
Docker
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
yum install -y docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
yum install -y docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
Il est important d’avoir un utilisateur codalab
car certaines commandes doivent être exécutées en tant que codalab
et non pas root
.
useradd codalab
usermod -aG wheel codalab
Lancement des scripts d’installation
Une fois téléchargés tous les prérequis nécessaires nous pouvons lancer l’installation. Attention, il faut lancer les commandes suivantes en tant que codalab
chown -R codalab: "codalab-cli/" "codalab-worksheets/"
cd "$HOME/codalab-worksheets" && ./setup.sh
cd "$HOME/codalab-cli" && ./setup.sh server
Configuration de la base de données
L’installation une fois terminée, la base de données doit être configurée et sécurisée. Un utilisateur “codalab” et une base de données du même nom sont déclarés nous allons ensuite les lier à CodaLab.
sudo mysql -u root
CREATE USER "codalab"@"localhost" IDENTIFIED BY "<passwd>" ;
CREATE DATABASE codalab_bundles;
GRANT ALL ON codalab_bundles.* TO "codalab"@"localhost";
Codalab doit ensuite être connecté à la base de données.
cd "$HOME/codalab-cli" && codalab/bin/cl config server/engine_urlmysql://codalab:<passwd>@localhost:3306/codalab_bundles
Configuration du service d’email
Pour avoir un service d’inscrits, il faut configurer le service email. Cela permet de pouvoir valider, via l’envoi de mail, l’inscription de nouveaux utilisateurs. Cela permet également aux utilisateurs de recevoir des courriers électroniques depuis le serveur CodaLab. Cette configuration se fait par l’enregistrement d’une adresse mail (host du serveur mail, adresse mail, mot de passe) . Il n’est pas possible de configurer l’envoi de mail via un serveur SMTP propre à l’entreprise. Pour palier à ce problème, plusieurs solutions s’offrent à nous. Nous pouvons, par exemple, parser les logs et automatiser l’envoi des mails par un serveur SMTP en cas de nouveaux inscrits. Nous pouvons également configurer un Watchdog qui activera l’envoi de mails à chaque événement d’inscription. Néanmoins, la mise en place de ces solutions peuvent entrainer des tâches supplémentaires à réaliser. La configuration standard de l’adresse mail via CodaLab se fait comme suit.
$HOME/codalab-cli/codalab/bin/cl config email/host <host>
$HOME/codalab-cli/codalab/bin/cl config email/user <username>
$HOME/codalab-cli/codalab/bin/cl config email/password <password>
$HOME/codalab-cli/codalab/bin/cl config admin-email <email>
Installation et lancement de Nginx
Nginx est un serveur HTTP qui va permettre de gérer toutes nos requêtes Web. Dans un premier temps nous allons devoir l’installer :
yum install -y nginx
Une fois installé, il faut le configurer pour fonctionner avec CodaLab :
cd "$HOME/codalab-worksheets/codalab" && ./manage config_gen
Cela va générer un fichier Nginx qui se trouvera dans $HOME/codalab-worksheets/codalab/config/generated/nginx
.
- Insérer include
$HOME/codalab-worksheets/codalab/config/generated/nginx
dans le block HTTP de/etc/nginx/nginx.conf
.
Lancements des différents services
Lorsque toutes ces actions sont réalisées, nous pouvons lancer les différents services pour le bon fonctionnement de CodaLab, à savoir :
- Démarrer le site web :
cd "/opt/codalab-worksheets/codalab"
./manage runserver 127.0.0.1:2700
- Démarrer le service API
cd "/opt/codalab-cli"
codalab/bin/cl server
- Démarrer le gestionnaire de bundles
cd "/opt/codalab-cli"
codalab/bin/cl bundle-manager
- Démarrer le worker
cd "/opt/codalab-cli/worker/codalabworker"
./worker.sh --server http://localhost:2900 --password /home/codalab/root.password
Notre service CodaLab est désormais configuré et utilisable. Il est disponible à l’adresse http://localhost:8080
(ou à tout autre port d’écoute avec lequel Nginx est configuré).
Avantages
- Lors de l’organisation de compétitions en interne, les différents scripts d’évaluation sont exécutés et les résultats sont collectés de manière entièrement automatique.
- Les participants peuvent facilement tester leurs formats de sortie (par exemple, sur les données d’essai) sans qu’aucune aide ne soit apportée.
- Il est relativement simple de définir les dates de début et de fin de tâche des différentes compétitions.
- Les classements CodaLab peuvent inclure plusieurs partitions différentes et peuvent être anonymes si cela est souhaité.
Inconvénients
- CodaLab, avec l’intégration de nos propres agents, n’est pas encore très stable et nous n’avons pas réellement la main sur l’installation. En effet nous lançons différents setup qui s’occupent de toute l’installation.
- La documentation n’est pas assez détaillée et, à mon goût, peu explicite.
- Il n’est pas possible d’utiliser un SMTP pour la messagerie. L’une des solutions serait d’utiliser un Watchdog ou de parser les différents logs et d’envoyer les mails via notre SMTP.
- Le projet Git n’est pas réellement à jour.
Résumé
CodaLab Competition est une excellente idée, à savoir pouvoir organiser des compétitions en interne en utilisant sa propre architecture et ses propres machines. Cependant, il faut avoir un serveur CodaLab fonctionnel. L’installation de ce dernier n’est pas encore très fluide. Elle ne s’effectue pas toujours bien et les repos Git ne sont pas réellement à jour. Nous devons naviguer sur toutes les branches pour chercher les bonnes informations et les bons scripts. En conclusion, après concertation avec les équipes du client, la décision fût prise d’attendre que la technologie mûrisse. Un test de compatibilité avec un orchestrateur de containers comme Kubernetes est à réaliser et pourrait s’avérer intéressant.