Déployez vos applications d'IA conteneurisées avec nvidia-docker

De plus en plus de produits et services tirent parti des capacités de modélisation et de prédiction de l’IA. Cet article présente l’outil nvidia-docker permettant d’intégrer des briques logicielles d’IA (Intelligence Artificielle) dans une architecture de microservices. Le principal avantage exploré ici est l’utilisation des ressources GPU (Graphical Processing Unit) du système hôte pour accélérer plusieurs applications d’IA conteneurisées.

Pour comprendre l’utilité de nvidia-docker, nous commencerons par décrire quel type d’IA peut bénéficier de l’accélération GPU. Dans un second temps nous présenterons comment implémenter l’outil nvidia-docker. Enfin, nous décrirons quels outils sont disponibles pour utiliser l’accélération GPU dans vos applications et comment les utiliser.

Pourquoi utiliser des GPU dans les applications d’IA ?

Dans le domaine de l’intelligence artificielle, nous avons deux principaux sous-domaines qui sont utilisés : l’apprentissage automatique et l’apprentissage profond. Cette dernière fait partie d’une famille plus large de méthodes d’apprentissage automatique basées sur réseaux de neurones artificiels.

Dans le cadre du deep learning, où les opérations sont essentiellement des multiplications matricielles, les GPU sont plus performants que les CPU (Central Processing Units). C’est pourquoi l’utilisation des GPU s’est développée ces dernières années. En effet, les GPU sont considérés comme le cœur du deep learning en raison de leur architecture massivement parallèle.

Cependant, les GPU ne peuvent pas exécuter n’importe quel programme. En effet, ils utilisent un langage spécifique (CUDA pour NVIDIA) pour tirer profit de leur architecture. Alors, comment utiliser et communiquer avec les GPU de vos applications ?

La technologie NVIDIA CUDA

NVIDIA CUDA (Compute Unified Device Architecture) est une architecture de calcul parallèle associée à une API pour la programmation des GPU. CUDA traduit le code d’application en un jeu d’instructions que les GPU peuvent exécuter.

Un SDK CUDA et des bibliothèques telles que cuBLAS (Basic Linear Algebra Subroutines) et cuDNN (Deep Neural Network) ont été développés pour communiquer facilement et efficacement avec un GPU. CUDA est disponible en C, C++ et Fortran. Il existe des wrappers pour d’autres langages, notamment Java, Python et R. Par exemple, des bibliothèques d’apprentissage en profondeur telles que TensorFlow et Keras sont basées sur ces technologies.

Pourquoi utiliser nvidia-docker ?

Nvidia-docker répond aux besoins des développeurs qui souhaitent ajouter des fonctionnalités d’IA à leurs applications, les conteneuriser et les déployer sur des serveurs alimentés par des GPU NVIDIA.

L’objectif est de mettre en place une architecture permettant le développement et le déploiement de modèles de deep learning dans des services disponibles via une API. Ainsi, le taux d’utilisation des ressources GPU est optimisé en les rendant disponibles pour plusieurs instances d’application.

De plus, nous bénéficions des avantages des environnements conteneurisés :

  • Isolement des instances de chaque modèle d’IA.
  • Colocation de plusieurs modèles avec leurs dépendances spécifiques.
  • Colocation d’un même modèle sous plusieurs versions.
  • Déploiement cohérent des modèles.
  • Suivi des performances du modèle.

Nativement, l’utilisation d’un GPU dans un conteneur nécessite d’installer CUDA dans le conteneur et de donner des privilèges pour accéder à l’appareil. Dans cet esprit, le docker nvidia Un outil a été développé, permettant aux périphériques GPU NVIDIA d’être exposés dans des conteneurs de manière isolée et sécurisée.

Au moment de la rédaction de cet article, la dernière version de nvidia-docker est la v2. Cette version diffère grandement de la v1 sur les points suivants :

  • Version 1: Nvidia-docker est implémenté en superposition à Docker. Autrement dit, pour créer le conteneur, vous deviez utiliser nvidia-docker (Ex : nvidia-docker run ...) qui effectue les actions (entre autres la création de volumes) permettant de voir les périphériques GPU dans le conteneur.
  • Version 2: Le déploiement est simplifié avec le remplacement des volumes Docker par l’utilisation des runtimes Docker. En effet, pour lancer un conteneur, il faut maintenant utiliser le runtime NVIDIA via Docker (Ex : docker run --runtime nvidia ...)

