> Resumen del artículo: > 1. `shm_size` es un espacio temporal que utiliza la RAM. > 2. Si se usa `ipc: host`, `shm_size` es irrelevante, y se asigna el 50% de los recursos del host. > 3. Es común ver configuraciones de modelos de IA donde `ipc: host` y `shm_size` se establecen simultáneamente, pero en realidad, configurar solo uno mejora la legibilidad. > 4. Para cargas de trabajo de IA, se recomienda un mínimo de **8G~16G** o más, por lo que debe configurarse según el entorno individual. ## 🐳 Configuración esencial para cargas de trabajo de IA/datos: Dominando la memoria compartida de Docker (shm_size e ipc) {#sec-2161daf65756} Si en sus cargas de trabajo de IA y procesamiento de grandes volúmenes de datos ha experimentado errores inesperados como `OSError: No space left on device`, esto suele deberse a una **configuración insuficiente de la memoria compartida (`shm_size`) en el contenedor [[Docker]]**. Este artículo explica claramente por qué la memoria compartida es crucial en entornos de contenedores y cómo configurar correctamente las opciones `shm_size` e `ipc: host`. ![Imagen comparativa de shm_size y el método ipc](/media/whitedec/blog_img/5c8cd9fb5f93404fb70bc6019e296acf.webp) --- ## 1. El rol y la importancia de shm_size {#sec-21161777e576} ### Rol: Determinación del tamaño de la memoria compartida del contenedor {#sec-5e3ff7cb88f8} **`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 de solo **64MB**, lo cual es muy pequeño. * **Advertencia**: `/dev/shm` es un **`tmpfs`** (sistema de archivos temporal) que utiliza la **RAM del host** y **no tiene relación con la VRAM (memoria de GPU)**. ### ¿Por qué es importante? {#sec-8127b7b9aeb4} Las tareas de procesamiento de IA y datos utilizan esta **memoria compartida** de forma crucial para intercambiar grandes volúmenes de datos entre procesos. * **PyTorch DataLoader**: Cuando se configura `num_workers > 0`, los procesos worker transfieren **tensores/batches a través de la memoria compartida**. Si este espacio es insuficiente, se produce el error `OSError: No space left on device`. * **Construcción/Servicio de motores TensorRT**: Utiliza la memoria compartida intensivamente para artefactos intermedios de gran tamaño o búferes IPC. Si es insuficiente, puede fallar la construcción del motor o producirse un error de segmentación. * **Multiprocesamiento y comunicación IPC**: Es esencial para compartir arrays/búferes grandes entre procesos en NCCL, OpenCV, NumPy, entre otros. --- ## 2. Configuración de ipc: Alcance del aislamiento de la memoria compartida {#sec-6d4d31fe3ee4} El **namespace de IPC (Inter-Process Communication)** es una opción de Docker que define el alcance del aislamiento del espacio de comunicación entre procesos (memoria compartida, semáforos, etc.) de un contenedor. | **Configuración de ipc** | **Modo de operación** | **Determinación del tamaño de /dev/shm** | | --- | --- | --- | | **Predeterminado (omitido)** | Utiliza el **namespace IPC propio** del contenedor (aislado) | 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:`** | Comparte IPC con otro contenedor especificado | Sigue la configuración del contenedor objetivo compartido | --- ## 3. Principio de funcionamiento al usar shm_size e ipc: host simultáneamente (Análisis de ejemplo) {#sec-77e6ca4c4b62} Es común configurar `shm_size: "16g"` y `ipc: host` juntos en tareas de IA/LLM. A continuación, analizaremos con un ejemplo real qué configuración se aplica en este caso. ### Prueba: Resultados al usar `ipc: host` {#sec-f473e8607f63} A continuación, configuramos `shm_size` e `ipc: host` juntos de la siguiente manera. ```yaml shm_size: "16g" ipc: host ``` Luego, accedimos al interior del contenedor para verificar el tamaño de /dev/shm. ```bash ~$df -h /dev/shm Filesystem Size Used Avail Use% Mounted on tmpfs 60G 8.3M 60G 1% /dev/shm ``` **Resultado de la observación**: En lugar de los 16GB configurados en shm_size, se muestra el tamaño de /dev/shm del host, que es 60GB. > **Conclusión: `ipc: host` ignora a `shm_size`.** **¿Por qué este resultado?** 1. **Cuando se aplica `ipc: host`:** El contenedor utiliza directamente el **namespace IPC del host**. 2. **`shm_size: "16g"` es ignorado:** Esta opción solo tiene sentido cuando se utiliza un **namespace IPC propio**. 3. **Origen de los 60G:** Los sistemas Linux host suelen configurar `/dev/shm` por defecto en aproximadamente la **mitad de la RAM total**. Por lo tanto, en el ejemplo anterior, el contenedor está viendo los 60G, que son la mitad de los 120G del host. **Enfatizamos una vez más** > **Si se configura `ipc: host`, el contenedor utiliza directamente el espacio de memoria compartida del host, por lo que la configuración de `shm_size` no se aplica en la práctica.** --- ## 4. Elija el método de gestión de memoria que se adapte a su entorno y propósito {#sec-d62a63904765} ### Priorizar la estabilidad VS Aislamiento por contenedor {#sec-870976b9ffe0} #### 1. Prioridad a la estabilidad: Mantener `ipc: host` Este es el método más sencillo. Utiliza directamente los abundantes recursos de RAM del host. Es adecuado para entornos de un solo usuario/un solo proyecto donde múltiples contenedores pueden compartir recursos sin problemas. El **uso del 50% del host es solo un máximo; solo la cantidad realmente utilizada ocupa la RAM**, por lo que si no hay presión de memoria, es más cómodo dejarlo así. * **Configuración**: Mantener solo `ipc: host` (aunque `shm_size` aparece en muchos ejemplos, es irrelevante, así que podemos eliminarlo sin dudarlo). * **Resultado**: Se utiliza el generoso tamaño de `/dev/shm` del host (ej: 60G). #### 2. Imponer un límite por contenedor: Eliminar `ipc: host` Se utiliza en entornos multi-tenant o cuando se necesita evitar que un contenedor específico ocupe excesivamente la RAM. * **Configuración**: **Eliminar** `ipc: host` + especificar `shm_size: "8g"` o `"16g"`. * **Resultado**: Se crea un `/dev/shm` de 16GB exclusivo para el contenedor. * **Ventaja**: Cuando se ejecutan varios contenedores, permite limitar claramente el **uso máximo de memoria compartida de cada contenedor**, protegiendo y aislando la RAM del host. ### Nota: Cómo ajustar el tamaño de la memoria compartida del host (cuando se usa ipc:host) {#sec-5e365d4f36e8} Si desea cambiar el tamaño de `/dev/shm` del host mientras usa `ipc: host`, debe modificar la configuración de `tmpfs`. 1. **Cambiar el tamaño temporalmente (se revierte al reiniciar):** ``` sudo mount -o remount,size=16G /dev/shm ``` Se aplica inmediatamente a todos los procesos/contenedores. 2. **Cambiar el tamaño permanentemente (modificar `/etc/fstab`):** ``` # Añadir/modificar la siguiente línea en el archivo /etc/fstab tmpfs /dev/shm tmpfs defaults,size=16G 0 0 ``` Guarde y reinicie, o aplique inmediatamente con el comando `remount` anterior.