AI/Computer Vision

[CV] Xvfb 설정 nvidia-smi랑 연결, error, OpenGL 사용법 /pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

도도걸만단 2025. 1. 30. 05:11
반응형

pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

에러 해결 작성

 

Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99
glxinfo | grep "OpenGL renderer"

 

에러나시는분들 openGL 잘 안되는 분들 끝까지 보세유

이렇게떠야 잘 연결 된 . 것임 ㅠㅠ

(tmpi) ㅇㅇㅇ$  glxinfo | grep OpenGL
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA L4/PCIe/SSE2
OpenGL core profile version string: 4.6.0 NVIDIA 550.90.07
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 4.6.0 NVIDIA 550.90.07
OpenGL shading language version string: 4.60 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 550.90.07
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

Xvfb :99 -screen 0 1024x768x24 &와 export DISPLAY=:99

Xvfb(가상 프레임버퍼)를 설정하여 디스플레이 환경이 없는 서버에서도 OpenGL을 사용할 수 있도록 하는 명령어.

1. Xvfb란?

Xvfb는 “X Virtual Framebuffer”의 약자로, 가상 디스플레이 환경을 제공하는 X 서버입니다.

• 물리적 디스플레이(모니터)가 없는 환경에서도 OpenGL이나 GUI 프로그램을 실행할 수 있게 해줍니다.

• 원격 서버나 CLI 기반 환경에서 OpenGL이 디스플레이 환경을 요구할 때 사용하는 도구입니다.

2. 명령어의 구성

(1) Xvfb :99 -screen 0 1024x768x24 &

  • • Xvfb를 실행하고 가상 디스플레이를 설정합니다.
  • • :99: 디스플레이 번호를 99번으로 지정합니다. (기본적으로 X 서버는 디스플레이 번호를 사용합니다.)
  • • -screen 0 1024x768x24: 가상 디스플레이 크기와 색상 깊이를 설정합니다.
  • • 0: 화면 번호.
  • • 1024x768: 디스플레이 해상도.
  • • 24: 색상 깊이(24비트).
  • • &: 명령어를 백그라운드에서 실행합니다.

(2) export DISPLAY=:99

  • • 디스플레이 환경 변수(DISPLAY)를 설정합니다.
  • • :99: Xvfb로 설정한 가상 디스플레이 번호와 동일하게 지정합니다.
  • • 이후 실행되는 모든 프로그램은 :99 디스플레이를 사용합니다.

3. 왜 필요한가?

  • • OpenGL은 기본적으로 디스플레이 환경이 필요합니다.
  • • 디스플레이 환경이 없는 서버에서는 glxinfo나 TMPI와 같은 OpenGL 기반 프로그램이 작동하지 않습니다.
  • • Xvfb를 사용하면 가상의 디스플레이를 생성하여 이러한 문제를 해결할 수 있습니다.

4. 실행 

  • Xvfb를 실행: Xvfb :99 -screen 0 1024x768x24 &
  • 환경 변수 설정: export DISPLAY=:99
  • OpenGL 확인: glxinfo | grep OpenGL

 

  • :99 대신 다른 번호를 사용할 수도 있지만, 다른 프로세스와 충돌하지 않도록 주의하세요.
  • 가상 디스플레이는 서버를 종료하거나 Xvfb를 종료하면 사라집니다. 필요할 때마다 다시 실행해야 합니다.

 

glxinfo | grep OpenGL 명령에서 Error: unable to open display 오류가 발생한 이유는 현재 서버에 디스플레이 환경이 설정되지 않았기 때문입니다. 이 문제는 GUI 디스플레이가 없는 CLI 기반 서버(예: 원격 SSH 서버)에서 자주 발생합니다.

OpenGL이 제대로 작동하려면 디스플레이 환경을 설정하거나, **가상 디스플레이(Xvfb)**를 사용해야 합니다.

 

해결 방법: Xvfb로 가상 디스플레이 설정

  • Xvfb 설치

sudo apt install -y xvfb

  • Xvfb 가상 디스플레이 실행

Xvfb를 백그라운드에서 실행.

Xvfb :99 -screen 0 1024x768x24 &

export DISPLAY=:99

  • OpenGL 확인

이제 다시 glxinfo 명령을 실행하여 OpenGL 정보를 확인 :

glxinfo | grep OpenGL

정상 출력 예:

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce GTX ...
OpenGL version string: 4.6.0 NVIDIA ...

 