A noter qu’en raison de leur architecture différente, les deux versions ne sont pas compatibles. Une application écrite en v1 doit être réécrite pour la v2.

Configuration de nvidia-docker

Les éléments requis pour utiliser nvidia-docker sont :

  • Un environnement d’exécution de conteneur.
  • Un GPU disponible.
  • La Boîte à outils de conteneur NVIDIA (partie principale de nvidia-docker).

Conditions préalables

Docker

Un environnement d’exécution de conteneur est requis pour exécuter le Boîte à outils de conteneur NVIDIA. Docker est le runtime recommandé, mais Podman et containerd sont également pris en charge.

La la documentation officielle donne la procédure d’installation de Docker.

Pilote NVIDIA

Les pilotes sont nécessaires pour utiliser un périphérique GPU. Dans le cas des GPU NVIDIA, les pilotes correspondant à un OS donné peuvent être obtenus auprès du Page de téléchargement des pilotes NVIDIAen renseignant les informations sur le modèle de GPU.

L’installation des pilotes se fait via l’exécutable. Pour Linux, utilisez les commandes suivantes en remplaçant le nom du fichier téléchargé :

chmod +x NVIDIA-Linux-x86_64-470.94.run
./NVIDIA-Linux-x86_64-470.94.run

Redémarrez la machine hôte à la fin de l’installation pour prendre en compte les pilotes installés.

Installer nvidia docker

Nvidia-docker est disponible sur le Page du projet GitHub. Pour l’installer, suivez les installation Manuel en fonction de votre serveur et des spécificités de l’architecture.

Nous avons maintenant une infrastructure qui nous permet d’avoir des environnements isolés donnant accès aux ressources GPU. Pour utiliser l’accélération GPU dans les applications, plusieurs outils ont été développés par NVIDIA (liste non exhaustive) :

  • Boîte à outils CUDA: un ensemble d’outils pour développer des logiciels/programmes capables d’effectuer des calculs en utilisant à la fois le CPU, la RAM et le GPU. Il peut être utilisé sur les plates-formes x86, Arm et POWER.
  • NVIDIA cuDNN: une bibliothèque de primitives pour accélérer les réseaux d’apprentissage en profondeur et optimiser les performances GPU pour les principaux frameworks tels que Tensorflow et Keras.
  • NVIDIA cuBLAS: une bibliothèque de sous-programmes d’algèbre linéaire accélérés par GPU.

En utilisant ces outils dans le code d’application, les tâches d’IA et d’algèbre linéaire sont accélérées. Les GPU étant désormais visibles, l’application est capable d’envoyer les données et les opérations à traiter sur le GPU.

La boîte à outils CUDA est l’option de niveau le plus bas. Il offre le plus de contrôle (mémoire et instructions) pour créer des applications personnalisées. Les bibliothèques fournissent une abstraction des fonctionnalités de CUDA. Ils vous permettent de vous concentrer sur le développement de l’application plutôt que sur la mise en œuvre de CUDA.

Une fois tous ces éléments implémentés, l’architecture utilisant le service nvidia-docker est prête à l’emploi.

Voici un schéma pour résumer tout ce que nous avons vu :




CUDA_CUDNN_PNG

Conclusion

Nous avons mis en place une architecture permettant l’utilisation des ressources GPU de nos applications dans des environnements isolés. Pour résumer, l’architecture est composée des briques suivantes :

  • Système d’exploitation : Linux, Windows…
  • Docker : isolation de l’environnement à l’aide de conteneurs Linux
  • Pilote NVIDIA : installation du pilote du matériel en question
  • Runtime de conteneur NVIDIA : orchestration des trois précédents
  • Applications sur conteneur Docker :
    • CUDA
    • cuDNN
    • CUBLAS
    • Tensorflow/Keras

NVIDIA continue de développer des outils et des bibliothèques autour des technologies d’IA, dans le but de s’imposer comme un leader. D’autres technologies peuvent compléter nvidia-docker ou peuvent être plus appropriées que nvidia-docker selon le cas d’utilisation.

Leave a Reply