Gestion des cartes graphiques NVIDIA dans MATLAB : le NVIDIA System Management Interface

NVIDIA fournit un utilitaire de monitoring avec les drivers récents des cartes Tesla et Quadro. Cet outil s’appelle le « NVIDIA System Management Interface » ou « nvidia-smi ». Il est disponible sur Linux, et avec les versions 64bit de Windows Server 2008 R2 et de Windows 7. Il est également fournit avec les drivers des cartes GeForce avec une prise en charge limitée pour ces modèles (voir la liste à la fin de ce billet).

Je vais vous montrer comment appeler cet exécutable à partir de MATLAB pour récupérer des informations sur votre carte NVIDIA (nom, température, mémoire, fréquence…).

1) nvidia-smi

nvidia-smi est donc un exécutable 64 bits qui est installé en même tant que le driver de la carte graphique.

Le dossier d’installation par défaut sur Windows 7 est « C:\Program Files\NVIDIA Corporation\NVSMI ». Pour plus de souplesse, vous pouvez ajouter ce chemin dans la variable d’environnement PATH de Windows.

Sur Linux, il faut utiliser le driver propriétaire fournit par NVIDIA. Le dossier d’installation par défaut est « /usr/bin »

Pour vérifier que vous êtes prêt à utiliser cet outil, vous pouvez simplement exécuter la commande suivante dans une invite de commande de votre système d’exploitation :

nvidia-smi -L

Indice du GPU

Pour simplifier la suite de ce billet, je partirai du principe qu’il n’y a qu’une seule carte graphique présente sur votre machine. La commande utilisée commencera donc toujours par :

nvidia-smi -i 0

Le « 0 » étant l’indice du premier GPU détecté sur la machine.

Liste des propriétés

La commande pour récupérer les propriétés est la suivante :

nvidia-smi -i 0 --query-gpu=

Le signe « = » est alors suivi de la liste des propriétés à récupérer, séparées par des virgules. Pour obtenir la liste de toutes les propriétés, utilisez la commande suivante dans une console de votre système d’exploitation :

nvidia-smi --help-query-gpu > list.txt

Ouvrez le fichier list.txt et cherchez la propriété qui vous intéresse.

Vous pouvez consulter la liste générée sur ma machine ici.

Format

Sans trop rentrer dans le détail, on utilisera le formatage --format=csv,noheader lors des appels à nvidia-smi

2) nvidia-smi & MATLAB

Pour résumer, on utilisera ce modèle de commande :

nvidia-smi -i 0 --format=csv,noheader --query-gpu=

Que ce soit sur Windows, Linux ou Mac OS X, MATLAB est capable d’exécuter des programmes externes grâce aux fonctions system, dos ou unix.

On peut donc tester comme précédemment dans le Command Window de MATLAB :

[status, data] = system('nvidia-smi -L')
status =

     0


data =

GPU 0: Quadro K2000 (UUID: GPU-66119846-d929-fb76-3d19-b9056e2e00ab)

Il est très important de tester la valeur de retour de la variable status. Elle vaut 0 en cas de succès et une valeur différente de 0 en cas d’échec. Tout le travail consiste ensuite à extraire les informations de la chaine de caractère contenue dans la variable data

Version du driver

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=driver_version')
data =

320.00

Nom

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=name')
data =

Quadro K2000

Numéro de série

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=serial')
data =

0321113022548

Identifiant unique (UUID)

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=uuid')
data =

GPU-66119846-d929-fb76-3d19-b9056e2e00ab

Vitesse ventilateur

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=fan.speed')
data =

30 %

Température

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=temperature.gpu')
data =

32

Mémoire totale

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=memory.total')
data =

2047 MB

Mémoire disponible

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=memory.free')
data =

34 MB

Mémoire utilisée

[status, data] = system('nvidia-smi -i 0 --format=csv,noheader --query-gpu=memory.used')
data =

2013 MB

3) Fonctions MATLAB

J’ai écris deux fonctions MATLAB pour vous permettre de récupérer aisément certaines informations sur votre carte graphique NVIDIA.

Vous pouvez télécharger les deux codes sources ici : Informations sur la carte graphique NVIDIA avec MATLAB et le NVIDIA System Management Interface

