> Краткое содержание: > 1. `shm_size` — это временное пространство, использующее оперативную память (RAM). > 2. При использовании `ipc: host` параметр `shm_size` становится бессмысленным, и контейнер использует 50% ресурсов хоста. > 3. Часто встречаются примеры настроек моделей ИИ, где одновременно заданы `ipc: host` и `shm_size`. На самом деле, для лучшей читаемости достаточно настроить только один из них. > 4. Для рабочих нагрузок ИИ рекомендуется минимум **8–16 ГБ** или более, поэтому выбирайте настройки в соответствии с вашей средой. ## 🐳 Обязательная настройка для рабочих нагрузок ИИ/данных: Полное руководство по общей памяти Docker (shm_size и ipc) {#sec-2161daf65756} Если вы сталкивались с необъяснимыми ошибками, такими как `OSError: No space left on device`, при работе с ИИ и большими объемами данных, скорее всего, это произошло из-за **недостаточной настройки общей памяти (`shm_size`) контейнера [[Docker]]**. В этой статье мы подробно объясним, почему общая память так важна в контейнерной среде и как правильно настроить параметры `shm_size` и `ipc: host`. ![Сравнение shm_size и метода ipc](/media/whitedec/blog_img/5c8cd9fb5f93404fb70bc6019e296acf.webp) --- ## 1. Роль и значение shm_size {#sec-21161777e576} ### Роль: Определение размера общей памяти контейнера {#sec-5e3ff7cb88f8} **`shm_size`** — это опция, которая устанавливает **максимальный размер** файловой системы **/dev/shm (POSIX shared memory)** внутри контейнера. * Значение по умолчанию для [[Docker]] составляет всего **64 МБ**, что очень мало. * **Внимание**: `/dev/shm` — это **`tmpfs`** (временная файловая система), использующая **оперативную память хоста (RAM)**, и **не имеет отношения к VRAM (памяти GPU)**. ### Почему это важно? {#sec-8127b7b9aeb4} Задачи обработки ИИ/данных активно используют **общую память** для обмена большими объемами данных между процессами. * **PyTorch DataLoader**: При `num_workers > 0` рабочие процессы **передают тензоры/пакеты через общую память**. Если это пространство недостаточно, возникает ошибка `OSError: No space left on device`. * **Сборка/обслуживание движка TensorRT**: Активно использует общую память для больших промежуточных артефактов или IPC-буферов; при ее нехватке может произойти сбой сборки движка или ошибка сегментации. * **Многопроцессорность и IPC-связь**: Необходима для обмена большими массивами/буферами между процессами в таких библиотеках, как NCCL, OpenCV, NumPy. --- ## 2. Настройка IPC: Область изоляции общей памяти {#sec-6d4d31fe3ee4} **IPC (Inter-Process Communication) namespace** — это опция Docker, определяющая степень изоляции пространства межпроцессного взаимодействия (общей памяти, семафоров и т.д.) для процессов внутри контейнера. | **Настройка IPC** | **Принцип работы** | **Определение размера /dev/shm** | | --- | --- | --- | | **По умолчанию (пропущено)** | Использование **собственного IPC-пространства имен** контейнера (изоляция) | Размер, указанный в `shm_size` (по умолчанию **64 МБ**) | | **`ipc: host`** | Контейнер **использует IPC-пространство имен хоста** | **Размер `/dev/shm` хоста** (обычно половина RAM) | | **`ipc: container:`** | Совместное использование IPC с другим указанным контейнером | Следует настройкам целевого контейнера | --- ## 3. Принцип работы shm_size и ipc: host при одновременном использовании (анализ примера) {#sec-77e6ca4c4b62} В задачах ИИ/LLM часто встречаются случаи, когда `shm_size: "16g"` и `ipc: host` задаются одновременно. Давайте разберемся, какая настройка применяется в этом случае, на реальном примере. ### Тест: Результаты проверки при использовании `ipc: host` {#sec-f473e8607f63} Мы настроили `shm_size` и `ipc: host` следующим образом: ```yaml shm_size: "16g" ipc: host ``` Затем мы вошли в контейнер и проверили размер /dev/shm. ```bash ~$df -h /dev/shm Filesystem Size Used Avail Use% Mounted on tmpfs 60G 8.3M 60G 1% /dev/shm ``` **Результат наблюдения** : Отображается 60 ГБ, что соответствует размеру /dev/shm хоста, а не 16 ГБ, установленным в shm_size. > **Вывод: `ipc: host` игнорирует `shm_size`.** **Почему такой результат??** 1. **При применении `ipc: host`:** Контейнер использует **IPC-пространство имен хоста** без изменений. 2. **`shm_size: "16g"` игнорируется:** Эта опция имеет смысл только при использовании **собственного IPC-пространства имен** контейнера. 3. **Источник 60 ГБ:** В системах Linux хоста `/dev/shm` по умолчанию часто устанавливается в размере **половины от общего объема RAM**. Таким образом, в приведенном примере контейнер видит 60 ГБ, что составляет половину от 120 ГБ хоста. **Еще раз подчеркнем** > **Если вы устанавливаете `ipc: host`, контейнер использует пространство общей памяти хоста, поэтому настройка `shm_size` фактически не применяется.** --- ## 4. Выбирайте метод управления памятью в соответствии с вашей средой и целями {#sec-d62a63904765} ### Стремление к стабильности VS изоляция по контейнерам {#sec-870976b9ffe0} #### 1. Приоритет стабильности: Сохранение `ipc: host` Это самый простой подход. Контейнер напрямую использует обширные ресурсы RAM хоста. Подходит для сред с одним пользователем/одним проектом, где совместное использование ресурсов несколькими контейнерами не вызывает проблем. **Использование 50% ресурсов хоста — это лишь максимальный предел; фактически, RAM занимает только реальное потребление**, поэтому, если нет дефицита памяти, удобнее оставить все как есть. * **Настройка**: Сохранить только `ipc: host` (хотя во многих примерах `shm_size` указывается вместе, это бессмысленно, поэтому смело удаляйте shm_size). * **Результат**: Используется большой объем `/dev/shm` хоста (например, 60 ГБ). #### 2. Принудительное ограничение для каждого контейнера: Удаление `ipc: host` Используется в многопользовательских средах или когда необходимо предотвратить чрезмерное потребление RAM определенным контейнером. * **Настройка**: **Удалить** `ipc: host` + явно указать `shm_size: "8g"` или `"16g"`. * **Результат**: Создается выделенное для контейнера пространство 16 ГБ `/dev/shm`. * **Преимущества**: При работе нескольких контейнеров можно четко **ограничить верхний предел использования общей памяти для каждого контейнера**, обеспечивая защиту и изоляцию RAM хоста. ### Примечание: Как изменить размер общей памяти хоста (при использовании ipc:host) {#sec-5e365d4f36e8} Если вы используете `ipc: host` и хотите изменить размер `/dev/shm` на самом хосте, вам нужно изменить настройки `tmpfs`. 1. **Временное изменение размера (сбросится после перезагрузки):** ``` sudo mount -o remount,size=16G /dev/shm ``` Применяется немедленно ко всем процессам/контейнерам. 2. **Постоянное изменение размера (редактирование `/etc/fstab`):** ``` # Добавьте/измените следующую строку в файле /etc/fstab tmpfs /dev/shm tmpfs defaults,size=16G 0 0 ``` Сохраните и перезагрузите систему, или примените немедленно с помощью команды `remount` выше.