참고: Xvfb 상태 확인 및 중지

상태 확인

ps aux | grep Xvfb

Xvfb 중지

pkill Xvfb

 

✅ Xvfb 재시작

Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99

Xvfb 프로세스 종료 후 재시작

sudo killall Xvfb && Xvfb :99 -screen 0 1024x768x24 & export DISPLAY=:99

📌 Xvfb 실행 오류 해결 (Server is already active for display 99)

현재 Xvfb가 이미 실행 중인데도 다시 실행하려고 해서 충돌이 발생하고 있습니다.

즉, 기존 Xvfb 프로세스가 완전히 종료되지 않았거나, 락 파일이 남아 있는 상태입니다.

 

✅ 1. 실행 중인 Xvfb 프로세스 확인

먼저 Xvfb가 현재 실행 중인지 확인하세요.

ps aux | grep Xvfb

✔ 실행 중인 Xvfb 프로세스가 있다면, 해당 PID를 확인하고 종료해야 합니다.

 

✅ 2. 기존 Xvfb 프로세스 강제 종료

sudo killall Xvfb

또는 특정 PID를 직접 종료:

sudo kill -9 <PID>

📌 <PID> 부분에 ps aux | grep Xvfb 명령어에서 찾은 Xvfb의 프로세스 ID를 입력하세요.

 

✅ 3. Xvfb 락 파일 제거

sudo rm -f /tmp/.X99-lock

📌 Xvfb가 비정상적으로 종료되었을 경우, /tmp/.X99-lock 파일이 남아 있어 충돌이 발생합니다.

📌 위 명령어로 해당 락 파일을 삭제하세요.

 

✅ 4. Xvfb 재실행

위 과정을 완료한 후, Xvfb를 다시 실행하세요.

Xvfb :99 -screen 0 1024x768x24 &

export DISPLAY=:99

📌 명령어 입력 시 주의할 점

✔ Xvfb :99 -screen 0 1024x768x24 & → 백그라운드에서 실행

✔ export DISPLAY=:99 → 환경 변수 설정

절대 Xvfb 실행과 export DISPLAY=:99를 한 줄로 입력하지 마세요.

 

✅ 5. OpenGL 테스트 (정상 작동 확인)

이제 OpenGL이 정상적으로 실행되는지 확인하세요.

glxinfo | grep OpenGL

📌 정상적인 결과가 출력되면 OpenGL 환경이 올바르게 설정된 것입니다.

 

✅ 6. TMPI 실행

python ./run.py --indir=/ㅁㅁㅁㅁ --outdir=/ㅁㅁㅁㅁ

 

🚀 최종 정리

해결 방법 명령어

Xvfb 프로세스 확인 `ps aux

Xvfb 강제 종료 sudo killall Xvfb 또는 sudo kill -9 <PID>

Xvfb 락 파일 삭제 sudo rm -f /tmp/.X99-lock

Xvfb 재실행 Xvfb :99 -screen 0 1024x768x24 & export DISPLAY=:99

OpenGL 확인 `glxinfo

TMPI 실행 python ./run.py --indir=/ㅁㅁㅁㅁ --outdir=/ㅁㅁㅁㅁ

 

💡 가장 빠른 해결법 (한 번에 실행)

sudo killall Xvfb

sudo rm -f /tmp/.X99-lock

Xvfb :99 -screen 0 1024x768x24 &

export DISPLAY=:99

 

✅ 1. DISPLAY 환경 변수 설정

현재 Xvfb가 정상적으로 실행 중이므로, 환경 변수를 설정하세요.

export DISPLAY=:99

✅ 2. OpenGL 작동 확인

이제 OpenGL이 정상적으로 작동하는지 확인하세요.

glxinfo | grep OpenGL

✔ OpenGL renderer string 등의 정보가 출력되면 정상적으로 작동하는 것입니다.

단계 명령어

환경 변수 설정 export DISPLAY=:99

