Краткое содержание:
1. shm_size — это временное пространство, использующее оперативную память (RAM).
2. При использовании ipc: host параметр shm_size становится бессмысленным, и контейнер использует 50% ресурсов хоста.
3. Часто встречаются примеры настроек моделей ИИ, где одновременно заданы ipc: host и shm_size. На самом деле, для лучшей читаемости достаточно настроить только один из них.
4. Для рабочих нагрузок ИИ рекомендуется минимум 8–16 ГБ или более, поэтому выбирайте настройки в соответствии с вашей средой.

🐳 Обязательная настройка для рабочих нагрузок ИИ/данных: Полное руководство по общей памяти Docker (shm_size и ipc)

Если вы сталкивались с необъяснимыми ошибками, такими как OSError: No space left on device, при работе с ИИ и большими объемами данных, скорее всего, это произошло из-за недостаточной настройки общей памяти (shm_size) контейнера Docker.

В этой статье мы подробно объясним, почему общая память так важна в контейнерной среде и как правильно настроить параметры shm_size и ipc: host.

Сравнение shm_size и метода ipc


1. Роль и значение shm_size

Роль: Определение размера общей памяти контейнера

shm_size — это опция, которая устанавливает максимальный размер файловой системы /dev/shm (POSIX shared memory) внутри контейнера.

  • Значение по умолчанию для Docker составляет всего 64 МБ, что очень мало.
  • Внимание: /dev/shm — это tmpfs (временная файловая система), использующая оперативную память хоста (RAM), и не имеет отношения к VRAM (памяти GPU).

Почему это важно?

Задачи обработки ИИ/данных активно используют общую память для обмена большими объемами данных между процессами.

  • PyTorch DataLoader: При num_workers > 0 рабочие процессы передают тензоры/пакеты через общую память. Если это пространство недостаточно, возникает ошибка OSError: No space left on device.
  • Сборка/обслуживание движка TensorRT: Активно использует общую память для больших промежуточных артефактов или IPC-буферов; при ее нехватке может произойти сбой сборки движка или ошибка сегментации.
  • Многопроцессорность и IPC-связь: Необходима для обмена большими массивами/буферами между процессами в таких библиотеках, как NCCL, OpenCV, NumPy.

2. Настройка IPC: Область изоляции общей памяти

IPC (Inter-Process Communication) namespace — это опция Docker, определяющая степень изоляции пространства межпроцессного взаимодействия (общей памяти, семафоров и т.д.) для процессов внутри контейнера.

Настройка IPC Принцип работы Определение размера /dev/shm
По умолчанию (пропущено) Использование собственного IPC-пространства имен контейнера (изоляция) Размер, указанный в shm_size (по умолчанию 64 МБ)
ipc: host Контейнер использует IPC-пространство имен хоста Размер /dev/shm хоста (обычно половина RAM)
ipc: container:<ID> Совместное использование IPC с другим указанным контейнером Следует настройкам целевого контейнера

3. Принцип работы shm_size и ipc: host при одновременном использовании (анализ примера)

В задачах ИИ/LLM часто встречаются случаи, когда shm_size: "16g" и ipc: host задаются одновременно. Давайте разберемся, какая настройка применяется в этом случае, на реальном примере.

Тест: Результаты проверки при использовании ipc: host

Мы настроили shm_size и ipc: host следующим образом:

shm_size: "16g"
ipc: host

Затем мы вошли в контейнер и проверили размер /dev/shm.

~$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. Выбирайте метод управления памятью в соответствии с вашей средой и целями

Стремление к стабильности VS изоляция по контейнерам

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)

Если вы используете ipc: host и хотите изменить размер /dev/shm на самом хосте, вам нужно изменить настройки tmpfs.

  1. Временное изменение размера (сбросится после перезагрузки):
sudo mount -o remount,size=16G /dev/shm

Применяется немедленно ко всем процессам/контейнерам.

  1. Постоянное изменение размера (редактирование /etc/fstab):
# Добавьте/измените следующую строку в файле /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0

Сохраните и перезагрузите систему, или примените немедленно с помощью команды remount выше.