🐳 AI/Daten-Workload essentielle Einstellung: Docker Shared Memory (shm_size und ipc) Vollständig Verstehen
Wenn Sie in AI- und Big-Data-Processing-Workloads Fehler wie OSError: No space left on device erlebt haben, liegt dies meist daran, dass die Konfiguration des Shared Memory (shm_size) des Docker-Containers unzureichend ist.
Dieser Beitrag erläutert klar, warum Shared Memory in der Container-Umgebung wichtig ist und wie man shm_size und die Option ipc: host korrekt konfiguriert.
1. Die Rolle und Bedeutung von shm_size
Rolle: Bestimmung der Shared Memory-Größe des Containers
shm_size ist eine Option, um die maximale Größe des /dev/shm (POSIX Shared Memory) Dateisystems im Container festzulegen.
-
Der Standardwert von Docker beträgt 64MB, was sehr gering ist.
-
Hinweis:
/dev/shmverwendet den RAM des Hosts alstmpfs(temporäres Dateisystem) und hat keinen Bezug zu VRAM (GPU-Speicher).
Warum ist es wichtig?
AI/Datenverarbeitungsprozesse nutzen stark Shared Memory, wenn sie große Datenmengen zwischen Prozessen austauschen.
-
PyTorch DataLoader: Wenn
num_workers > 0eingestellt ist, werden Tensoren/Batches über Shared Memory zwischen Worker-Prozessen übertragen. Wenn dieser Speicher nicht ausreicht, tritt der FehlerOSError: No space left on deviceauf. -
TensorRT-Engine-Bau/Bereitstellung: Hier wird viel Shared Memory für große Zwischenartefakte oder IPC-Puffer verwendet, was zu einem Scheitern des Engine-Baus oder zu Segmentfehlern führen kann, wenn es nicht ausreicht.
-
Multiprocessing und IPC-Kommunikation: Ist entscheidend für das Teilen großer Arrays/Puffer zwischen Prozessen in NCCL, OpenCV, NumPy usw.
2. ipc-Einstellungen: Der Isolationsbereich des Shared Memory
IPC (Inter-Process Communication) namespace ist eine Docker-Option, die festlegt, in welchem Bereich der Kommunikationsraum (Shared Memory, Semaphore usw.) zwischen den Prozessen im Container isoliert wird.
| ipc-Einstellung | Funktionsweise | Bestimmung der Größe von /dev/shm |
|---|---|---|
| Standard (weggelassen) | Verwendung des eigenen IPC-Namensraums des Containers (Isolierung) | Von shm_size angegebene Größe (Standardwert 64MB) |
ipc: host |
Der Container teilt den IPC-Namensraum des Hosts | Größe von /dev/shm des Hosts (normalerweise die Hälfte des RAMs) |
ipc: container:<ID> |
Teilt den IPC mit einem anderen angegebenen Container | entsprechend den Einstellungen des geteilten Containers |
3. Funktionsweise bei gleichzeitiger Verwendung von shm_size und ipc: host (Beispielanalyse)
In der Regel werden bei AI/LLM-Aufgaben oft shm_size: "16g" und ipc: host gemeinsam eingestellt. Lassen Sie uns anhand eines praktischen Beispiels untersuchen, welche Einstellungen dann angewendet werden.
Beispiel: Einstellungen und Ergebnisanalyse
| Snippet der Docker Compose-Einstellungen | Ergebnis der Prüfung von df -h /dev/shm im Container |
|---|---|
| shm_size: "16g" ipc: host |
Dateisystem tmpfs Größe 60G Verwendet 8.3M Verfügbar 60G Verwendungs% 1% Gemountet auf /dev/shm |
Fazit: ipc: host ignoriert shm_size.
-
Wenn
ipc: hostaktiv ist: verwendete der Container den IPC-Namensraum des Hosts. -
shm_size: "16g"wird ignoriert: Diese Option ist nur relevant, wenn der eigene IPC-Namensraum verwendet wird. -
Quelle der 60G: Hosts mit Linux-Systemen sind oft so konfiguriert, dass
/dev/shmauf ungefähr die Hälfte des gesamten RAMs gesetzt wird. Daher sieht der Container in diesem Beispiel 60G von den halben 120G des Hosts.
Kernzusammenfassung
Die Einstellung
ipc: hostbedeutet, dass der Container den Shared Memory-Raum des Hosts nutzt, sodass die Einstellungshm_sizetatsächlich nicht angewendet wird.
4. Empfohlene Betriebspraktiken und Speicherbegrenzung
💡 Praktische empfohlene Optionen
-
✅ Stabilität zuerst (Empfohlen):
ipc: hostbeibehalten-
Einstellung:
ipc: hostbeibehalten (oder zusammen mitshm_sizeverwenden) -
Ergebnis: Verwendung von großzügigem
/dev/shmdes Hosts (z.B.: 60G). -
Vorteil: Vermeidung von Shared Memory-Fehlern in den meisten AI/Datenarbeiten und ist am stabilsten. 60G ist lediglich der Maximalwert, tatsächlich wird nur der verwendete Speicher RAM beansprucht, daher ist es am bequemsten, es so zu belassen, solange kein Speicherdruck besteht.
-
-
✅ Begrenzung für Container erzwingen:
ipc: hostentfernen-
Einstellung:
ipc: hostentfernen +shm_size: "8g"oder"16g"festlegen -
Ergebnis: Es wird ein 16GB
/dev/shmfür den Container erstellt. -
Vorteil: Wenn mehrere Container laufen, lässt sich die Speicherobergrenze für die Shared Memory-Nutzung jedes Containers klar begrenzen, was den Schutz des RAMs des Hosts und die Isolierung verbessert.
-
⚙️ So ändern Sie die Größe von /dev/shm des Hosts (während Option 1 verwendet wird)
Wenn Sie ipc: host verwenden und die Größe von /dev/shm des Hosts selbst ändern möchten, müssen Sie die tmpfs-Einstellungen ändern.
- Temporäre Größenänderung (wird beim Neustart zurückgesetzt):
sudo mount -o remount,size=16G /dev/shm
(wird sofort auf alle Prozesse/Container angewendet.)
- Permanente Größenänderung (Änderung von
/etc/fstab):
# Fügen Sie die folgende Zeile zu /etc/fstab hinzu/ändern
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
Nach dem Speichern neu starten oder den oben genannten `remount`-Befehl sofort anwenden.
Wann sollte man es erhöhen? Wenn viele DataLoader-Worker aktiv sind oder beim Bau von TensorRT-Engines gelegentlich
No space left on deviceFehler auftreten, mussshm_sizeoder die Größe des Hosts/dev/shmmindestens auf 8G oder mehr eingestellt werden.
Es sind keine Kommentare vorhanden.