Voici un exemple d’utilisation :

>> [gpuInfo, sysInfo] = nvsmiQuery;
>> nvsmiLog(gpuInfo, sysInfo);

Voici un aperçu des informations renvoyées :

query nvidia gpu property with MATLAB

4) Multiple GPUs

Si vous avez plusieurs cartes graphiques installées sur votre machine, il serait tentant d’utiliser les syntaxes suivantes pour accéder aux différents GPU :

nvidia-smi -i 0 ...

Puis

nvidia-smi -i 1 ...

Mais, il faut savoir que l’ordre des indices peut changer à chaque démarrage de la machine. Dans ce cas, il est donc plus prudent d’utiliser l’identifiant unique de chaque GPU :

nvidia-smi -i GPU-66119846-d929-fb76-3d19-b9056e2e00ab ...

5) Alternative à l’utilisation de la fonction system

L’outil fourni par NVIDIA permet de stocker le résultat dans un fichier CSV, comme par exemple :

status = system('nvidia-smi -i 0 -f gpuprop.csv --format=csv,noheader --query-gpu=driver_version,serial,name,uuid,temperature.gpu,fan.speed')

Ou encore dans un fichier XML :

status = system('nvidia-smi -q -f gpuprop.xml -x ')

Il faudra alors ensuite extraire les informations de ces fichiers.

Vous pouvez consulter les fichiers issus des lignes précédentes :

6) Conclusion

Vous avez maintenant un outil à disposition pour récupérer des informations sur les GPUs NVIDIA directement depuis MATLAB.

En réalité, l’exécutable nvidia-smi est basé sur la bibliothèque NVIDIA Management Library (NVML) disponible gratuitement avec le GPU Deployment Kit. De ce fait, on peut faire directement appel à cette librairie via un fichier MEX depuis MATLAB. C’est ce que je vous montrerai dans un prochain billet ;)

N’hésitez pas à me faire des retours si vous rencontrez des difficultés dans l’utilisation des codes présentés dans ce billet.

7) Produits pris en charge

Voici une liste des GPUs pris en charge par nvidia-smi :

  • Full Support
    • NVIDIA Tesla Line:
      • S2050, C2050, C2070, C2075,
      • M2050, M2070, M2075, M2090,
      • X2070, X2090,
      • K10, K20, K20X, K20Xm, K20c, K20m, K20s
    • NVIDIA Quadro Line:
      • 410, 600, 2000, 4000, 5000, 6000, 7000, M2070-Q
      • K2000, K2000D, K4000, K5000, K6000
    • NVIDIA GRID Line:
      • K1, K2, K340, K520
    • NVIDIA GeForce Line: None
  • Limited Support
    • NVIDIA Tesla Line: S1070, C1060, M1060
    • NVIDIA Quadro Line: All other current and previous generation Quadro-branded parts
    • NVIDIA GeForce Line: All current and previous generation GeForce-branded parts

8) Liens utiles

Identifier le processeur avec MATLAB via la base de registre de Windows

La fonction winqueryreg de MATLAB permet de récupérer les valeurs stockées dans la base de registre de Windows. Il est donc possible de s’en servir pour identifier le processeur présent sur la machine en interrogeant la clé « HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor ». En fonction du nombre de cÅ“urs (N) présents sur le processeur, vous obtenez autant de sous-clés, numérotées de 0 à N-1 :

base-registre-windows-processeur

Les codes MATLAB qui suivent sont exécutés sur un ordinateur portable Asus K53SC. Comme vous pourrez le remarquer, seul le troisième argument change à chaque exemple.

Note : un souci d’édition avec le blog ne me permet pas de vous fournir des lignes de codes facilement copiables. Désolé.

Désignation du vendeur

winqueryreg-matlab-cpu-vendoridentifier

ans =

GenuineIntel

C’est donc ici un processeur Intel. Pour AMD, la valeur serait « AuthenticAMD ».

Identifiant du processeur

winqueryreg-matlab-cpu-identifier

ans =

Intel64 Family 6 Model 42 Stepping 7

Voir ici pour quelques explications sur ces valeurs.

Désignation du processeur

winqueryreg-matlab-cpu-processornamestring

ans =

Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz

C’est le bon !

Fréquence du processeur

