🐳 AI/Data workload essentiële instellingen: Docker gedeeld geheugen (shm_size en ipc) volledig begrijpen



Als je onbekende fouten zoals OSError: No space left on device hebt ervaren bij AI- en grote data-verwerkingsworkloads, is dat meestal omdat de instelling van het gedeeld geheugen van de Docker-container (shm_size) ontoereikend is.

Deze post legt duidelijk uit waarom gedeeld geheugen belangrijk is in een containeromgeving en hoe je de shm_size en ipc: host opties correct kunt instellen.


1. De rol en het belang van shm_size

Rol: Bepalen van de grootte van het gedeelde geheugen van de container

shm_size is de optie om de maximale grootte van het /dev/shm (POSIX gedeeld geheugen) bestandssysteem binnen de container in te stellen.

  • De standaardwaarde van Docker is 64 MB, wat zeer klein is.

  • Let op: /dev/shm gebruikt host RAM als tmpfs (tijdelijk bestandssysteem) en is niet gerelateerd aan VRAM (GPU-geheugen).

Waarom is het belangrijk?

AI/data-verwerkingstaken maken essentieel gebruik van dit gedeeld geheugen bij het uitwisselen van grote hoeveelheden data tussen processen.

  • PyTorch DataLoader: Wanneer num_workers > 0 is ingesteld, worden tensors/batches via gedeeld geheugen tussen werkprocessen doorgegeven. Als deze ruimte tekortschiet, kan de OSError: No space left on device fout optreden.

  • TensorRT engine build/serving: Grote tussenliggende artefacten of IPC-buffers gebruiken veel gedeeld geheugen. Bij gebrek aan ruimte kunnen engine build-fouten of segmentatiefouten optreden.

  • Multiprocessing en IPC-communicatie: Essentieel voor het delen van grote arrays/buffers tussen processen in NCCL, OpenCV, NumPy, enz.


2. ipc-instellingen: Isolatiegraad van gedeeld geheugen



IPC (Inter-Process Communication) namespace is de Docker-optie die bepaalt hoe het communicatiegebied (gedeeld geheugen, semaforen, enz.) tussen de processen van de container geïsoleerd moet worden.

ipc-instelling Werking Bepaling van de grootte van /dev/shm
Standaard (vermist) Container gebruikt eigen IPC-namespaces (geïsoleerd) Grootte zoals bepaald door shm_size (standaardwaarde 64MB)
ipc: host Container deelt de IPC-namespace van de host Grootte van de /dev/shm van de host (meestal de helft van het RAM)
ipc: container:<ID> Deelt IPC met een andere gespecificeerde container Afhankelijk van de instelling van de te delen container

3. Werking van het gelijktijdig gebruik van shm_size en ipc: host (voorbeeldanalyse)

Bij AI/LLM-taken is het gebruikelijk om shm_size: "16g" en ipc: host samen in te stellen. We leren welke instellingen van toepassing zijn aan de hand van een praktisch voorbeeld.

Voorbeeld: Instellingen en resultaatanalyse

Docker Compose instellingssnipped Resultaat in de container voor df -h /dev/shm
shm_size: "16g"
ipc: host
Bestandssysteem tmpfs Grootte 60G
Gebruikt 8.3M
Beschikbaar 60G
Gebruik% 1%
Gemonteerd op /dev/shm

Conclusie: ipc: host negeert shm_size.

  1. Als ipc: host is ingesteld: De container gebruikt de IPC-namespace van de host.

  2. shm_size: "16g" wordt genegeerd: Deze optie is alleen relevant wanneer de eigen IPC-namespace wordt gebruikt.

  3. Bron van de 60G: Host Linux-systemen stellen /dev/shm vaak standaard in op ongeveer de helft van het totale RAM. Daarom ziet de container in het bovenstaande voorbeeld de helft van de 120G van de host, wat 60G is.

Kernsamenvatting

Wanneer ipc: host is ingesteld, gebruikt de container de gedeelde geheugenspatie van de host, waardoor de shm_size instelling feitelijk niet wordt toegepast.


4. Aanbevolen bedrijfspraktijken en geheugenlimieten beheren

💡 Praktische aanbevolen opties

  1. ✅ Stabiliteit voorop (aanbevolen): houd ipc: host aan

    • Instelling: Houd alleen ipc: host aan (of kan ook samen met shm_size worden ingesteld)

    • Resultaat: Maakt gebruik van de ruime grootte van /dev/shm van de host (bijv. 60G).

    • Voordeel: Voorkomt grondig de fouten van onvoldoende gedeeld geheugen bij de meeste AI/data-taken en is het meest stabiel. 60G is slechts de maximale waarde; alleen de werkelijke gebruiksgegevens bezetten RAM, dus als er geen geheugenbeperkingen zijn, is het prettig om het zo te laten.

  2. ✅ Dwing per container limiet af: verwijder ipc: host

    • Instelling: Verwijder ipc: host en specificeer shm_size: "8g" of "16g"

    • Resultaat: Er wordt een 16GB /dev/shm specifiek voor de container aangemaakt.

    • Voordeel: Helpt om de gebruikslimieten van gedeeld geheugen voor elke container gedurende het draaien van verschillende containers duidelijk te beperken, wat gunstig is voor de bescherming en isolatie van het RAM van de host.

⚙️ Hoe de grootte van de host /dev/shm aan te passen (bij optie 1 gebruik)

Als je de grootte van de host /dev/shm wilt wijzigen terwijl je ipc: host gebruikt, moet je de tmpfs instellingen aanpassen.

  • Tijdelijk de grootte wijzigen (herstart herstelt):
sudo mount -o remount,size=16G /dev/shm
(Wordt onmiddellijk toegepast op alle processen/containers.)
  • Permanente wijziging van de grootte (/etc/fstab aanpassen):
# Voeg de volgende regel toe/bewerk in /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
Sla op en herstart of gebruik bovenstaande `remount` opdracht om onmiddellijk toe te passen.

Wanneer moet je dit vergroten? Wanneer er veel DataLoader-werkers zijn of wanneer je sporadisch de No space left on device fout krijgt tijdens het bouwen van een TensorRT-engine, moet je de shm_size of de grootte van het host /dev/shm tot minimaal 8G of meer aanpassen.