En bref :
1.shm_sizeest un espace temporaire utilisant la RAM.
2. Avecipc: host,shm_sizedevient 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 souventipc: hostetshm_sizeconfiguré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.

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/shmest untmpfs(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 > 0est configuré, il transfère les tensors/batches entre les processus worker via la mémoire partagée. Si cet espace est insuffisant, une erreurOSError: No space left on devicese 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: hostignoreshm_size.
Pourquoi ce résultat ?
- Lorsque
ipc: hostest appliqué : Le conteneur utilise directement le namespace IPC de l'hôte. shm_size: "16g"est ignoré : Cette option n'a de sens que lorsque le conteneur utilise son propre namespace IPC.- Origine des 60 Go : Les systèmes Linux hôtes configurent généralement
/dev/shmpar 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: hostest configuré, le conteneur utilise directement l'espace de mémoire partagée de l'hôte, et la configurationshm_sizen'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 queshm_sizeapparaisse souvent dans de nombreux exemples, il est inutile, alors supprimez-le sans hésitation). - Résultat : Utilise la taille généreuse de
/dev/shmde 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écifiezshm_size: "8g"ou"16g". - Résultat : Un
/dev/shmde 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.
- Modifier temporairement la taille (restauration au redémarrage) :
sudo mount -o remount,size=16G /dev/shm
S'applique immédiatement à tous les processus/conteneurs.
- 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.
Aucun commentaire.