Notebook jupyter distant avec réacheminement de ports par ssh

Accédez à distance à votre serveur jupyter notebook

Me, working from home
Working from home

Introduction

J'ai une machine dédiée au deep learning à mon labo. Elle est vraiment pas mal, avec 20 coeurs CPU, 64 Go de RAM, beaucoup d'espace sur SSD pour mes données, et surtout deux GeForce GTX 1080 Ti.

Malheureusement, elle est derrière un firewall et n'est pas directement accessible depuis l'extérieur. Mais souvent, je suis au CERN, ou je travaille à la maison faute de temps pour me taper les bouchons lyonnais (pas les restos, les autres).

Dans cet article, je vais expliquer comment je m'y prend pour créer et utiliser des notebooks jupyter sur une machine distante.

Vous allez apprendre comment:

  • créer un tunnel ssh vers la machine distante à travers un firewall
  • démarrer un serveur jupyter sur cette machine
  • se connecter à ce serveur depuis un navigateur tournant sur votre machine locale à l'extérieur pour créer et utiliser des notebooks jupyter.

Cela vous prendra peut être une dizaine de minutes pour mettre tout en place la première fois, mais ça vaut vraiment le coup. Ensuite, il ne vous faudra que quelques secondes pour établir la connection avec vos notebooks distants.

Configuration du réseau

Les ordinateurs impliqués sont les suivants:

  • deeplearning est la station de deeplearning. Elle est à l'intérieur du réseau du labo et n'est pas accessible de l'extérieur. Cependant, je peux m'y connecter par ssh depuis l'intérieur.
  • portal est sur le réseau du labo, et est aussi visible de l'extérieur. Je peux m'y connecter par ssh depuis n'importe où.
  • local est en dehors du réseau du labo. C'est par exemple mon ordinateur portable.

Cette configuration est assez typique de ce qu'on peut trouver dans les labos de recherche ou les entreprises.

Dans cette situation, la plupart des physiciens feraient la chose suivante (et je suis passé par là):

  • connexion de local à portal avec ssh -X
  • connexion de portal à deeplearning avec ssh -X
  • démarrage du serveur jupyter sur deeplearning. Un navigateur s'ouvre sur deep learning, et est affiché à distance sur local

Ça marche car nous avons utilisé ssh avec l'option -X, qui permet de réacheminer X11, c'est à dire les applications graphiques. Mais cela pose plusieurs problèmes:

  • Si local tourne sous macOS, il y a une incompatibilité entre le X11 de deeplearning et celui du mac, lorsque les drivers nvidia sont installés sur deeplearning. Or c'est le cas car nous utilisons des cartes nvidia pour le deep learning. Ces incompatibilités rendent les applications graphiques distantes extrêmement lentes, même avec un réseau très rapide.
  • Si votre connexion réseau est lente, le navigateur sera lent et pénible à utiliser.

La solution est d'ouvrir le navigateur localement, et de router tout le traffic entre le navigateur et le serveur jupyter qui tourne sur deeplearning, à travers portal.

Réacheminement de por

macOS ou Linux

Si votre machine locale tourne sous macOS ou Linux, exécutez la commande suivante:

ssh -L 2222:deeplearning:22 -L 8889:deeplearning:8889 portal

Bien sûr, il vous faut remplacer deeplearning et portal par les adresses de ces machines dans votre cas.

Cette commande établit une connexion ssh cryptée vers portal. Chaque option -L spécifie le réacheminement d'un port:

-L 2222:deeplearning:22 réachemine le port 2222 sur la machine locale vers le port 22 sur deeplearning. Lorsque c'est fait, se connecter au port 2222 sur la machine locale est équivalent à se connecter sur le port 22 de deeplearning. Or, le port 22 est celui sur lequel écoutent les serveurs ssh. Vous pouvez donc maintenant faire:

ssh -p 2222 localhost

Ceci établit une connection ssh vers le port 2222 de la machine locale, et hop! Grâce au réacheminement de port, vous vous retrouvez connecté par ssh à deeplearning.