OpenGL 확인 `glxinfo


📌 DISPLAY=:99와 DISPLAY=:0의 차이 및 해결 방법

 

1️⃣ DISPLAY란?

 

DISPLAY 환경 변수는 X 서버(Xorg 또는 Xvfb 등)가 실행 중인 디스플레이 번호를 나타냅니다.

  • • DISPLAY=:0
  • • 물리적인 GPU가 있는 시스템에서 실제 모니터에 연결된 디스플레이
  • • GUI 데스크톱 환경(예: GNOME, KDE 등)에서 기본적으로 사용됨.
  • • DISPLAY=:99
  • • Xvfb(X Virtual Frame Buffer) 가상 디스플레이 서버가 사용하는 디스플레이
  • • 물리적인 모니터 없이 OpenGL을 사용해야 할 때(서버 환경 등) 사용됨.

 

2️⃣ DISPLAY=:0에서 “unable to open display” 오류 발생 원인

 

Error: unable to open display :0

 

📌 이 오류가 발생하는 이유는 다음과 같습니다:

  • • 현재 Xorg 또는 물리적인 디스플레이가 실행되고 있지 않음.
  • • 원격 SSH 세션에서 실행 중이라면 기본적으로 DISPLAY=:0을 사용할 수 없음.
  • • GUI(데스크톱) 환경이 없거나, GPU에 직접 접근하지 못함.

즉, DISPLAY=:0GUI 환경에서만 사용 가능합니다.

만약 서버 환경이거나 SSH로 접근 중이라면 Xvfb 같은 가상 디스플레이를 사용해야 합니다.


📌  CPU로 돌아감 OpenGL renderer string: llvmpipe (LLVM 11.0.1, 256 bits) GPU 연결안됨

OpenGL renderer string: llvmpipe (LLVM 11.0.1, 256 bits)

 

nvidia-smi 출력 결과를 보면 GPU와 NVIDIA 드라이버가 제대로 설치되어 있습니다. 또한, 현재 CUDA 12.4 버전이 활성화되어 있고, 약 7GB의 GPU 메모리를 사용하는 프로세스가 실행 중입니다. 그러나 OpenGL 관련 작업이 제대로 GPU 가속을 활용하지 못하고 있습니다.

 

현재 상황에서 문제가 발생하는 이유는 OpenGL이 NVIDIA 드라이버와 연결되지 않고, 기본 **Mesa/llvmpipe(소프트웨어 렌더러)**를 사용하고 있기 때문입니다.

 

해결 방법: OpenGL을 NVIDIA GPU와 연결

 

1. 현재 OpenGL 라이브러리 확인

 

현재 시스템에서 사용하는 OpenGL 라이브러리를 확인

출력에서 Mesa와 관련된 라이브러리(libGL.so)가 나올 경우, NVIDIA의 OpenGL 라이브러리로 전환이 필요

ldd $(which glxinfo) | grep -i gl

 

 

2. NVIDIA OpenGL 라이브러리 설치 및 설정

1. NVIDIA의 OpenGL 라이브러리를 설치:

sudo apt install -y libgl1-nvidia-glvnd-glx

 

2. 라이브러리 경로를 NVIDIA로 전환:

sudo ldconfig
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

 

3. 환경 변수를 추가하여 NVIDIA의 OpenGL을 기본으로 설정:

 

export __GLX_VENDOR_LIBRARY_NAME=nvidia

 

3. OpenGL 연결 확인

 

다시 OpenGL 정보를 확인합니다:

 

glxinfo | grep OpenGL

 

출력에서 OpenGL vendor string: NVIDIA Corporation으로 표시되면, NVIDIA GPU와 OpenGL이 연결된 것입니다.

 

4. Xvfb와 함께 OpenGL 실행

 

가상 디스플레이를 설정한 상태에서 TMPI를 실행합니다:

 

Xvfb :99 -screen 0 1024x768x24 &

export DISPLAY=:99

python ./run.py --indir=/mnt/data/minsun3054/TMPI/test_data --outdir=/mnt/data/minsun3054/TMPI/minsun_output

 

5. 문제가 계속될 경우

📌 NVIDIA 패키지를 찾을 수 없는 문제 해결 (libgl1-nvidia-glvnd-glx & nvidia-driver 없음)

 

2️⃣ NVIDIA OpenGL 라이브러리 강제 적용

export __GLX_VENDOR_LIBRARY_NAME=nvidia
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/lib/nvidia-$(nvidia-smi --query-gpu=driver_version --format=csv,noheader | cut -d'.' -f1):$LD_LIBRARY_PATH

✔ 다시 glxinfo로 NVIDIA가 적용되었는지 확인

glxinfo | grep "OpenGL renderer"

 

 

 

python ./run.py --indir=/mnt/data/minsun3054/TMPI/test_data/test4-mydata --outdir=/mnt/data/minsun3054/TMPI/test_data/output-mycode

 

반응형