PartaGPU

Logo PartaGPU

Pendant ma formation DE EIA, j'ai été confronté au paradoxe d'une salle de cours où un seul poste peinait sur un entraînement de modèle IA pendant que les voisins restaient inactifs. PartaGPU est l'application open source que j'ai conçue pour mutualiser la puissance de calcul (CPU, GPU, RAM) de toute une salle, de manière sécurisée, et lancer des entraînements distribués en une ligne de Python.
Calcul distribué Intelligence Artificielle Open source Cybersécurité

Constat

Pendant la formation DE EIA, certains entraînements de modèles d’IA prennent plusieurs heures sur une station de travail isolée. Pendant ce temps, dans la même salle, une dizaine d’autres postes équipés de GPU restent sous-utilisés. Sur un entraînement de UNet pour de la segmentation, j’ai mesuré qu’un même cycle pouvait passer de 1h30 en solo à 30 minutes à 4 machines, à condition de disposer d’un outil simple pour répartir la charge.

Problématique

Mutualiser le calcul d’une salle ne va pas de soi. Il faut résoudre simultanément :

  • la découverte automatique des postes disponibles, sans configuration manuelle d’IP ;
  • l’isolation des charges de calcul entrantes (un poste qui prête ses ressources ne doit pas exposer ses fichiers personnels) ;
  • la maîtrise individuelle de ce que chaque poste accepte de partager (combien de % CPU, RAM, GPU) ;
  • la sécurité du réseau : n’importe quel équipement sur le LAN peut tenter de rejoindre la grappe ou d’écouter les échanges ;
  • l’ergonomie côté utilisateur : un cas d’usage typique est un Jupyter Notebook, l’API doit donc tenir en une ligne.

Solution

PartaGPU se compose de deux briques complémentaires :

  1. Une application de bureau (Tauri — backend Rust, frontend React/TypeScript) installée sur chaque poste participant, qui permet de régler par curseur la part de ressources partagées et de rejoindre une “salle” virtuelle protégée par un code à 4 mots.
  2. Un paquet Python partagpu (pip install partagpu) qui découvre les pairs et orchestre l’exécution distribuée via PyTorch DDP. Une seule ligne suffit dans un notebook : partagpu.distribute("train.py").

Mise en œuvre

L’architecture combine plusieurs primitives système et cryptographiques :

  • cgroups v2 pour appliquer les plafonds CPU / RAM choisis par chaque utilisateur — la même brique que Docker, mais sans démon Docker à installer ;
  • bubblewrap pour exécuter les charges distantes en sandbox (FS en lecture seule, /workspace en tmpfs, réseau désactivé par défaut) ;
  • CUDA MPS pour faire respecter le plafond de % GPU partagé ;
  • mDNS pour la découverte automatique des pairs sur le LAN ;
  • PyTorch DDP pour la distribution de l’entraînement ;
  • PBKDF2-HMAC-SHA256 (600 000 itérations) pour dériver la clé d’authentification depuis le code à 4 mots ;
  • X25519 ECDH éphémère + AES-256-GCM pour le chiffrement bout-en-bout, avec rotation de la clé serveur toutes les 10 minutes (forward secrecy) ;
  • en-tête X-PartaGPU-AUTH (HMAC + timestamp) pour l’anti-rejeu, fenêtre de 30 secondes.

Côté privilèges, seules quatre actions root passent par PolicyKit (pkexec) — la création initiale d’un compte système, son mot de passe, la mise en place du cgroup, et la suppression du compte. Aucun usage courant ne déclenche d’élévation.

Mon rôle

Conception, développement, packaging et publication open source de l’ensemble : architecture, code Rust côté Tauri, frontend React, paquet Python, CI/CD GitHub Actions, paquet .deb, AppImage, et publication automatisée du paquet PyPI.

Difficultés

Faire cohabiter une expérience utilisateur “une ligne de Python suffit” avec un modèle de menace réaliste (n’importe qui sur le LAN peut être hostile) a demandé une attention particulière à la cryptographie. Le choix de PBKDF2 avec 600 000 itérations, de la rotation de clés éphémères et de la comparaison HMAC en temps constant vient directement des bonnes pratiques que j’ai consolidées pendant ma formation DE ECIN.

L’autre difficulté a été l’isolation : ne pas reposer sur Docker pour rester léger, tout en garantissant qu’un job entrant ne puisse pas accéder au système de fichiers de l’hôte. La combinaison cgroups v2 + bubblewrap + sandbox utilisateur dédié a permis de tenir cet objectif sans dépendance lourde.

Enrichissements

Au-delà du gain de temps, le projet est représentatif de ce que j’aime construire : un outil pratique, open source, qui touche simultanément à la programmation système, à la cryptographie applicative, à l’expérience développeur, et qui sert un cas d’usage concret. Un article de blog détaillé est également disponible : PartaGPU : mutualiser la puissance de calcul d’une salle pour entraîner ses modèles IA plus vite.

SOURCE