Безголовое автономное приложение Unity в контейнере Docker с поддержкой GPU (Репост с SO)

Вопрос или проблема

Я пытаюсь запустить контейнерное приложение 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-контейнере с поддержкой аппаратного ускорения.

Подходы

  1. Использование 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 для контейнера.

  2. Использование 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
  3. Виртуализация на основе Wayland (если поддерживается):
    Если ваше приложение Unity поддерживает Wayland, вы могли бы попробовать использовать weston. Этот метод требует меньше накладных расходов, но может быть более сложным в установке. Попробуйте запустить Wayland с поддержкой OpenGL:

    weston --backend headless-backend.so --use-gl

    Это должно позволить приложениям делать свои рендеринг-запросы напрямую к OpenGL.

  4. Настройка двухстороннего рендеринга (двойной буфер):
    Убедитесь, что ваша реализация эффективности рендеринга обработана с использованием двухстороннего метода рендеринга, подключенного к вашему GPU, для уменьшения задержек при рендеринге.

  5. Проверка прав доступа:
    Убедитесь, что у вашего Docker-контейнера есть доступа к GPU и OPENGL, так как это может указывать на разрешения, запрещающие вашему приложению обращаться к аппаратным ресурсам.

Заключение

Запуск Unity-приложений с GPU-ускорением в Docker-контейнерах без X-сервера требует тщательно продуманных решений и возможного использования ресурсов на уровне хост-операционной системы. Выбор использования NVIDIA Docker, секреты настройки X или Wayland – это пути, которые могут помочь вам добиться желаемой производительности. Подобные методы, если они правильно настроены, могут воспроизводить результаты настольной версии приложения с высоким FPS и низкой задержкой, что критически важно для симуляций в области RL.

Оцените материал
Добавить комментарий

Капча загружается...