Avant de nous remettre aux tutoriels plus complexes, faisons une petite pause pour mieux découvrir l’IDE préféré des data scientists : Jupyter Notebook.

Combien de fois avez-vous du laisser de côté votre programme le temps que son exécution se termine ? Par exemple, l’entraînement d’une IA ou le chargement d’un jeu de données. Et combien de temps avez-vous perdu à attendre une exécution déjà terminée ?

Le plugin présenté ici vous permet d’ajouter une notification (Windows par exemple) de la part de Chrome/Firefox pour suivre l’état de votre programme en temps réel sans être forcément sur le navigateur, de quoi surfer sans devoir revenir sur le notebook toutes les minutes !

PS : l’ensemble du code présenté dans cet article est disponible sur le GitHub de Pensée Artificielle (fichier : notifications_jupyter.ipynb). N’hésitez pas à le télécharger !

Les bases pour commencer : Jupyter Notebook

Jupyter est une suite logicielle open source reconnue pour son approche « originale » du développement logiciel via ses notebooks.

exemple-jupyter-notebook-blocs
Les blocs « markdown » permettent de formater du texte au sein des blocs codes à l’exécution séparée (crédit : Lambert Rosique)

En effet, contrairement à la plupart des IDE (integrated development environment ou environnement de développement, comme Eclipse, Spyder, Visual Studio Code, IntelliJ, etc…), les notebooks proposent d’intégrer des blocs de texte (on peut mettre du gras, des couleurs, des images, … comme dans un document Word) au sein même du code afin de le documenter à la manière d’un tutoriel tout en gardant la capacité à exécuter le code et à en voir le résultat (images, textes, ….).

D’autre part, la communauté « jupytérienne » est très active et propose de nombreux plugins pour étendre les langages supportés par le logiciel à plus de 40 et simplifier la vie des développeurs, notamment avec le plugin suivant.

NB : le fichier sur le Covid19 vient du site ourworldindata.org que l’on remercie pour le partage

Jupyter-notify, le plugin de notifications

Rentrons dans le vif du sujet : avec les notebooks, on peut développer ses propres plugins et les intégrer à notre environnement facilement. ShopRunner a ainsi mis en ligne sur GitHub le plugin « jupyter-notify » que nous allons installer ensemble.

On commence par le traditionnel « pip install » qui permet d’installer une dépendance Python, sachant qu’en fonction de votre ordinateur vous devrez écrire « pip3 » et non « pip » : dans une invite de commande, saisissez

pip install jupyternotify

puis lancez Jupyter Notebook en écrivant

jupyter notebook

Même s’il n’y a rien de sorcier, j’attire votre attention sur deux erreurs possibles :

  • Si vous avez déjà lancé jupyter notebook avant d’installer jupyternotify, vous aurez une erreur disant que le plugin n’existe pas (en le chargeant) : en effet, jupyter ne cherche pas les nouveaux modules automatiquement, il faut le redémarrer
  • Si vous lancez jupyter notebook depuis une autre console (ouverte avant l’installation) vous aurez la même erreur : la deuxième console ne prend pas forcément en compte l’installation du nouveau plugin, il faut la fermer et la rouvrir
  • Si, dans le notebook, vous utilisez le « mauvais Python » par rapport à où vous avez installé le plugin, vous aurez l’erreur. Il faudra alors trouver dans quelle version de Python vous avez installé le plugin Notify.

Bien sûr, en fonction de votre environnement et de ses spécificités vous n’aurez pas ces erreurs, mais on vous recommande de bien ouvrir la console lançant jupyter notebook APRES avoir installé le plugin.

Si tout se passe bien vous devriez avoir ce type de sortie :

L’installation du plugin jupyternotify s’est bien passée (crédit : Lambert Rosique)

A partir de là, il y a deux façons d’utiliser le plugin : soit en l’important au cas par cas (on choisit où et quand l’activer), soit de manière systématique.

Import au cas par cas

Pour ajouter le plugin à votre notebook (et uniquement à lui), il suffit d’écrire dans une cellule le code suivant. Traditionnellement, on placera ce code en tête de notebook.

%load_ext jupyternotify

Concrètement, le « %load_ext » est une commande issue de l’environnement IPython permettant de charger une extension. Pour plus d’informations vous pouvez vous référer à la documentation officielle.

Comment va fonctionner jupyter-notify dans la pratique ? Lorsque vous allez demander l’exécution de la cellule avec la notification, c’est jupyter-notify qui va déclencher cette exécution et non vous.

Une fois terminée, jupyter-notify en sera averti automatiquement et il appellera un bout de code Javascript permettant de demander au navigateur l’affichage d’une notification (à condition de l’avoir autorisé) !

Import automatique dans tous les notebooks

Fatigués d’avoir à ajouter systématiquement en entête de vos notebooks la ligne %load_ext jupyternotify ? Il existe une astuce pour inscrire cette ligne dans votre environnement IPython, ce qui le chargera ensuite dans Jupyter mais aussi Spyder et toutes vos consoles IPython.

Pour cela, commençons par créer un profil par défaut de console IPython : dans une invite de commande, saisissez

ipython profile create

