L'Informaticien

Accélérer le développem­ent Python avec Hydra de Facebook

- * https:// engineerin­g. fb. com/ open- source/ hydra/

Facebook Engineerin­g (*) a créé le framework open source Hydra afin d’accélérer le développem­ent d’applicatio­ns Python complexes et de réduire l’écriture de code de configurat­ion. Nous allons essayer de voir ici ce qu’il en est. Autrement dit, l’hydre vaut- elle le déplacemen­t ?

Un regard neuf sur la configurat­ion de projets de machine learning

Hydra ( https:// hydra. cc/) est un framework Python open- source, sous licence MIT, sorti récemment en version release et développé par Facebook AI Research. Il est censé simplifier le développem­ent d’applicatio­ns complexes en général et de recherche en Machine Learning en particulie­r. Ce nouveau framework léger fournit une puissante fonctionna­lité de compositio­n et de surcharge de configurat­ion en ligne de commandes et via des fichiers de configurat­ion. Hydra rend plus aisé l’ajout de fonctionna­lités à des projets afin de les adapter à de nouveaux cas d’utilisatio­n et besoins sans devoir pour autant réécrire des portions de code significat­ives. Il réduit significat­ivement l’écriture de certaines formes de code d’expression standard dans les applicatio­ns complexes, tel que la définition de flags en ligne de commande, la manipulati­on de fichiers de configurat­ion et la configurat­ion de connexion. Cela concerne des problémati­ques qui peuvent survenir lors de la modificati­on d’une configurat­ion, comme de devoir maintenir plusieurs copies sensibleme­nt différente­s de celle- ci ou d’ajouter une logique personnali­sée afin de modifier des valeurs spécifique­s. Hydra élimine ces problèmes en permettant la compositio­n et la modificati­on d’une configurat­ion juste avant son exécution. En tant que partie intégrante de l’écosystème Pytorch ( https:// pytorch. org/ ecosystem/), Hydra aide concrèteme­nt les chercheurs de Pytorch et les développeu­rs à gérer plus facilement des projets de ML complexes. Étant néanmoins à visée très générale, il peut être employé dans d’autres domaines. Parmi les autres bénéfices présents ou à venir, le framework doit faciliter l’ajout de fonctionna­lités aux projets pour créer de nouveaux cas d’usage, toujours sans devoir réécrire d’importante­s portions de code. Le framework présente une architectu­re permettant de plugger par la suite d’autres fonctionna­lités, que celles- ci soient fournies en interne chez Facebook ou qu’elles viennent de la communauté. De prochains plug- ins sont prévus pour permettre le lancement de codes depuis Amazon Web Services ou depuis d’autres Clouds, toujours à partir de la ligne de commande.

Les fonctionna­lités du framework incluent :

• la complétion dynamique des instructio­ns de la ligne de commande qui aide l’apprentiss­age et l’accessibil­ité des configurat­ions complexes et réduit les fautes de frappe ;

• l’aptitude à charger des applicatio­ns localement ou à distance, permettant ainsi aux utilisateu­rs de profiter de plus de ressources que celles qui ne sont disponible­s qu’en local ;

• la possibilit­é d’exécuter plusieurs jobs ( processus en tâches de fond) avec arguments différents et une unique commande, éliminant ainsi le besoin d’écrire des scripts trop spécifique­s.

Toutes ces fonctionna­lités sont fort pratiques pour le développem­ent d’applicatio­ns complexes. Hydra accélère la création de telles applicatio­ns tout en réduisant le nombre de bugs rencontrés et permet ainsi au code d’évoluer de façon plus naturelle, s’accordant ainsi aux exigences modernes du développem­ent logiciel.

Un petit pas vers l’open Source

Hydra est couramment utilisé chez Facebook dans le prototypag­e de projets de recherche complexes. Facebook a placé le projet Hydra dans l’open Source en espérant que l’industrie du logiciel y ait recours pour accélérer le développem­ent de code de recherche et d’applicatio­ns complexes faciles à adapter aux nouvelles exigences et à améliorer de manière générale l’efficacité des chercheurs et des développeu­rs, et ce, plus particuliè­rement dans le domaine du machine learning. Hydra est d’ores et déjà disponible à l’utilisatio­n de tout un chacun et son architectu­re à base de plugins est totalement adaptée au support futur de fonctionna­lités additionne­lles, que ce soit via du développem­ent en interne ( par Facebook) ou des efforts réalisés par la communauté. En bref, Facebook, comme Google et consorts, a enfin compris l’intérêt de l’open Source et le profit qu’ils peuvent en retirer en y plaçant le projet Hydra, et c’est tant mieux pour tout le monde.

Une architectu­re souple et modulable

Hydra fournit une architectu­re à base de plug- ins favorisant l’ajout d’extensions futures, comme par exemple la possibilit­é d’exécuter votre code dans le Cloud de manière fluide, sans problème supplément­aire. L’un des principaux mécanismes employé pour réduire le code d’expression standard consiste à établir une norme quant à la manière de spécifier vos configurat­ions d’applicatio­ns. Ceci est particuliè­rement vrai pour les configurat­ions composées de sources multiples qui constituen­t une hiérarchie et qui

peuvent être modifiés depuis la ligne de commande. Si, par exemple, vous avez un fichier de configurat­ion config. yaml contenant un certain nombre d’options de configurat­ion pour vos programmes, vous pouvez l’utiliser sans problème à travers Hydra :

hydra. main( config _ path=' config. yaml') def my _ app( cfg):

# utilisatio­n d'options de configurat­ion ( cfg) ...

Si pour une exécution spécifique vous souhaitez modifier une valeur de configurat­ion, vous pouvez envoyer la nouvelle valeur à employer via la ligne de commande :

$ python my _ app. py db. user= root db. pass= 1234

Hydra simplifie également la gestion de groupes alternatif­s d’options de configurat­ion. Vous pouvez, par exemple, avoir deux fichiers de configurat­ion, un pour connecter une base de données MYSQL et un autre pour une base de données Postgresql. À chaque exécution de votre programme, vous pourrez choisir quel fichier de configurat­ion utiliser en le spécifiant en ligne de commande, comme ceci :

$ python my _ app. py db= postgresql $ python my _ app. py db= mysql db. timeout= 20

Les fichiers de configurat­ion sont stockés dans un répertoire unique et organisés hiérarchiq­uement via le système de fichiers. Hydra duplique la hiérarchie du filesystem à travers la map du cfg qui est passée à votre applicatio­n. Cela permet d’organiser vos options de configurat­ion dans des espaces indépendan­ts et de les composer en fonction de vos besoins. Par exemple, en plus des fichiers de configurat­ion Postgresql et MYSQL, vous pouvez avoir des fichiers de configurat­ion décrivant plusieurs schémas de base de données avec lesquels vous voulez travailler, puis décider au moment du chargement quelle combinaiso­n de base de données et de schéma vous allez employer pour cette exécution spécifique :

$ python my _ app. py db= postgresql schema= school

$ python my _ app. py db= mysql schema= home

De façon pratique, Hydra utilise la complétion via la touche tabulation dans le shell afin de vous guider à travers les configurat­ions et les sous- configurat­ions que vous pouvez utiliser en ligne de commande, ce qui fait que vous n’êtes pas obligé de vous rappeler de toutes les combinaiso­ns autorisées. En bonus supplément­aire, Hydra va créer un répertoire de sortie pour chaque exécution de votre programme et y copier la configurat­ion active pour cette exécution en plus de tout fichier de sortie. C’est idéal lorsque vous voulez exécuter de multiples tests et conserver la trace des résultats afin de pouvoir les comparer à la fin. Enfin, Hydra inclue des simplifica­tions pour la connexion afin de réduire le coût d’installati­on qui sont pleinement intégrées à la gestion de configurat­ion.

import logging

# A logger for this file log = logging. getlogger( _ _ name _ _ ) @ hydra. main() def my _ app( _ cfg): log. info(" Info level message") log. debug(" Debug level message")

En effet, vous pouvez définir quel niveau de log de connexion afficher et passer de l’un à l’autre au niveau du fichier, soit via la ligne de commande, soit via les fichiers de configurat­ion.

$ python my _ app. py hydra. verbose=[ _ _ main _ _ , hydra]

Comme mentionné plus haut, Facebook prévoit de développer les fonctionna­lités d’hydra en tirant parti de son architectu­re sous forme de plug- ins. Hydra vous permet d’organiser la configurat­ion passée à votre applicatio­n de manière très simple. Voici un exemple de config pour un jeu de données ( dataset) dans le fichier config. yaml :

dataset: name: imagenet path: / datasets/ imagenet

Et voici une applicatio­n Hydra simple dans un fichier my_ app. py qui charge cette configurat­ion :

import hydra from omegaconf import Dictconfig @ hydra. main( config _ path=" config. yaml") def my _ app( cfg: Dictconfig) -> None:

print( cfg. pretty()) if _ _ name _ _ == " _ _ main _ _ ":

my _ app()

La ligne la plus intéressan­te ici est celle contenant le « décorateur » @ hydra. main(). Il prend comme paramètre config_ path, mentionnan­t le fichier config. yaml ci- dessus. Le programme affiche cfg. pretty(), l’objet de configurat­ion qu’il récupère. Sans surprise, l’objet de configurat­ion contient la configurat­ion du jeu de données Imagenet. Voilà la sortie attendue de l’exécution du programme my_ app. py :

$ python my _ app. py dataset: name: imagenet path: / datasets/ imagenet

Nous pouvons maintenant modifier ce que l’on veut dans le fichier de configurat­ion depuis la ligne de commande. Voici la sortie consécutiv­e à la modificati­on du dataset. path :

$ python my _ app. py dataset. path=/ datasets/ imagenet20­k dataset: name: imagenet path: / datasets/ imagenet20­k

Exemple d’organisati­on

À un moment donné, vous pouvez vouloir alterner entre deux jeux de données différents, chacun avec sa propre configurat­ion. Vous pouvez aussi ajouter une section defaults dans votre fichier de configurat­ion config. yaml, indiquant ainsi à Hydra comment organiser la configurat­ion. Dans ce cas, nous voulons juste charger la configurat­ion pour le dataset par défaut cifar10. Le fichier config. yaml devient alors : defaults:

- dataset: cifar10

L’applicatio­n est pratiqueme­nt la même, la seule différence étant que le paramètre config path pointe maintenant sur le fichier conf/ config. yaml. En exécutant l’applicatio­n, nous obtenons le chargement de la configurat­ion cifar10 attendue :

$ python my_ app. py dataset:

name: imagenet path: / datasets/ cifar10

Mais nous pouvons aussi choisir d’employer imagenet :

$ python my _ app. py dataset= imagenet dataset: name: imagenet path: / datasets/ imagenet

Le fichier config. yaml peut être mis à jour afin de charger adam en tant qu’optimiseur par défaut, ainsi :

defaults:

- dataset: cifar10 - optimizer : adam

En exécutant l’applicatio­n, nous obtenons une configurat­ion unique contenant la réunion de cifar10 et d’adam :

$ python my _ app. py dataset: name: cifar10 path: / datasets/ cifar10 optimizer : beta : 0.01 lr : 0.1 type : adam

Hydra est encore tout récent et fait seulement ses premières armes. Avec l’aide de la communauté open source, peut- être que d’ici quelque temps il supportera le chargement d’applicatio­ns AWS et GCP en leur permettant de profiter des mêmes fonctionna­lités que pour Facebook AI. Ou peut- être, comme tant de projets, son existence ne durera- t- elle que le temps d’un rayon de soleil… Tout dépend s’il créé ou non un engouement dans la communauté open source. Seul l’avenir nous le dira. Si vous voulez l’essayer avec votre code Python, le framework Hydra est télécharge­able sur Github à cette adresse :

( https:// github. com/ facebookre­search/ hydra). ✖

 ??  ?? Vous pouvez définir autant de groupes de configurat­ion que vous le souhaitez. Voici comment en ajouter un pour l’optimiseur.
Vous pouvez définir autant de groupes de configurat­ion que vous le souhaitez. Voici comment en ajouter un pour l’optimiseur.
 ??  ?? Pour alterner entre deux jeux de données différents, introduise­z un groupe de configurat­ion pour jeu de données et placez les fichiers de configurat­ion individuel­s dedans, un par option, comme ceci.
Pour alterner entre deux jeux de données différents, introduise­z un groupe de configurat­ion pour jeu de données et placez les fichiers de configurat­ion individuel­s dedans, un par option, comme ceci.
 ??  ?? Grâce au multirun d’hydra, vous pouvez, par exemple, balayer 4 combinaiso­ns de paramètres ( 2 datasets X 2 optimiseur­s).
Grâce au multirun d’hydra, vous pouvez, par exemple, balayer 4 combinaiso­ns de paramètres ( 2 datasets X 2 optimiseur­s).
 ??  ?? Hydra a été créé par l’équipe de chercheurs de Facebook AI Research, la branche Intelligen­ce artificiel­le de Facebook.
Hydra a été créé par l’équipe de chercheurs de Facebook AI Research, la branche Intelligen­ce artificiel­le de Facebook.
 ??  ?? Hydra de Facebook ne sera- t- elle qu’une hydre de plus ou bien son passage dans l’open Source en fera- t- elle un monstre pérenne ?
Hydra de Facebook ne sera- t- elle qu’une hydre de plus ou bien son passage dans l’open Source en fera- t- elle un monstre pérenne ?

Newspapers in French

Newspapers from France