Résumé — Pendant ma formation DE EIA, j’ai été confronté à un problème pratique : certains entraînements de modèles IA prenaient des heures sur ma seule machine, alors que les postes voisins de la salle restaient inactifs. J’ai donc développé PartaGPU, une application open source qui permet à plusieurs ordinateurs d’une même salle de partager leur puissance de calcul (CPU, GPU, RAM) pour exécuter des entraînements distribués. Concrètement, je suis passé d’un entraînement de UNet de 1h30 en solo à 30 minutes à 4 machines. Cet article présente l’application, son architecture (cgroups v2, mDNS, PyTorch DDP, crypto bout-en-bout) et comment la prendre en main.
Dans une salle de cours d’informatique, on dispose typiquement de 10 à 20 stations de travail équipées de GPU. Mais en pratique, à un instant donné :
Pendant que mon UNet tournait pendant 1h30 sur ma machine, les 19 autres GPU de la salle dormaient. Le constat est frustrant, et il devient absurde quand on multiplie les expériences.
L’idée de PartaGPU est née de là : permettre à n’importe quel poste de la salle de prêter une fraction configurable de ses ressources, et permettre à n’importe quel autre poste de consommer cette puissance disponible — le tout avec un contrôle fin de qui partage quoi, et avec qui.

Illustration du concept : un poste coordinateur répartit une charge d’entraînement sur plusieurs machines de la salle.
PartaGPU se compose de deux briques :
partagpu côté client, qui découvre les machines disponibles et orchestre l’exécution distribuée. Une seule ligne suffit pour lancer un entraînement réparti :import partagpu
partagpu.distribute("train.py") # PyTorch DDP sur tous les GPU de la salle
L’application embarque également :
pomme-tigre-bleu-ocean), pour cloisonner les groupes et empêcher un poste non autorisé de rejoindre la grappe ;Voici le benchmark qui m’a convaincu de continuer le projet, sur un entraînement de UNet pour de la segmentation médicale :
| Configuration | Temps d’entraînement | Speedup |
|---|---|---|
| 1 machine (référence) | 1h30 | 1× |
| 4 machines via PartaGPU | 30 min | 3× |
Le gain n’est pas linéaire — c’est attendu. La communication inter-nœuds (synchronisation des gradients en DDP), la latence réseau et le coût d’orchestration introduisent un overhead qui réduit l’efficacité au-delà d’un certain nombre de pairs1. Je prévois de réaliser une série de tests plus systématiques (sur différents types de modèles : UNet, ResNet, Transformers) pour dégager une courbe de gain en fonction du nombre de machines, de la taille du batch et de la bande passante. Mais même avec une efficacité de 75 %, multiplier par 3 le rendement d’une session d’entraînement change concrètement la manière de travailler en salle de cours.
La conception de PartaGPU s’est faite autour de quatre exigences : simplicité d’usage, isolation forte, découverte automatique, sécurité par défaut.
Quand un pair accepte d’exécuter une tâche pour le compte d’un autre poste, on ne peut pas se permettre de laisser ce code accéder à toute la machine. PartaGPU s’appuie sur :
bwrap) pour la sandbox du processus distant : système de fichiers en lecture seule, /workspace en tmpfs, passthrough GPU, réseau désactivé par défaut ;Côté privilèges, seules quatre actions root passent par PolicyKit (pkexec) : la création initiale d’un compte système partagpu, son mot de passe, la mise en place du cgroup, et la suppression du compte. Aucune action utilisateur courante (déplacer un curseur, accepter une tâche) ne déclenche d’élévation de privilèges.
Pour qu’un poste sache quels autres postes sont disponibles dans la salle, PartaGPU utilise mDNS (Multicast DNS, le même protocole que Bonjour/Avahi). Chaque nœud annonce sur le réseau local sa présence ainsi que des métadonnées utiles (nombre de GPU, version). Pas de serveur central, pas de configuration manuelle d’IP : on branche, on lance, ça se découvre.
Une fois les pairs identifiés, l’orchestration de l’entraînement repose sur PyTorch Distributed Data Parallel (DDP). Le paquet Python partagpu se charge :
discover()) ;distribute()) en gérant automatiquement les machines multi-GPU ;stdout / stderr vers le client ;model.pt, jusqu’à 256 Mio) ;Ctrl+C à tous les nœuds en cas d’annulation.C’est probablement la partie sur laquelle je me suis le plus amusé, et qui m’a rappelé ma scolarité DE ECIN. Le modèle de menace est simple : on suppose que n’importe qui sur le réseau local peut tenter de rejoindre la grappe, d’écouter les échanges ou d’injecter une charge de travail malicieuse. Les contre-mesures :
X-PartaGPU-AUTH: <timestamp>:<HMAC> qui lie le corps de la requête à un timestamp dans une fenêtre glissante de 30 secondes.Le tout reste auditable : le code est ouvert, les choix cryptographiques sont documentés, et il n’y a aucune dépendance à un service tiers.
Dans la mesure où il s’agit d’un projet utile dans le cadre d’une scolarité liée à l’IA, le cas métier le plus représentatif est celui de l’utilisation de PartaGPU dans un Jupyter Notebook. Le dépôt fournit un notebook Jupyter d’exemple pour prendre en main l’API Python. Côté installation :
.deb est fourni dans les releases GitHub. sudo dpkg -i partagpu_*_amd64.deb installe l’application, le helper, la règle PolicyKit et le réglage sysctl nécessaire pour bubblewrap sur Ubuntu 24.04+.git clone … && npm install && npm run tauri:dev.pip install partagpu.Le flux d’utilisation typique :
partagpu.distribute("train.py").Le projet est jeune, et plusieurs pistes restent à explorer :
PartaGPU est avant tout un outil que j’utilise moi-même pour mes prochains entraînements, et que je rends public au cas où il intéresserait d’autres étudiants, enseignants ou laboratoires confrontés au même paradoxe : du calcul partout, mais mal mutualisé. Le code est disponible sur github.com/cesar-lizurey/partagpu sous licence ouverte.
Toute remarque, contribution, rapport de bug ou retour d’expérience est bienvenu — ouvrez une issue ou une pull request sur le dépôt. Et si vous lancez un entraînement avec, n’hésitez pas à me partager votre courbe de gain : ça nourrira l’étude empirique du speedup que je compte mener.
pip install partagpuLa loi d’Amdahl et les phénomènes de communication overhead expliquent pourquoi la mise à l’échelle de l’entraînement distribué n’est jamais linéaire. Voir PyTorch DDP docs et Goyal et al., Accurate, Large Minibatch SGD. ↩