Вопрос или проблема
Я пытаюсь запустить контейнерное приложение Unity в качестве симуляционной среды для агентов RL. Симуляция довольно требовательная, поэтому требует ускорения с помощью GPU. Это исключает использование Xvfb
, насколько я знаю. Более того, в конечном итоге я планирую развернуть контейнер на кластере (поэтому мне нужен docker-контейнер), поэтому я не могу полагаться на работающий X-сервер хоста. В основном, я хочу это, не создавая X-сервер на хосте.
Я могу запустить мое приложение так: xvfb-run -s "-screen 0 1024x768x24 +extension GLX +render -noreset" ./my_unity_application.x86_64 -batchmode
. Это дает мне всего около 5 кадров в секунду вместо 60, которые я получаю, когда запускаю его вне контейнера, потому что xvfb-run
использует программный растризатор LLVMpipe. Я пробовал VirtualGL (xvfb-run -s "-screen 0 1024x768x24 +extension GLX +render -noreset" vglrun -d ":99" ./my_unity_application.x86_64 -batchmode
), но это, похоже, не дает результата (по-прежнему используется растризатор llvmpipe).
Другие тупиковые ситуации:
- Установка
LIBGL_ALWAYS_INDIRECT=1
не сработает, потому что это ограничивает версию OpenGL до 1.4, что ниже версии, требуемой Unity (3.2) - Запуск X внутри docker. Работает с фиктивным драйвером из пакета
xserver-xorg-video-dummy
, но опять же возвращается к программной растеризации. - Wayland? Я также могу запустить приложение внутри контейнера с помощью
weston -B headless-backend.so --use-gl
. В Wayland, насколько я понимаю, приложения сами отвечают за вызовы рендеринга к библиотекам рендеринга, таким как OpenGL. Я установил libegl1-mesa и libegl1 в контейнер, но./my_unity_application.x86_64 -batchmode -logfile -
по-прежнему выводитRenderer: llvmpipe (LLVM 12.0.0, 256 bits)
. Xdummy
+vglrun
та же проблема (Renderer: llvmpipe (LLVM 12.0.0, 256 bits)
)
Итог: как мне запустить приложение Unity с рендерингом, ускоренным с помощью GPU, в контейнере docker, который не может полагаться на хост-сервер X?
Ответ или решение
Запуск headless-приложения Unity в Docker-контейнере с GPU-ускорением
Вы задаетесь целью запустить контейнеризированное приложение Unity для среды симуляции в области обучения с подкреплением (RL), при этом требуется GPU-ускорение, особенно в сценариях, где производительность критически важна. Однако, проблема в том, что вы не можете использовать традиционные методы, такие как Xvfb
, из-за их низкой производительности и использования программного рендеринга. В данном руководстве мы рассмотрим подходы к успешному запуску приложения Unity в Docker-контейнере с поддержкой аппаратного ускорения.
Подходы
-
Использование NVIDIA Docker:
Чтобы использовать GPU в Docker, важно установить специальную версию Docker от NVIDIA, известную как NVIDIA Docker. Это обеспечит правильную передачу GPU из хоста в контейнер. Убедитесь, что драйверы NVIDIA установлены на хостовой машине, и используйте следующий команды при запуске контейнера:docker run --gpus all --rm -it \ -v /path/to/your/unity/project:/app \ -w /app \ nvidia/cuda:11.0-base \ ./my_unity_application.x86_64 -batchmode
В этом примере мы указываем флаг
--gpus all
, чтобы предоставить всё доступное GPU для контейнера. -
Использование X Virtual Frame Buffer (Xvfb):
Хотя вы упомянули проxvfb-run
, он обычно не подходит для производительных приложений. Но в контексте эффективного использования GPU вы можете рассмотреть возможность настройки X-сервера внутри контейнера, который будет использовать аппаратное ускорение. Вам потребуется установить драйверы NVIDIA и запустить X-сервер на виртуальном дисплее:X :99 & export DISPLAY=:99 nvidia-settings -a `[gpu:0]/Coolbits=1`
Затем запустите ваше приложение Unity так:
./my_unity_application.x86_64 -batchmode
-
Виртуализация на основе Wayland (если поддерживается):
Если ваше приложение Unity поддерживает Wayland, вы могли бы попробовать использоватьweston
. Этот метод требует меньше накладных расходов, но может быть более сложным в установке. Попробуйте запустить Wayland с поддержкой OpenGL:weston --backend headless-backend.so --use-gl
Это должно позволить приложениям делать свои рендеринг-запросы напрямую к OpenGL.
-
Настройка двухстороннего рендеринга (двойной буфер):
Убедитесь, что ваша реализация эффективности рендеринга обработана с использованием двухстороннего метода рендеринга, подключенного к вашему GPU, для уменьшения задержек при рендеринге. -
Проверка прав доступа:
Убедитесь, что у вашего Docker-контейнера есть доступа к GPU и OPENGL, так как это может указывать на разрешения, запрещающие вашему приложению обращаться к аппаратным ресурсам.
Заключение
Запуск Unity-приложений с GPU-ускорением в Docker-контейнерах без X-сервера требует тщательно продуманных решений и возможного использования ресурсов на уровне хост-операционной системы. Выбор использования NVIDIA Docker, секреты настройки X или Wayland – это пути, которые могут помочь вам добиться желаемой производительности. Подобные методы, если они правильно настроены, могут воспроизводить результаты настольной версии приложения с высоким FPS и низкой задержкой, что критически важно для симуляций в области RL.