Удаленный рендеринг вне экрана

10

Моя исследовательская лаборатория недавно добавила сервер с мощной видеокартой NVIDIA, которую мы хотели бы использовать для научных вычислений. Поскольку это не рабочая станция, нам придется выполнять наши задания удаленно, через ssh-соединение. Большинство наших приложений требуют рендеринга opengl во внеэкранный буфер, а затем выполняют анализ изображения в CUDA.

Мое первоначальное исследование показало, что пересылка X11 - плохая идея, потому что рендеринг opengl будет происходить на клиентском компьютере (или, скорее, на сервере X11 - что за запутанное соглашение об именах!) И будет страдать от узких мест в сети при отправке наших массивных текстур. Нам никогда не понадобится отображать вывод, поэтому кажется, что перенаправление X11 не нужно, но Opengl нужно, чтобы для $ DISPLAY было установлено что-то допустимое, иначе наши приложения не будут работать. Я уверен, что существуют фермы, которые делают это, но как это сделать? Я думаю, что это, вероятно, простая проблема конфигурации X11, но я слишком незнаком с ней, чтобы знать, с чего начать.

Мы работаем на сервере Ubuntu 10.04 без установленного gdm, gnome и т. Д. Однако пакет xserver-xorg установлен.

redmoskito
источник
Я бы попробовал <code> x11vnc </ code>, но это вряд ли сработает
Hubert Kario

Ответы:

6

Прошло много времени с тех пор, как я задал этот вопрос, поэтому я решил упомянуть решение, которое мы в конечном итоге использовали.

Угон локального экрана X

В конце я просто запустил удаленные программы opengl на локальном экране X сервера. На этой машине работала версия сервера Ubuntu, и на нем не было установленного по умолчанию сервера xserver, поэтому мне пришлось настроить сервер x для запуска при запуске (я только что установил пакет Ubuntu-desktop для Ubuntu, убивая комара кувалдой), а затем дал мне доступ к экрану X, используя эти команды как root: "export DISPLAY =: 0.0; xhost + local:". Затем я могу зайти в машину по ssh, вызвать «export DISPLAY =: 0.0» и запустить мои программы opengl в обычном режиме. Любой, кто сидит за удаленной машиной, увидит всплывающее окно и увидит, как работает моя программа, но у нас нет подключенного монитора, так что это не проблема.

Важно использовать некоторую форму внеэкранного рендеринга, потому что чтение пикселей непосредственно из экранного цветового буфера может привести к получению ненужных данных, если окно будет скрыто другим окном. Поскольку вы не можете видеть экран X, трудно понять, произошло ли это. Внеэкранный рендеринг (например, объекты Framebuffer (fbo) или pbuffers) не имеют этой проблемы.

Взлом локального Xscreen сервера не является идеальным решением, поэтому я нашел несколько альтернативных вариантов:

Виртуальные кадровые буферы

Xvfb - это вариант, но он не работал для меня, потому что OpenGL не извлекал выгоду из аппаратного ускорения, а объекты кадрового буфера не поддерживались, что необходимо для совместимости CUDA с OpenGL. Тем не менее, это может быть работоспособным вариантом, когда захват локального экрана недопустим или когда пользователь не может получить привилегии xhost.

VirtualGL

С сайта VirtualGL:

VirtualGL - это пакет с открытым исходным кодом, который дает любому программному обеспечению для удаленного отображения Unix или Linux возможность запуска приложений OpenGL с полным аппаратным ускорением 3D.

Это именно то, что я хочу, и это выглядит очень многообещающе, но у меня не было времени, чтобы разобраться с новой библиотечной зависимостью, поэтому я не проверял ее. Я предполагаю, что это идеальное решение, когда я смогу его скомпилировать, установить и настроить. Это то, что VirtualBox и некоторые серверы VNC используют для поддержки аппаратного ускорения 3D.

redmoskito
источник
0

Вы можете запустить виртуальный фрейм-буфер vfb на машине, это как фиктивный X11. Мы использовали для запуска приложений, которые должны были открывать окно Xwindow, на которое мы никогда не смотрели, и просто устанавливали vfb и экспортировали $ DISPLAY на этот - что-то вроде экрана на клике HTH.

Крис
источник
2
Спасибо за совет! Я начал изучать xvfb, и похоже, что рендеринг не использует графическое оборудование, а рендеринг в виртуальную память. Кто-нибудь может подтвердить / опровергнуть это? Если это так, я думаю, что это решение не будет хорошим, потому что мы стремимся использовать преимущества нашей видеокарты.
Redmoskito