🐳 Configuración esencial para cargas de trabajo de IA/datos: Entendiendo a la perfección la memoria compartida de Docker (shm_size e ipc)



Si has experimentado errores desconocidos como OSError: No space left on device en cargas de trabajo de IA y procesamiento de datos a gran escala, generalmente esto se debe a una configuración insuficiente de la memoria compartida del contenedor de Docker (shm_size).

Esta publicación aclara por qué la memoria compartida es importante en un entorno de contenedores y cómo configurar correctamente shm_size y la opción ipc: host.


1. Función e importancia de shm_size

Función: determinar el tamaño de la memoria compartida del contenedor

shm_size es una opción que establece el tamaño máximo del sistema de archivos /dev/shm (memoria compartida POSIX) dentro del contenedor.

  • El valor predeterminado de Docker es 64MB, lo cual es muy pequeño.

  • Advertencia: /dev/shm utiliza la RAM del host y es un tmpfs (sistema de archivos temporal), siendo independiente de la VRAM (memoria GPU).

¿Por qué es importante?

Las tareas de procesamiento de IA/datos utilizan en gran medida esta memoria compartida al transferir grandes volúmenes de datos entre procesos.

  • PyTorch DataLoader: al configurar num_workers > 0, los procesos trabajadores transfieren tensores/lotes a través de la memoria compartida. Si este espacio es insuficiente, se genera el error OSError: No space left on device.

  • Construcción/servicio de motores TensorRT: utiliza grandes cantidades de memoria compartida para artefactos intermedios o buffers IPC, y si falta, puede fallar la construcción del motor o provocar fallos de segmentación.

  • Procesamiento múltiple y comunicación IPC: es esencial para compartir grandes arreglos/buffers entre procesos en NCCL, OpenCV, NumPy, entre otros.


2. Configuración de ipc: el ámbito de aislamiento de la memoria compartida



El namespace IPC (Inter-Process Communication) es una opción de Docker que define qué rango de espacio de comunicación (memoria compartida, semáforos, etc.) se debe aislar entre los procesos del contenedor.

Configuración de ipc Funcionamiento Determinación del tamaño de /dev/shm
Predeterminado (omitido) Contenedor utiliza su propio namespace IPC (aislado) El tamaño especificado por shm_size (valor predeterminado 64MB)
ipc: host El contenedor comparte el namespace IPC del host Tamaño de /dev/shm del host (generalmente la mitad de la RAM)
ipc: container:<ID> Comparte IPC con otro contenedor designado Siguiendo la configuración del contenedor compartido

3. Funcionamiento simultáneo de shm_size e ipc: host (análisis de ejemplo)

Comúnmente, en tareas de IA/LLM, se configuran shm_size: "16g" y ipc: host juntos. Vamos a examinar en un ejemplo real qué configuraciones se aplican.

Ejemplo: análisis de configuración y resultado

Fragmento de configuración de Docker Compose Resultados de la verificación de df -h /dev/shm dentro del contenedor
shm_size: "16g"
ipc: host
Sistema de archivos tmpfs Tamaño 60G
Usado 8.3M
Disponible 60G
Uso% 1%
Montado en /dev/shm

Conclusión: ipc: host ignora shm_size.

  1. Cuando se aplica ipc: host: el contenedor usa el namespace IPC del host.

  2. shm_size: "16g" es ignorado: esta opción solo tiene significado cuando se usa su propio namespace IPC.

  3. Origen de 60G: El sistema Linux del host generalmente establece /dev/shm en aproximadamente la mitad de toda la RAM. Por lo tanto, en el ejemplo anterior, el contenedor está viendo la mitad de los 120G del host, que son 60G.

Resumen clave

Al establecer ipc: host, el contenedor utiliza el espacio de memoria compartida del host, por lo que la configuración de shm_size no se aplica.


4. Métodos recomendados para operar y gestionar límites de memoria

💡 Opciones recomendadas en la práctica

  1. ✅ Prioridad en la estabilidad (recomendado): mantener ipc: host

    • Configuración: mantener solo ipc: host (o puedes dejarlo junto con shm_size)

    • Resultado: utilizas un tamaño amplio de /dev/shm del host (ej: 60G).

    • Ventaja: previene de manera fundamental el error de falta de memoria compartida en la mayoría de las tareas de IA/datos y es la más estable. 60G es solo un máximo, de modo que solo la cantidad real utilizada ocupa RAM, por lo que si no hay presión de memoria, es conveniente dejarlas tal como están.

  2. ✅ Imponer límites por contenedor: eliminar ipc: host

    • Configuración: ipc: host eliminar + especificar shm_size: "8g" o "16g"

    • Resultado: se genera un /dev/shm exclusivo de 16GB para el contenedor.

    • Ventaja: al ejecutar múltiples contenedores, puedes definir claramente el límite de uso de memoria compartida de cada contenedor, facilitando la protección y el aislamiento de la RAM del host.

⚙️ Cómo ajustar el tamaño de /dev/shm del host (opción 1 en uso)

Si deseas cambiar el tamaño de /dev/shm del host mientras utilizas ipc: host, debes ajustar la configuración de tmpfs.

  • Cambiar temporalmente el tamaño (revierte al reiniciar):
sudo mount -o remount,size=16G /dev/shm
(Se aplica inmediatamente a todos los procesos/contenedores.)
  • Cambiar permanentemente el tamaño (modificar /etc/fstab):
# Añade/modifica la siguiente línea en el archivo /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
Después de guardar, reinicia o aplica inmediatamente con el comando `remount` anterior.

¿Cuándo deberías ampliarlo? Debes ajustar shm_size o el tamaño de /dev/shm del host a un mínimo de 8G o más cuando hay muchos trabajadores de DataLoader o se produce intermitentemente el error No space left on device durante la construcción del motor TensorRT.