Sommaire
Nœud GPUs configuré en serveur de visualisation
1. De quoi s'agit-il ?
Il serait dommage de disposer de nœuds dotés de GPUs et de ne pas les utiliser pour accélérer le rendu 3D d'une application OpenGL installée sur Summit2 (par exemple Paraview, VisIT,...). Cependant, démarrer simplement cette application OpenGL sur un nœud GPUs au travers des commandes Slurm srun ou sbatch ne fonctionne pas. Il faut mettre en place sur le nœud un serveur X capable d'initialiser les cartes graphiques et de répondre aux requêtes OpenGL de l'application. La solution choisie repose sur le paquetage Open Source VirtualGL qui permet de configurer un nœud GPUs en serveur de visualisation. Pour faire en sorte que cette configuration s'effectue à la demande de l'utilisateur et pour simplifier la tâche de ce dernier, nous avons écrit le script "vncglserver.job" qui devra être soumis dans la partition gpus. Le script se charge de lancer sur le nœud alloué :
un serveur X (Xorg, identique à celui qui fonctionne actuellement sur votre poste Linux) qui initialise et reconnaît les cartes graphiques NVidia présentes sur le nœud. Ce serveur permettra à l'application OpenGL (via la commande vglrun du paquetage VirtualGL) de profiter de l'accélération matérielle.
un serveur VNC (Xvnc, fourni avec le paquetage TurboVNC conseillé par VirtualGL) qui se comporte comme un serveur X (Xorg) à la différence qu'il envoie sa sortie sur un écran virtuel qui peut-être consulté par des machines distantes à l'aide de l'application cliente vncviewer.
Il suffit ensuite, depuis votre poste de travail, de vous connecter avec l'application vncviewer sur le serveur VNC démarré par le job "vncglserver.job". L'environnement graphique distant qui s'affiche sur votre PC repose sur le gestionnaire de fenêtre IceWM choisi pour ses performances et sa simplicité. Il ne reste plus qu'à lancer l'application OpenGL depuis une fenêtre xterm de cet environnement IceWM en la préfixant avec la commande vglrun pour bénéficier de la puissance des GPUs installés sur le nœud.
Tout ceci peut vous paraître obscur : n'ayez crainte ! Suivez pas à pas les explications ci-dessous.
2. Pré-requis sur votre PC/poste de travail
Nous considérons dans la suite de ce document que :
votre poste de travail MY_PC est un PC Linux (64 bits de préférence : uname -m doit retourner x86_64)
la connexion à la frontale summit2 s'effectue comme indiqué dans ConnexionFrontale à savoir sans demande de mot de passe, par la commande :
MY_PC~> ssh summit2
l'application vncviewer est disponible sur votre poste. Vérifiez-le en exécutant :
MY_PC~> which vncviewer
qui retourne le chemin d'accès au binaire si elle est présente.
Dans le cas contraire (ou bien si vous souhaitez disposer d'une version optimisée), nous vous proposons de télécharger le binaire Linux 64 bits et de l'enregistrer dans le répertoire $HOME/bin de votre PC : TurboVNCviewer64bits. Vérifiez son intégrité avec la commande (copier/coller à la souris) :
MY_PC~/bin> echo "fbb303fc0f83776c38e50dbc12866ffa vncviewer" | md5sum -c vncviewer: OK
qui doit retourner OK si le fichier est valide. Donnez les droits d'exécution au fichier :
MY_PC~/bin> chmod +x vncviewer
puis tentez d'exécuter la commande avec l'option -h pour vérifier si elle retourne :
MY_PC~/bin> vncviewer -h
TurboVNC Viewer 64-bit v1.0.2 (build 20110808)
Usage: vncviewer [<OPTIONS>] [<HOST>][:<DISPLAY#>]
vncviewer [<OPTIONS>] [<HOST>][::<PORT#>]
vncviewer [<OPTIONS>] -listen [<DISPLAY#>]
vncviewer -help
...
Si L'installation de vncviewer pose problème, pas la peine d'aller plus loin et contacter calcul@aero.obs-mip.fr.
3. Soumettre le job "vncglserver.job"
Pour démarrer le serveur de visualisation sur un des nœuds GPUs, connectez-vous à summit2 puis suivez les instructions dans cet ordre :
Préparer l'environnement pour le serveur VNC en exécutant le script :
summit2~> prepare_vnc.sh
qui se charge de créer le répertoire $HOME/.vnc et d'y placer le fichier vide $HOME/.vnc/passwd.
Cette opération doit être réalisée avant le tout premier lancement du job vncglserver.job décrit ci-dessous sinon il échouera. Vous n'aurez plus jamais besoin de la réitérer par la suite. Recopier le fichier /usr/local/vncjob/vncglserver.job dans le répertoire où vous comptez lancer le job en batch, par exemple :
summit2~> mkdir $HOME/TestGPU summit2~> cp /usr/local/vncjob/vncglserver.job $HOME/TestGPU
Le fichier vncglserver.job est le script shell qui sera soumis par la commande sbatch. Il lance sur le nœud un serveur X (ligne 13) ainsi qu'un serveur Xvnc (grâce au script vncserver ligne 14) puis envoie une notification sous forme graphique et se met en attente (ligne 16). Vous pouvez noter que l'allocation s'effectue sur un seul nœud de la partition gpus (ligne 2).
1 #!/bin/sh 2 #SBATCH --partition=gpus -N 1 --exclusive 3 # 4 # Ce script admet un argument optionnel definissant la taille de la 5 # fenetre du serveur vnc, exemple : 6 # 7 # vncglserver.job 1024x768 8 # 9 . /usr/local/vncjob/vncjobfunc 10 GEOMETRY=${1:+"-geometry $1"} 11 VNCTMP=/tmp/vncserver-$USER-$$.log 12 13 srun -n 1 X :0 -config xorg.conf.nvidia.$(hostname) & 14 vncserver $GEOMETRY -nohttpd -fg -otp 2>&1 | tee $VNCTMP & 15 16 vncxmesswait $! $VNCTMP
Avant d'exécuter la commande sbatch, assurez vous qu'un des nœud GPUS est libre (idle). En effet, bien qu'il s'agisse d'une soumission en batch, le travail qui vous attend est interactif puisque vous allez manipuler une application graphique :
summit2:~/TestGPU> sinfo -p gpus PARTITION AVAIL TIMELIMIT NODES CPUS(A/I/O/T) STATE NODELIST gpus up 4:00:00 1 0/0/4/4 down n139 gpus up 4:00:00 1 0/8/0/8 idle n140
Soumettez votre job en saisissant simplement :
summit2:~/TestGPU> sbatch vncglserver.job
et vérifiez qu'il est bien présent dans la liste de jobs :
summit2:~/TestGPU> squeue -p gpus JOBID PARTITION NAME USER ST TIME NODES CPUS NODELIST(REASON) 26950 gpus vncglser gazdi R 0:11 1 8 n140
Patientez quelques secondes - ou minutes si le nœud était éteint (idle~) avant la soumission du job - jusqu'à l'apparition sur votre poste de travail d'une fenêtre xmessage semblable à celle-ci :
La présence de cette fenêtre indique que le job vncglserver.job fonctionne convenablement et que le serveur Xvnc lancé sur le nœud est prêt à recevoir votre connexion via l'application cliente vncviewer. Lire les instructions fournies dans le message pour effectuer la connexion et se souvenir qu'il faut :
Exécuter la commande VNCVIEWER sur votre poste de travail !
2 méthodes de connexion sont proposées. Nous conseillons d'opter pour la connexion par tao qui est bien plus rapide car directe sur le nœud alors que la seconde, via la frontale summit2, est moins performante car elle est transite via un tunnel SSH chiffré entre summit2 et votre poste de travail. Le chiffrement SSH sur ce type de flux réseau peut passablement impacter les ressources CPUs de la frontale summit2 (et celles de votre poste de travail). Tentez la deuxième solution si la connexion par tao échoue.
Un mot de passe vous est demandé dès l'établissement de la connexion entre vncviewer et XVnc. Saisissez (par copier/coller) le mot de passe numérique donné dans la ligne One-time password de la fenêtre xmessage :
MY_PC:~> vncviewer tao:11 Connected to RFB server, using protocol version 3.8 Enabling TightVNC protocol extensions Performing standard VNC authentication Password: 22167201
vncviewer ouvre alors une fenêtre affichant le window manager IceWM qui s'exécute sur le nœud de calcul. Ce gestionnaire a été choisi pour ces propriétés de performance car il est peu gourmand en mémoire et en CPU. Au sein de cette fenêtre, vous êtes réellement sur le nœud de calcul. Dans la barre de statut, vous disposez de 4 bureaux virtuels numérotés de 1 à 4, de raccourcis pour ouvrir des xterm et le panneau de configuration Nvidia. Vous êtes maintenant prêt à exécuter votre application OpenGL.
Problème à l'étape 4 : aucune fenêtre xmessage n'est apparu 5 minutes après la soumission du job. Commencez par vérifier si votre job est bien dans l'état Running avec la commande squeue -p gpus. Si c'est le cas, consultez la sortie de job slurm_<jobid>.out pour identifier l'erreur. Si aucune sortie de job n'est présente et que votre job est en queue pour Slurm, le nœud est sans doute bloqué dans sa phase de boot ou n'a pas réussi à démarrer : Slurm le considère down s'il ne répond pas au bout de 20 minutes et les administrateurs du cluster sont avertis automatiquement.
4. La fenêtre vncviewer a disparu : "vncglserver.job" est-il terminé ?
Le job "vncglserver.job" est véritablement terminé s'il n'apparaît pas dans le retour de la commande Slurm :
summit2:~> squeue -p gpus
Il peut se terminer sous 3 conditions, entraînant la fermeture des fenêtres vncviewer et xmessage :
- la limite de temps est atteinte et Slurm le détruit.
le job est annulé par l'utilisateur avec la commande scancel <jobid>.
l'utilisateur quitte le gestionnaire de fenêtre IceWM par le menu "Logout...".
Toutefois, la fermeture de la fenêtre vncviewer n'est pas synonyme d'un job terminé. En effet, le processus client vncviewer (qui s'exécute sur votre poste de travail) peut être interrompu comme n'importe quelle application graphique par un clic sur son bouton de fermeture alors que le serveur Xvnc, c'est à dire le job "vncglserver.job", poursuit son exécution sur le nœud GPU du cluster. Si le job est toujours présent et Running dans la queue Slurm, il est possible d'établir une nouvelle connexion au serveur Xvnc en utilisant la ligne de commande fournie dans la fenêtre xmessage initialement affiché au lancement du job. Toutefois, le mot de passe utilisé précédemment ne fonctionnera pas (normal, il s'agit d'un one-time password). Pour en générer un nouveau il suffit d'exécuter sur summit2, une commande de la forme :
summit2~> vncpasswd -o -display n140:1
comme il est indiqué dans le fichier de sortie de job slurm-<jobid>.out, dont voici un extrait :
summit2:~/TestGPU> cat slurm-26950.out
...
One-time password authentication enabled. Generating initial OTP ...
Full control one-time password: 22167201
Run 'vncpasswd -o' from within the TurboVNC session or
'vncpasswd -o -display n140:1' from within this shell <-------------------- Commande à exécuter sur Summit2 pour générer un nouveau mot de passe !
to generate additional OTPs
Starting applications specified in /home1/gazdi/.vnc/xstartup.turbovnc
Log file is /home1/gazdi/.vnc/n140:1.log
5. Comment modifier la résolution de la fenêtre vncviewer/IceWM ?
La taille de la fenêtre vncviewer/IceWM est fixée au lancement du job "vncglserver.job" et ne peut pas être modifié par la suite. En effet, la résolution est fonction de la taille de l'affichage virtuel définie en mémoire par le serveur Xvnc sur le nœud. Par défaut, le serveur Xvnc démarré par le job initialise un écran virtuel de 1240x900 points. Pour permettre de personnaliser la taille de la fenêtre, le script "vncglserver.job" admet un argument optionnel qui est directement transmis à l'option -geometry de la commande vncserver (wrapper qui démarre Xvnc) comme on peut le voir en ligne 14. La syntaxe de l'argument est de la forme : largeurxhauteur en nombre de points. Voici quelques exemples de soumission de jobs et les résultats des tailles de fenêtres en image :
Cliquez sur une vignette pour visualiser la fenêtre dans sa taille réelle |
|
summit2:~/TestGPU> sbatch vncglserver.job 800x600 |
|
summit2:~/TestGPU> sbatch vncglserver.job 1366x768 |
|
summit2:~/TestGPU> sbatch vncglserver.job |
|
Veuillez choisir des dimensions compatibles avec votre environnement (gnome ou KDE). Pour connaître la résolution de votre bureau, exécuter la commande xwininfo dans une fenêtre terminal puis cliquez sur votre fond d'écran. Les lignes Width: et Height: vous renseigneront.
6. Lancer l'exécution d'une application OpenGL
Les opérations décrites dans cette section s'effectuent exclusivement dans l'environnement IceWM affiché par la fenêtre vncviewer (nous supposons que vous avez déjà soumis en batch le script vncglserver.job). Pour exécuter une application OpenGL, il suffit d'ouvrir une fenêtre xterm dans cet environnement et de spécifier le nom de votre application en la préfixant de la commande vglrun :
n140~:> vglrun <appli_OpenGL>
En effet, le serveur Xvnc (sur lequel s'appuie IceWM) est incapable d'exécuter des applications OpenGL car il ne sait pas tirer partie de l'accélération matérielle des GPUs présents sur le nœud. Le rôle de vglrun est d'intercepter les appels OpenGL de votre application pour les rediriger sur le serveur X:0 lancé en parallèle de Xvnc par le script vncglserver.job (ligne 13) et configuré pour exploiter les 2 GPUs du nœud alloué. Ainsi, grâce à vglrun, vous bénéficiez de l'accélération matérielle OpenGL reconnue par le serveur X:0 pendant que le serveur Xvnc s'occupe de la gestion des événements clavier/souris et du rendu de l'image en mémoire que votre PC visualise à l'aide de vncviewer.
Remarquez, dans la copie d'écran ci-dessous, comment l'application OpenGL glxgears échoue sans vglrun et fonctionne correctement avec.
Le serveur X:0 configure chacun des GPUs notés GPU0 et GPU1 en les rattachant respectivement aux displays :0.0 et :0.1 comme l'illustre les lignes "Display Name:" et "GPUs:" des fenêtres nvidia-settings (disponibles via l'icone
dans la barre des tâches de IceWM) :
Par défaut vglrun communique avec le display :0.0 pour le rendu 3D et fait donc travailler le GPU0. Vous pouvez choisir de faire le rendu 3D avec le GPU1 en rajoutant l'option "-d 0.1" à vglrun :
Rendu OpenGL sur GPU0
Rendu OpenGL sur GPU1
vglrun <appli_OpenGL>
vglrun -d :0.0 <appli_OpenGL>vglrun -d :0.1 <appli_OpenGL>
Avec cette technique, si votre application est à la fois OpenGL et accélérée CUDA, il est possible de faire le rendu 3D sur un GPU pendant que l'autre GPU est dédié au calcul sous CUDA.



