디스플레이 없이 OpenGL 및 X11 렌더링 하는 방법

배경

모니터가 없는 CI/CD 서버나 GPU 서버에 종종 다음과 같은 작업을 요청할 때가 있다.

  1. GUI 생성 코드를 빌드 및 런타임 테스트를 실행
  2. 모델 학습 후 인퍼런스 결과를 GUI로 띄워서 리모트 머신으로 X11 포워딩

이럴 때 마다 나타나는 문제가 있다.

CI/CD 서버나 GPU 서버에는 모니터가 없는 경우가 많다는 점이다.

GUI 코드는 대부분 내부에서 OpenGL 및 GLFW와 같은 OpenGL window handler 라이브러리를 사용하는데, X11 또는 Wayland가 없으면 동작하지 않는다.

그리고 X11 / Wayland의 경우, 시스템에 모니터 드라이버가 없는 경우 동작하지 않는다.

데스크탑에서는 이러한 문제를 발견하기 쉽지 않다. 실제로 모니터를 컴퓨터와 연결하지 않은 상태에서도 돌아가기 때문이다. 하지만 이는 X11 / Wayland가 설치되어있고, 모니터 드라이버를 발견했기 때문에 자동으로 offscreen rendering 모드로 전환했기 때문이다. OpenGL 및 GLFW 옵션에서도 hidden window를 만들어서 offscreen rendering을 지원한다. 하지만 모니터 드라이버가 없거나, X11 / Wayland가 없이는 hidden window를 생성조차 할 수 없기 때문에 아예 코드가 동작하지 않는다. (관련 링크 1, 2)

CI/CD 서버나 GPU 서버에는 X11 / Wayland가 안 깔려있는 경우도 많다. 이 경우, GUI 관련 코드는 전부 죽게 된다. 운 나쁘게 사용하려는 코드가 실행 극초반부터 GUI window를 만들고 실행하는 경우에는, 아무것도 돌리지 못하고 곧바로 죽어버릴 것이다.

 

해결 방법

xvfb는 가상 X11 프레임버퍼를 구현하며 X11와 같은 프로토콜을 가진다.

두개의 차이점이라면, xvfb는 실제로 아무런 디스플레이 아웃풋을 만들지 않기 때문에 ‘모니터가 없어도’, ‘X11이 없어도’ 동작한다는 점이다.

X11으로 연결될 수 있는 OpenGL 기능들을 xvfb로 라우팅을 시켜놓는다면, 실제로 코드는 모두 돌아가나 아무런 디스플레이 결과를 보지 않을 것이다.