La carte graphique, CUDA et l'expert
Zythom - Zythom MEM, 3/05/2017
Je me suis lancé passionnément dans le calcul parallèle (cf billet précédent). Pour cela, je me suis offert une carte graphique à un prix abordable et que je destine au calcul intensif.
Imaginez mon impatience en attendant la livraison... Le jour J arrive et me voilà en train de démonter ma machine pour y ajouter ce magnifique objet technologique.
A ce stade du récit, il me faut faire un petit rappel : je suis adepte de GNU/Linux depuis de nombreuses années. J'aime tester de nouvelles distributions, j'aime l'univers GNU/Linux, ou FreeBSD. J'ai fait ma thèse sous Domain/OS et HP-UX. J'ai bien connu la distribution Yggdrasil qui était la première sur cédérom, c'est dire si je suis vieux. A titre professionnel, j'ai d'abord choisi Yggdrasil, puis Slackware, puis Red Hat, et enfin depuis de nombreuses années, Debian. A titre privé, j'ai beaucoup aimé Gentoo, puis Ubuntu, pour maintenant utiliser Mint.
La plupart des analyses techniques que je réalise pour mes expertises judiciaires sont faites sous GNU/Linux en utilisant des logiciels en ligne de commande.
Pour autant, j'apprécie la facilité d'installation des distributions GNU/Linux actuelles : il suffit de graver un DVD ou d'utiliser une clef USB et hop, les différents éléments de votre machine sont fonctionnels (en général ;-).
J'aime beaucoup la facilité...
Les plus barbu(e)s d'entre vous se souviennent des heures passées à configurer leur serveur X pour arriver à brancher deux malheureux écrans sur la même carte graphique. C'est un peu là où je vais en (re)venir.
La semaine dernière, lorsque j'ai reçu ma nouvelle carte graphique, j'étais tout excité à l'idée de transformer mon bête ordinateur en bête de calculs parallèles. Après m'être assuré (quand même) que toutes mes données étaient correctement sauvegardées, j'ai démonté ma tour pour y insérer cette nouvelle carte graphique surpuissante.
Premier constat : la carte graphique nécessite une alimentation dédiée, avec un connecteur 8 broches... Affolé, je regarde l'intérieur de ma machine éventrée, et je constate avec joie qu'un connecteur sort de mon boitier d'alimentation avec 6 broches d'un côté et deux de l'autre qui ressemblent fort au truc nécessaire pour faire fonctionner ma carte graphique. Je branche, rien ne fume \o/.
Deuxième constat : je dispose de deux emplacements PCI Express me permettant de conserver mon ancienne carte graphique utilisée par mes deux écrans.
Je branche tout ce petit monde et redémarre mon ordinateur. Magie (et travail) de la communauté open source, tout est reconnu par le système d'exploitation, les pilotes par défaut chargés et tout fonctionne parfaitement. Sauf que...
Je ne perds pas de vue mon objectif : faire massivement des calculs. J'ai donc ma carte graphique d'origine sur laquelle sont branchés mes deux écrans, et ma nouvelle carte graphique sur laquelle rien n'est branché et qui va me servir de calculateur GPU. Sauf que...
J'ai soigneusement choisi mon modèle de carte graphique pour qu'elle intègre un GPU Nvidia qui, au moment où j'écris ce billet, est admirablement programmable avec un environnement qui s'appelle CUDA. Avant de casser ma tirelire, j'avais fait quelques essais avec le vieux portable de ma fille (seul appareil de la maison muni d'une carte Nvidia). Sous GNU/Linux Mint, l'installation de l'environnement de développement CUDA se fait très simplement avec la commande "sudo apt-get install cuda". Après quelques réglages post-installation, me voici donc en train de jouer avec les 1920 cœurs des 15 processeurs graphiques. Je suis aux anges :-) Sauf que...
Sous Windows, quand vous installez un nouveau composant ou un nouveau programme, il faut la plupart du temps redémarrer l'ordinateur. Ce n'est pas vrai sous GNU/Linux. J'ai donc pu m'amuser immédiatement pendant plusieurs heures avec mon nouveau jouet avant d'éteindre mon ordinateur.
Mais le lendemain, catastrophe. En démarrant ma machine, plus rien ne fonctionnait. Enfin, "plus rien" non : je n'avais plus d'interface graphique fonctionnelle. Me voici parti pour plusieurs jours de galères "à l'ancienne" pour essayer d'abord de réparer ma configuration graphique, puis pour essayer de comprendre. Comme avant, j'ai écumé les forums, j'ai cherché les tutos, les howto, les manuels correspondant à mon problème...
Pour faire court : je n'ai pas réussi à trouver d'aide.
Oui, je sais. Je suis EXPERT. Je suis EXPERIMENTE (= vieux). Mais non. Je n'ai pas réussi à faire fonctionner deux cartes graphiques (une vieille Radeon et une jeune Nvidia) dont une devait être consacrée à la gestion de mes deux écrans et l'autre à mes calculs massivement parallèles... Le serveur X Windows et les deux pilotes graphiques associés (libres ou propriétaires) ne semblent pas vouloir fonctionner ensembles après redémarrage. Pourtant j'arrive à faire fonctionner l'ensemble AVANT redémarrage...
Je me suis tapé la configuration d'un xorg.conf (fichier qui est sensé avoir disparu).
J'ai abandonné Mint pour installer Ubuntu (comme conseillé par la doc CUDA).
J'ai réussi la configuration avec une seule carte RADEON.
J'ai réussi la configuration avec la seule carte Nvidia.
MAIS je n'ai pas réussi à créer la configuration avec les deux cartes.
Après plusieurs jours de transpiration, j'en suis arrivé à la conclusion suivante : je suis NUL en configuration graphique GNU/Linux.
J'ai donc ravalé ma fierté, retiré ma nouvelle carte graphique, remis ma configuration d'origine GNU/Mint, et j'ai sorti un vieux PC de son placard. J'y ai installé un Ubuntu server tout frais. J'y ai placé ma carte graphique surpuissante. J'ai constaté l'absence d'alimentation dédiée... J'ai acheté cet adaptateur d'alimentation SATA vers carte vidéo PCI Express 8 broches. J'ai attendu trois jours pour la livraison.
Et j'ai maintenant un calculateur dédié aux calculs parallèles.
Je m'y connecte à distance en ssh. Je lui ai consacré un processus de sauvegarde dédié. Il a une place particulière dans mon bureau et dans mon cœur.
Il faut savoir reculer pour mieux avancer.
Avant je programmais un réseau de neurones qui travaillait sur 60 000 exemples d'apprentissage sur plusieurs semaines. Maintenant j'ai 60 000 réseaux de neurones identiques qui travaillent chacun en parallèle sur leur exemple d'apprentissage, en une nuit à une vitesse de folie sur 8 Go de mémoire graphique ultra rapide.
Le rêve d'un vieux chercheur :-)
Mais cela, c'est une autre histoire.
Imaginez mon impatience en attendant la livraison... Le jour J arrive et me voilà en train de démonter ma machine pour y ajouter ce magnifique objet technologique.
A ce stade du récit, il me faut faire un petit rappel : je suis adepte de GNU/Linux depuis de nombreuses années. J'aime tester de nouvelles distributions, j'aime l'univers GNU/Linux, ou FreeBSD. J'ai fait ma thèse sous Domain/OS et HP-UX. J'ai bien connu la distribution Yggdrasil qui était la première sur cédérom, c'est dire si je suis vieux. A titre professionnel, j'ai d'abord choisi Yggdrasil, puis Slackware, puis Red Hat, et enfin depuis de nombreuses années, Debian. A titre privé, j'ai beaucoup aimé Gentoo, puis Ubuntu, pour maintenant utiliser Mint.
La plupart des analyses techniques que je réalise pour mes expertises judiciaires sont faites sous GNU/Linux en utilisant des logiciels en ligne de commande.
Pour autant, j'apprécie la facilité d'installation des distributions GNU/Linux actuelles : il suffit de graver un DVD ou d'utiliser une clef USB et hop, les différents éléments de votre machine sont fonctionnels (en général ;-).
J'aime beaucoup la facilité...
Les plus barbu(e)s d'entre vous se souviennent des heures passées à configurer leur serveur X pour arriver à brancher deux malheureux écrans sur la même carte graphique. C'est un peu là où je vais en (re)venir.
La semaine dernière, lorsque j'ai reçu ma nouvelle carte graphique, j'étais tout excité à l'idée de transformer mon bête ordinateur en bête de calculs parallèles. Après m'être assuré (quand même) que toutes mes données étaient correctement sauvegardées, j'ai démonté ma tour pour y insérer cette nouvelle carte graphique surpuissante.
Premier constat : la carte graphique nécessite une alimentation dédiée, avec un connecteur 8 broches... Affolé, je regarde l'intérieur de ma machine éventrée, et je constate avec joie qu'un connecteur sort de mon boitier d'alimentation avec 6 broches d'un côté et deux de l'autre qui ressemblent fort au truc nécessaire pour faire fonctionner ma carte graphique. Je branche, rien ne fume \o/.
Deuxième constat : je dispose de deux emplacements PCI Express me permettant de conserver mon ancienne carte graphique utilisée par mes deux écrans.
Je branche tout ce petit monde et redémarre mon ordinateur. Magie (et travail) de la communauté open source, tout est reconnu par le système d'exploitation, les pilotes par défaut chargés et tout fonctionne parfaitement. Sauf que...
Je ne perds pas de vue mon objectif : faire massivement des calculs. J'ai donc ma carte graphique d'origine sur laquelle sont branchés mes deux écrans, et ma nouvelle carte graphique sur laquelle rien n'est branché et qui va me servir de calculateur GPU. Sauf que...
J'ai soigneusement choisi mon modèle de carte graphique pour qu'elle intègre un GPU Nvidia qui, au moment où j'écris ce billet, est admirablement programmable avec un environnement qui s'appelle CUDA. Avant de casser ma tirelire, j'avais fait quelques essais avec le vieux portable de ma fille (seul appareil de la maison muni d'une carte Nvidia). Sous GNU/Linux Mint, l'installation de l'environnement de développement CUDA se fait très simplement avec la commande "sudo apt-get install cuda". Après quelques réglages post-installation, me voici donc en train de jouer avec les 1920 cœurs des 15 processeurs graphiques. Je suis aux anges :-) Sauf que...
Sous Windows, quand vous installez un nouveau composant ou un nouveau programme, il faut la plupart du temps redémarrer l'ordinateur. Ce n'est pas vrai sous GNU/Linux. J'ai donc pu m'amuser immédiatement pendant plusieurs heures avec mon nouveau jouet avant d'éteindre mon ordinateur.
Mais le lendemain, catastrophe. En démarrant ma machine, plus rien ne fonctionnait. Enfin, "plus rien" non : je n'avais plus d'interface graphique fonctionnelle. Me voici parti pour plusieurs jours de galères "à l'ancienne" pour essayer d'abord de réparer ma configuration graphique, puis pour essayer de comprendre. Comme avant, j'ai écumé les forums, j'ai cherché les tutos, les howto, les manuels correspondant à mon problème...
Pour faire court : je n'ai pas réussi à trouver d'aide.
Oui, je sais. Je suis EXPERT. Je suis EXPERIMENTE (= vieux). Mais non. Je n'ai pas réussi à faire fonctionner deux cartes graphiques (une vieille Radeon et une jeune Nvidia) dont une devait être consacrée à la gestion de mes deux écrans et l'autre à mes calculs massivement parallèles... Le serveur X Windows et les deux pilotes graphiques associés (libres ou propriétaires) ne semblent pas vouloir fonctionner ensembles après redémarrage. Pourtant j'arrive à faire fonctionner l'ensemble AVANT redémarrage...
Je me suis tapé la configuration d'un xorg.conf (fichier qui est sensé avoir disparu).
J'ai abandonné Mint pour installer Ubuntu (comme conseillé par la doc CUDA).
J'ai réussi la configuration avec une seule carte RADEON.
J'ai réussi la configuration avec la seule carte Nvidia.
MAIS je n'ai pas réussi à créer la configuration avec les deux cartes.
Après plusieurs jours de transpiration, j'en suis arrivé à la conclusion suivante : je suis NUL en configuration graphique GNU/Linux.
J'ai donc ravalé ma fierté, retiré ma nouvelle carte graphique, remis ma configuration d'origine GNU/Mint, et j'ai sorti un vieux PC de son placard. J'y ai installé un Ubuntu server tout frais. J'y ai placé ma carte graphique surpuissante. J'ai constaté l'absence d'alimentation dédiée... J'ai acheté cet adaptateur d'alimentation SATA vers carte vidéo PCI Express 8 broches. J'ai attendu trois jours pour la livraison.
Et j'ai maintenant un calculateur dédié aux calculs parallèles.
Je m'y connecte à distance en ssh. Je lui ai consacré un processus de sauvegarde dédié. Il a une place particulière dans mon bureau et dans mon cœur.
Il faut savoir reculer pour mieux avancer.
Avant je programmais un réseau de neurones qui travaillait sur 60 000 exemples d'apprentissage sur plusieurs semaines. Maintenant j'ai 60 000 réseaux de neurones identiques qui travaillent chacun en parallèle sur leur exemple d'apprentissage, en une nuit à une vitesse de folie sur 8 Go de mémoire graphique ultra rapide.
Le rêve d'un vieux chercheur :-)
Mais cela, c'est une autre histoire.