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é :

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 :

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
...

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 :

  1. 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.

    {i} 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.

  2. 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).

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 :

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

attachment:NVidia-settings.800x600.png

summit2:~/TestGPU> sbatch vncglserver.job 1366x768

attachment:IceWM.1366x768.png

summit2:~/TestGPU> sbatch vncglserver.job

summit2:~/TestGPU> sbatch vncglserver.job 1240x900

attachment:IceWM.1240x900.png

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.

vglrun.800x600.png


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 nvidia-settings.png dans la barre des tâches de IceWM) :

nvidia-settings.800x600.png

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 :

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.


CatégorieDocUnix

WikiSummit2: NoeudsGpu/ServeurVisu (dernière édition le 2019-10-22 15:05:50 par DidierGazen)