Краткое содержание:
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.

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.
Почему такой результат??
- При применении
ipc: host: Контейнер использует IPC-пространство имен хоста без изменений. shm_size: "16g"игнорируется: Эта опция имеет смысл только при использовании собственного IPC-пространства имен контейнера.- Источник 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.
- Временное изменение размера (сбросится после перезагрузки):
sudo mount -o remount,size=16G /dev/shm
Применяется немедленно ко всем процессам/контейнерам.
- Постоянное изменение размера (редактирование
/etc/fstab):
# Добавьте/измените следующую строку в файле /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
Сохраните и перезагрузите систему, или примените немедленно с помощью команды remount выше.