puis rendez-vous dans le répertoire indiqué par la console, pour ma part « C:\Users\soldier.ipython\profile_default » (chemin à ch puis éditez le fichier « ipython_config.py« .

Remplacez la ligne 35 par le code suivant :

c.InteractiveShellApp.extensions = [
    'jupyternotify'
]

Enfin, il ne reste plus qu’à enregistrer, puis relancer une console et démarrer Jupyter Notebook pour que le plugin soit directement accessible !

Pour le vérifier, dans un notebook, essayez d’exécuter ce code qui doit vous renvoyer le message

The jupyternotify extension is already loaded. To reload it, use:
  %reload_ext jupyternotify
%load_ext jupyternotify

Remarque : si le navigateur vous demande à autoriser les notifications, faites-le.

Dans une console, on crée le profil par défaut pour les consoles IPython. Ensuite, on va éditer la configuration en ajoutant l’import automatique de notre module (extension) (crédit : Lambert Rosique)

Utilisation des notifications jupyter

Passons au plus important/utile : comment afficher une notification dans le navigateur.

Pour indiquer à Jupyter-notify qu’il doit prendre le contrôle de la cellule, il faut que celle-ci commence par l’annotation %%notify

Lorsqu’une cellule avec cette annotation termine son exécution, le navigateur affiche automatiquement un message ! Par exemple,

%%notify
# Notez la présence du %%
import time
time.sleep(3)

affiche un message générique au bout de 3 secondes, tandis que

%%notify -m "Message de Pensée Artificielle : le code est terminé !"
# Notez le -m pour indiquer le message à afficher
import time
time.sleep(3)
Message générique pour indiquer la fin de l’exécution de la cellule (crédit : Lambert Rosique)

Message personnalisé de fin d’exécution (crédit : Lambert Rosique)

En bonus, si vous souhaitez…

… afficher un message au milieu de la cellule

import time
time.sleep(3)
%notify -m "t0 + 3s"
# Notez qu'il n'y a qu'un seul % au lieu de deux !
time.sleep(2)
%notify -m "t0 + 5s"
# Remarque : les notifications Windows ne s'empilent pas forcément, donc ce second message peut apparaître,
# en fonction de votre ordinateur, uniquement lorsque vous fermez la précédente notification
time.sleep(2)

… afficher un message à la fin de toutes les cellules dont le temps d’exécution est supérieur à 30s

%autonotify -a 30
# Toute cellule, et pas forcément celle-ci, qui prend plus de 30s a s'exécuter affichera un message
# lorsque son exécution sera terminée (le "a" signifie "after") sans avoir à mettre dedans %notify
import time
time.sleep(31)
# Un message s'affiche car on a dépassé les 30s

… et pour finir, le plus utile, pour afficher une valeur (variable) dans un message

%%notify -o
# Notez que l'on ajoute -o à notify pour indiquer qu'il faudra afficher en message la dernière ligne de cette cellule
x = 1
for i in range(1,6):
    x *= i

# La ligne suivante est la dernière et va donc s'afficher en message
# Un "Variable x = "+str(x) aurait aussi fonctionné
# Attention à ne pas mettre de "print"
'La variable x vaut maintenant {}'.format(x)
La dernière ligne de la cellule s’affiche en message (crédit : Lambert Rosique)

En réalité ce qu’il se passe ici c’est qu’on affiche en message la dernière ligne de la cellule ! Il faut donc que ce soit une str (ne pas mettre de print) et penser à ajouter le -o à %%notify.

Important : notez que vous pouvez librement utiliser les options -m et -o, ainsi que les notify dans les cellules (attention à ne mettre qu’un seul % si vous êtes au milieu de la cellule), pour avoir LA notification que vous préférez 🙂

Mes notifications ne s’affichent pas…

Il y a deux causes possibles :

1) La page web du notebook n’a pas l’autorisation pour afficher des notifications. Cliquez sur le « i » devant l’url où vous êtes et activez la ligne des notifications

Autorisation de la page web (crédit : Lambert Rosique)

2) Les notifications Windows sont désactivées OU les notifications Google Chrome/Firefox sont désactivées

Allez dans Paramètres > Système > Notifications et actions, puis activez les notifications ET activez Google Chrome et Mozilla Firefox (suivant votre besoin)

Les notifications Windows sont bien activées (en haut), il faut donc vérifier dans la liste du bas si Google Chrome l’est aussi (crédit : Lambert Rosique)

Est-ce vraiment utile ?

Pour terminer cet article, je dirai que je trouve ce plugin très pratique, à la fois dans son utilisation claire et simple, et dans son intérêt : finis les ALT + TAB pour revenir régulièrement voir si le notebook a terminé son exécution !

En effet, lorsqu’on entraîne un modèle d’intelligence artificielle, il arrive souvent que les blocs de codes prennent plusieurs minutes à s’exécuter, bloquant ainsi l’ensemble du notebook. Si, en général, on peut continuer de coder (sans exécuter), il arrive parfois que l’on ait absolument besoin de voir un résultat avant de pouvoir continuer… S’ensuit alors un jeu de « je reviens régulièrement sur le notebook voir s’il a terminé », jeu qui peut faire perdre beaucoup de temps. Avec ce plugin, plus une seule seconde n’est perdue et, en tant que data scientist, on ne culpabilise plus de surfer un peu en attendant !

Crédit de l’image de couverture : Lambert Rosique