L'autre port, 8889, sera utilisé plus tard pour jupyter.

Windows

Installez PuTTY , qui contient un client ssh, et lancez cette application.

Dans la fenêtre Session, entrez le hostname ou l'adresse IP de portal. Ne touchez pas au reste, et sauvez cette session pour plus tard.

Ensuite, dans Connection-SSH-Tunnels, réacheminez le port local 2222 vers le port 22 sur deeplearning, et le port local 8889 vers le port 8889 sur deeplearning.

Retournez dans Session, sauvez à nouveau pour enregistrer vos changements sur le réacheminement de port, et cliquez sur Open pour ouvrir une session ssh vers portal. Une fenêtre terminal s'ouvre. Entrez votre nom d'utilisateur et votre mot de passe.

Une fois loggué sur portal, connectez vous par ssh sur deeplearning comme d'habitude pour démarrer le serveur jupyter, comme expliqué dans la section suivante.

Démarrage du serveur jupyter

Après vous être loggué sur deeplearning comme expliqué ci-dessus, vous pouvez démarrer le serveur jupyter. N'oubliez pas d'initialiser d'abord votre environnement conda si nécessaire.

jupyter notebook --no-browser --port=8889 --ip=0.0.0.0 

Voici ce que font les options:

  • ne pas ouvrir de navigateur sur deeplearning
  • écouter sur le port 8889. C'est le port sur lequel nous nous connecterons par la suite. Rappelez-vous que nous avons réacheminé ce port à travers portal
  • autoriser toutes les adresses ip à se connecter à ce port. Par défaut, le serveur jupyter n'aurait autorisé que la machine locale (ici deeplearning) à se connecter à ce port.

Connection au serveur jupyter

Maintenant, sur votre machine locale, ouvrez un navigateur et tapez cette url dans la barre d'adresse:

http://localhost:8889

Le navigateur se connecte alors au port 8889 de la machine locale, qui est réacheminé vers le port 8889 sur deeplearning, sur lequel le serveur jupyter écoute.

Lors de votre première connexion, vous devrez mettre en place un mot de passe pour votre serveur jupyter. Contentez-vous de suivre les instructions.

Et voilà ! Vous avez maintenant accès au serveur jupyter distant depuis votre navigateur local.

Une solution à plus long term

Vous ne voulez probablement pas avoir à démarrer le serveur jupyter à chaque fois que vous voulez travailler depuis l'extérieur.

Si vous voulez éviter ça, vous pouvez démarrer le serveur avec nohup:

nohup jupyter notebook --no-browser --port=8889 --ip=0.0.0.0 &

Après cela, vous pouvez vous délogguer, et le serveur continuera à tourner sur deeplearning jusqu'à ce qu'il soit stoppé, soit manuellement, soit lors d'un redémarrage de la machine.

La prochaine fois, les seules choses que vous aurez à faire pour vous connecter au serveur sont:

  • établir le réacheminement de port avec ssh ou PuTTY
  • aller à http://localhost:8889

Résumé

Dans cet article, vous avez appris comment:

  • créer un tunnel ssh vers une machine distante derrière un firewall
  • lancer un serveur jupyter sur cette machine
  • vous connecter à ce serveur depuis un navigateur tournant sur votre machine locale pour créer et utiliser des notebooks jupyter

J'espère que ce petit tuto vous facilitera la vie.

Veuillez noter que le réacheminement de port peut évidemment être utilisé pour accéder à d'autres types de serveurs derrière un firewall.


N'hésitez pas à me donner votre avis dans les commentaires ! Je répondrai à toutes les questions.

Et si vous avez aimé cet article, vous pouvez souscrire à ma newsletter pour être prévenu lorsque j'en sortirai un nouveau. Pas plus d'un mail par semaine, promis!

Retour


Encore plus de data science et de machine learning !

Rejoignez ma mailing list pour plus de posts et du contenu exclusif:

Je ne partagerai jamais vos infos.
Partagez si vous aimez cet article: