En bref :
1. shm_size est un espace temporaire utilisant la RAM.
2. Avec ipc: host, shm_size devient inutile, et le système alloue 50% des ressources de la RAM hôte.
3. De nombreux exemples de configuration de modèles d'IA montrent souvent ipc: host et shm_size configurés simultanément. En réalité, n'en configurer qu'un seul améliore la lisibilité.
4. Pour les charges de travail d'IA, un minimum de 8G à 16G ou plus est recommandé ; adaptez la configuration à votre environnement.

🐳 Configuration essentielle pour les charges de travail AI/data : Maîtriser la mémoire partagée Docker (shm_size et ipc)

Si vous avez déjà rencontré des erreurs inexpliquées comme OSError: No space left on device lors de l'exécution de charges de travail d'IA ou de traitement de données massives, cela est souvent dû à un manque de configuration de la mémoire partagée (shm_size) des conteneurs Docker.

Cet article clarifie pourquoi la mémoire partagée est cruciale dans un environnement conteneurisé et comment configurer correctement les options shm_size et ipc: host.

Image de comparaison des méthodes shm_size et ipc


1. Rôle et importance de shm_size

Rôle : Définition de la taille de la mémoire partagée du conteneur

shm_size est une option qui définit la taille maximale du système de fichiers /dev/shm (mémoire partagée POSIX) à l'intérieur du conteneur.

  • La valeur par défaut de Docker est de 64 Mo, ce qui est très faible.
  • Attention : /dev/shm est un tmpfs (système de fichiers temporaire) qui utilise la RAM de l'hôte, et n'a aucun rapport avec la VRAM (mémoire GPU).

Pourquoi est-ce important ?

Les tâches de traitement d'IA et de données exploitent cette mémoire partagée de manière cruciale pour échanger de grandes quantités de données entre processus.

  • PyTorch DataLoader : Lorsque num_workers > 0 est configuré, il transfère les tensors/batches entre les processus worker via la mémoire partagée. Si cet espace est insuffisant, une erreur OSError: No space left on device se produit.
  • Construction/service de moteurs TensorRT : Utilise intensivement la mémoire partagée pour les artefacts intermédiaires volumineux ou les tampons IPC. En cas d'insuffisance, cela peut entraîner un échec de construction du moteur ou une erreur de segmentation.
  • Multiprocessing et communication IPC : Essentiel pour le partage de grands tableaux/tampons entre processus dans des outils comme NCCL, OpenCV, NumPy.

2. Configuration IPC : Portée d'isolation de la mémoire partagée

Le namespace IPC (Inter-Process Communication) est une option Docker qui définit la portée d'isolation de l'espace de communication inter-processus (mémoire partagée, sémaphores, etc.) d'un conteneur.

Configuration IPC Mode de fonctionnement Détermination de la taille de /dev/shm
Par défaut (omis) Utilise le propre namespace IPC du conteneur (isolé) Taille spécifiée par shm_size (par défaut 64 Mo)
ipc: host Le conteneur partage le namespace IPC de l'hôte Taille de /dev/shm de l'hôte (généralement la moitié de la RAM)
ipc: container:<ID> Partage l'IPC avec un autre conteneur spécifié Suit la configuration du conteneur cible partagé

3. Principe de fonctionnement lors de l'utilisation simultanée de shm_size et ipc: host (analyse d'exemple)

Il est courant de configurer shm_size: "16g" et ipc: host simultanément pour les tâches d'IA/LLM. Voyons à travers un exemple concret quelle configuration est appliquée.

Test : Résultat de la vérification lors de l'utilisation de ipc: host

Nous avons configuré shm_size et ipc: host ensemble comme suit :

shm_size: "16g"
ipc: host

Puis, nous sommes entrés dans le conteneur pour vérifier la taille de /dev/shm.

~$df -h /dev/shm
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            60G  8.3M   60G   1% /dev/shm

Résultat observé : La taille affichée pour /dev/shm est de 60 Go, qui est la taille de l'hôte, et non les 16 Go configurés dans shm_size.

Conclusion : ipc: host ignore shm_size.

Pourquoi ce résultat ?

  1. Lorsque ipc: host est appliqué : Le conteneur utilise directement le namespace IPC de l'hôte.
  2. shm_size: "16g" est ignoré : Cette option n'a de sens que lorsque le conteneur utilise son propre namespace IPC.
  3. Origine des 60 Go : Les systèmes Linux hôtes configurent généralement /dev/shm par défaut à environ la moitié de la RAM totale. Ainsi, dans l'exemple ci-dessus, le conteneur voit 60 Go, soit la moitié des 120 Go de l'hôte.

Insistons à nouveau

Lorsque ipc: host est configuré, le conteneur utilise directement l'espace de mémoire partagée de l'hôte, et la configuration shm_size n'est donc pas réellement appliquée.


4. Choisissez la méthode de gestion de la mémoire adaptée à votre environnement et à vos objectifs

Prioriser la stabilité VS Isolation par conteneur

1. Priorité à la stabilité : Maintenir ipc: host

C'est la méthode la plus simple. Elle utilise directement les ressources RAM généreuses de l'hôte. Elle convient aux environnements mono-utilisateur/mono-projet où le partage des ressources entre plusieurs conteneurs ne pose pas de problème. L'utilisation de 50 % de l'hôte n'est qu'un maximum ; seule l'utilisation réelle occupe la RAM, donc si la mémoire n'est pas sous pression, il est plus pratique de laisser cette configuration.

  • Configuration : Maintenez uniquement ipc: host (bien que shm_size apparaisse souvent dans de nombreux exemples, il est inutile, alors supprimez-le sans hésitation).
  • Résultat : Utilise la taille généreuse de /dev/shm de l'hôte (par exemple : 60 Go).

2. Imposer une limite par conteneur : Supprimer ipc: host

À utiliser dans un environnement multi-tenant ou lorsque vous devez empêcher un conteneur spécifique d'occuper excessivement la RAM.

  • Configuration : Supprimez ipc: host + spécifiez shm_size: "8g" ou "16g".
  • Résultat : Un /dev/shm de 16 Go dédié au conteneur est créé.
  • Avantage : Lorsque plusieurs conteneurs sont en cours d'exécution, il est possible de limiter clairement l'utilisation maximale de la mémoire partagée pour chaque conteneur, protégeant ainsi la RAM de l'hôte et assurant l'isolation.

Remarque : Comment ajuster la taille de la mémoire partagée de l'hôte (lors de l'utilisation d'ipc:host)

Si vous souhaitez modifier la taille de /dev/shm de l'hôte tout en utilisant ipc: host, vous devez ajuster la configuration tmpfs.

  1. Modifier temporairement la taille (restauration au redémarrage) :
sudo mount -o remount,size=16G /dev/shm

S'applique immédiatement à tous les processus/conteneurs.

  1. Modifier la taille de manière permanente (modification de /etc/fstab) :
# Ajoutez/modifiez la ligne suivante dans le fichier /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0

Après avoir enregistré, redémarrez ou appliquez immédiatement avec la commande remount ci-dessus.