winqueryreg-matlab-cpu-mhz

ans =

        2394

Ce qui correspond bien à la fréquence affichée précédemment (2394 MHz contre 2,40 GHz)

Conclusion

Vous connaissez maintenant une méthode rapide pour identifier le processeur présent sur votre machine avec MATLAB sur Windows. Pour aller plus loin, je vous renvoi vers la série de trois billets sur le thème de l’identification de processeur avec MATLAB (1, 2 et 3).

Vous pouvez explorer le registre en tapant « regedit » dans la barre de commandes du menu Démarrer de Windows. Mais prenez bien garde à ne rien modifier.

Ce billet a été inspiré par le code source de la fonction getdebuginfo de Scilab.

Compiler un MEX lié à un Framework avec MATLAB sur Mac OS X

Il est possible de compiler un fichier MEX en le liant à un framework sur Mac OS X. Je vais vous montrer comment en compilant un MEX utilisant les ressources de la bibliothèque SDL2. J’utiliserai MATLAB R2011b et R2014a sur Mac OS X 10.9.3.

Qu’est-ce qu’un framework ?

Un framework est un dossier qui contient des ressources partagées que l’on peut utiliser dans d’autres applications ou codes (lire What are Frameworks?). Dans notre cas, ce sont les bibliothèques partagées et les fichiers d’entêtes qui nous intéressent ici.

Avec MATLAB, l’intérêt est de pouvoir utiliser ces ressources via des fichiers MEX. La difficulté consiste à pourvoir lier ces ressources lors de la compilation avec la commande mex.

Nous prendrons ici l’exemple du framework de la SDL2 (Simple DirectMedia Layer)

Installation du framework de la SDL2

Téléchargez le fichier « SDL2-2.0.3.dmg » (http://www.libsdl.org/download-2.0.php). Une fois téléchargé, cliquez d’une part sur le fichier, ouvrez d’autre part une fenêtre du Finder et rendez-vous dans le dossier « Library > Frameworks ». Cliquez sur le dossier « SDL2.framework » et déplacez le, tout en maintenant le bouton de la souris, dans le dossier Frameworks du Finder :

Installation du framework de la SDL2 sur Mac

La fenêtre suivante apparait :

Mot de passe installation framework sur Mac

Cliquez sur « Authentifier » et entrez votre mot de passe utilisateur.

Voila l’installation du framework est terminée.

Fichier MEX exemple

Nous allons écrire un MEX qui permet d’afficher la version de la SDL et qui fait appel à la fonction SDL_GetVersion.

#include "mex.h"
#include "SDL_version.h"

void mexFunction(int nlhs, mxArray *plhs[],
        int nrhs, const mxArray *prhs[])
       
{
   
    SDL_version ver;
   
    if(nrhs!=0)
        mexErrMsgTxt("Too many input arguments.");
    if(nlhs!=0)
        mexErrMsgTxt("Too many output arguments.");
   
    SDL_GetVersion(&ver);
   
    mexPrintf("SDL version: %u.%u.%u\n", ver.major, ver.minor, ver.patch);

}

Enregistrez ce code dans un fichier getSdlVersion.c

Compilation du MEX

Avec les versions récentes de MATLAB, ici la R2014a :

mex getSdlVersion.c -I/Library/Frameworks/SDL2.framework/Headers LDFLAGS="$LDFLAGS -framework SDL2"

Si vous avez une version plus ancienne de MATLAB et que la commande ci-dessus ne fonctionne pas, essayé ceci :

mex getSdlVersion.c -I/Library/Frameworks/SDL2.framework/Headers /Library/Frameworks/SDL2.framework/SDL2

Note : il y a deux lignes de compilation différentes car Apple a remplacé au fil du temps le compilateur GCC par Clang. Tout dépend donc de la version de MATLAB et de Mac OS X.

Si la compilation réussi, vous obtiendrez un fichier getSdlVersion.mexmaci64 à utiliser comme ceci :

>> getSdlVersion
SDL version: 2.0.3

Conclusion

Vous devriez maintenant pouvoir compiler vos MEX sur Mac en les liant à un framework (voire plusieurs frameworks). Si vous rencontrez des difficultés, n’hésitez pas à venir poser vos questions sur le forum MATLAB.