ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [open3d] ubuntu 20.04 docker 설치 open3d 시각화 에러 해결
    Framework 2024. 5. 21. 21:46

    0. background

    local os : ubuntu 20.04

    gpu : nvidia 4060ti

     

    docker 환경에서 open3d의 시각화 코드를 실행하고자 했지만 OpenGL에러가 발생했다.

    vscode에서 발생한 에러는 아래와 같다.

     

    [Open3D WARNING] GLFW Error: GLX: Failed to create context: BadValue (integer parameter out of range for operation)
    [Open3D WARNING] Failed to create window
    [Open3D WARNING] [DrawGeometries] Failed creating OpenGL window.

     

    (터미널에서 py파일을 실행할 때는 GLX 대신에 X11가 출력되는 에러가 발생했다.)

     

    도커에서 open3d 시각화 코드를 실행하고자 할 때 발생하는 에러를 해결한 과정을 기록했다.

     

    1. host에 openGL 설치 확인

    여기서 host란 내 로컬 컴퓨터를 의미한다.

    docker와 host의 GUI 기능을 사용하려면 docker와 host의 GUI 기능을 docker에 연결해주는 작업을 해야한다.

    고로, image를 pull 받고 docker run을 하기전에 host에도 openGL이 설치되어 있어야 한다.

     

    아래 명령어를 입력했을 때 에러가 발생하거나 실행되지 않는다면, 설치가 안 되어 있는 것이다.

    glxinfo | grep "OpenGL version"

     

    만약 설치가 안되어있다면, 아래 명령어를 순차적으로 입력해서 설치해준다.(몇 개 빠지거나 추가될 수도 있다.. 제대로 기록을 안 해놔서 무엇을 설치했는지 잊어버렸다.)

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt install libgl1-mesa-dev
    sudo apt install mesa-utils
    python3 -m pip install --upgrade open3d

     

     

    x 서버도 잘 작동하고 있는 지 확인차 아래 명령어로 확인해보자.

    sudo Xorg -version

     

    X 서버란? X Window System의 구성요소로, 자세한 설명은 아래와 같다.

    더보기

    X Window System은 UNIX와 UNIX-like 시스템에서 GUI(그래픽 사용자 인터페이스)를 생성하기 위한 표준 소프트웨어 프레임워크입니다. X Window System은 네트워크 투명성, 멀티패널 윈도우, 다중 사용자 지원 등과 같은 특징을 제공하여 다양한 플랫폼에서 동작하는 그래픽 응용 프로그램을 개발하고 실행하는 데 사용됩니다.

    주요 구성 요소는 다음과 같습니다:

    1. X 서버 (X Server): 디스플레이, 키보드, 마우스 및 기타 입력 장치와 상호 작용하여 윈도우 시스템을 제공하는 소프트웨어 컴포넌트입니다.
    2. X 클라이언트 (X Client): 그래픽 응용 프로그램이나 도구로, X 서버에 연결하여 윈도우 및 다른 그래픽 요소를 생성하고 관리합니다.
    3. 윈도우 매니저 (Window Manager): 윈도우의 배치, 크기 조정 및 테마 등과 같은 사용자 인터페이스 요소를 관리하는 소프트웨어입니다.
    4. X 프로토콜 (X Protocol): X 서버와 X 클라이언트 간의 통신을 위한 네트워크 프로토콜입니다. 이 프로토콜은 그래픽 및 입력 데이터를 전송하고, 윈도우 관리를 위한 명령을 처리합니다.

    X Window System은 다양한 UNIX 및 UNIX-like 운영 체제에서 사용되며, 리눅스 시스템에서도 널리 사용됩니다. 그래픽 응용 프로그램 개발 및 실행을 위한 표준 프레임워크로서 폭넓게 활용되고 있습니다.

     

    2. docker에 X서버 접근 권한 부여하기

    Docker 컨테이너에서 GUI 애플리케이션을 실행하려면, 컨테이너가 호스트 머신의 X 서버를 통해 디스플레이에 접근할 수 있어야 한다. 그러나 기본적으로 X 서버는 보안상의 이유로 외부 접근을 차단한다. 따라서 Docker 컨테이너가 X 서버에 접근할 수 있도록 xhost 명령어를 사용하여 접근 권한을 부여해야 한다.

    xhost +local:docker

    제대로 실행됐다면 "non-network local connections being added to access control list" 라는 문구가 뜬다.

     

    3. docker image pull&run

    docker image는 pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime 를 사용했다.

    image를 run 할 때, host의 gpu와 display를 사용하기 위해 옵션을 추가해준다.

    docker run --name 3d -e DISPLAY=$DISPLAY --runtime=nvidia --gpus all -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home:/workspace pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime

    옵션에 대한 설명:

    --name 3d: container의 이름을 3d 라고 짓는다.

    -e : --env라고도 쓸 수 있고, 환경변수를 설정하는 옵션이다. 

    -it : 터미널에 입력할 수 있는 환경 제공? 이라고 알고 있다.

    -v : --volume 옵션이다. 로컬 호스트의 주소와 도커 컨테이너 내부의 주소를 연결시켜준다. 한 마디로 도커에서 내 컴퓨터 폴더에 접근할 수 있도록 해주는 것이다.

        1. 로컬의 X11소켓을 도커에 연결해주었다.

        2. /home 폴더와 도커 컨테이너 내부의 workspace를 연결해주었다. 만약 workspace 폴더가 없다면 생성해서 연결한다.

     

    * 마지막 "pytorch/pytorch~"는 run하고자 하는 docker image다.

    * --runtime, --gpus에 대한 설명은 아래 참고.

    더보기

    1. 환경 변수란?

    환경 변수(environmental variables)는 운영 체제 및 응용 프로그램에서 실행 환경에 관한 설정을 저장하는 데 사용되는 변수입니다. 이러한 변수는 주로 시스템 설정, 사용자 정보, 실행 경로 등을 정의하는 데 사용됩니다.

     

    - 주요 환경 변수의 예

    1. PATH: 실행 파일을 찾는 디렉토리 경로를 지정합니다. 예를 들어, /usr/bin:/bin:/usr/local/bin과 같이 설정되어 있을 수 있습니다.
    2. HOME: 사용자의 홈 디렉토리를 지정합니다. 예를 들어, /home/username과 같이 설정됩니다.
    3. USER: 현재 사용자의 이름을 나타냅니다.
    4. SHELL: 현재 사용 중인 셸 프로그램을 지정합니다. 예를 들어, /bin/bash와 같이 설정됩니다.
    5. LANG: 시스템의 언어 및 지역 설정을 지정합니다. 예를 들어, en_US.UTF-8과 같이 설정됩니다.
    6. PWD: 현재 작업 디렉토리를 나타냅니다.

     

     

     

    2. DISPLAY 환경 변수란?

    DISPLAY 환경 변수는 X Window System에서 사용하는 중요한 변수로, 그래픽 사용자 인터페이스를 통해 실행되는 애플리케이션이 어떤 디스플레이와 상호작용할지를 지정합니다.

     

    - DISPLAY 환경 변수의 역할

    1. 디스플레이 서버 지정: DISPLAY 변수는 애플리케이션이 연결할 디스플레이 서버를 지정합니다. 디스플레이 서버는 화면 출력을 관리하고 입력 장치(마우스, 키보드 등)와의 상호작용을 처리합니다.
    2. 포맷: 일반적으로 DISPLAY 변수는 hostname:displaynumber.screennumber 형식으로 설정됩니다.
      • hostname: 디스플레이 서버가 실행되는 호스트 이름 (로컬 머신일 경우 생략 가능).
      • displaynumber: 디스플레이 서버 번호, 기본값은 0.
      • screennumber: 화면 번호, 기본값은 0 (다중 모니터 설정일 때 사용).

    예시

    • 로컬 머신의 기본 디스플레이 서버: :0
    • 원격 머신의 디스플레이 서버: remotehost:0.1

     

    3. X11 란?

    X11, 또는 X Window System은 Unix 계열 운영 체제에서 사용되는 그래픽 사용자 인터페이스(GUI)를 위한 창 시스템 및 프로토콜입니다. 이는 컴퓨터 디스플레이에서 창, 키보드 입력 및 마우스 이벤트를 관리하기 위한 프레임워크를 제공합니다.

    X11은 응용 프로그램이 별도의 창에서 실행되도록 허용하며, 그래픽을 그리고 사용자 입력을 처리하며 창을 배치하고 상호 작용하는 메커니즘을 제공합니다. 이는 클라이언트-서버 아키텍처로 작동하여 X 서버가 디스플레이 하드웨어를 관리하고 클라이언트 응용 프로그램에서 화면에 창, 그래픽 요소를 생성, 이동, 크기 조정 및 그리기와 관련된 요청을 처리합니다.

    도커 및 그래픽 응용 프로그램의 맥락에서 X11은 종종 도커 컨테이너 내부에서 그래픽 인터페이스를 호스트 시스템의 디스플레이에 표시하는 데 사용됩니다. 이를 통해 컨테이너 내에서 실행되는 그래픽 응용 프로그램이 창과 그래픽 요소를 통해 사용자와 상호 작용할 수 있습니다.

     

     

    4. --runtime 옵션과 --gpus 옵션의 차이점

    --runtime 및 --gpus 옵션은 모두 Docker 컨테이너에서 GPU를 관리하는 데 사용됩니다만, 서로 다른 목적을 가지고 있습니다.

    1. --runtime: 이 옵션은 Docker 컨테이너가 실행되는 런타임 환경을 지정합니다. 특히, NVIDIA Docker에서는 NVIDIA Container Runtime (nvidia-container-runtime)을 사용하여 GPU 가속을 지원하는 런타임 환경을 설정할 때 사용됩니다. 이렇게 하면 Docker가 GPU를 사용하는 방식이 변경되어, 컨테이너가 호스트 시스템의 NVIDIA GPU에 액세스할 수 있게 됩니다.
    2. --gpus: 이 옵션은 Docker 컨테이너가 GPU를 사용할 수 있도록 지정합니다. --gpus 옵션을 사용하면 Docker는 컨테이너에 어떤 GPU를 사용할 것인지를 지정할 수 있습니다. --gpus all을 사용하면 모든 GPU를 사용할 수 있으며, --gpus 뒤에 숫자를 지정하여 특정 GPU를 사용할 수도 있습니다.

    간단히 말해, --runtime은 Docker가 GPU 가속을 지원하는 런타임 환경을 설정하고, --gpus는 컨테이너가 어떤 GPU를 사용할지를 지정합니다.

     

    4. docker container 에서 open3d 설치

    docker image를 run한 후에 컨테이너 내부에서 아래 명령어를 순차적으로 실행시키자.

    pip를 업그레이드해야지만, open3d 최신 버전(0.15이상의 버전)을 설치할 수 있는 것으로 보인다.(참고)

    libgomp1 등은 open3d를 설치하기 위한 의존성 모듈들이므로 설치해주자.

    apt-get update
    apt-get upgrade
    python3 -m pip install --upgrade pip
    
    apt install libgomp1
    apt install libusb-1.0-0
    apt install libgl1
    rm -rf /var/lib/apt/lists/*
    
    python3 -m pip install --upgrade open3d

     

     

    * 최종 완성된 Dockerfile

    # This could also be another Ubuntu or Debian based distribution
    FROM pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime
    
    # Install Open3D system dependencies and pip
    RUN apt-get update && apt-get install --no-install-recommends -y \
        libegl1 \
        libgl1 \
        libgomp1 \
        python3-pip \
        && rm -rf /var/lib/apt/lists/*
    
    # Install Open3D from the PyPI repositories
    # RUN python3 -m pip install --upgrade pip
    RUN python3 -m pip install --no-cache-dir --upgrade pip && \
        python3 -m pip install --no-cache-dir --upgrade open3d

     

    * Dockerfile build 및 run

    빌드 전에 꼭 X서버의 권한을 부여하는 명령어를 먼저 수행해줘야 한다!

    (시간이 지나면 다시 권한이 해제되는 것 같다. 나중에 다시 명령어를 입력해줘도 GUI가 잘 수행되는 것을 확인했다.)

    xhost +local:docker

     

    Dockerfile가 있는 곳에서 터미널을 키고 build한다. 빌드할 image의 이름은 lidar_project로 짓고, tag는 1.0.0으로 임의로 지어줬다. 마지막에 띄어쓰고 '온점'은 현재 위치의 도커파일을 build하겠다는 뜻이다.

    docker build --tag lidar_project:1.0.0 .

     

    docker run 할 때, volume 옵션과 ENV 옵션을 아래와 같이 넣어서 실행시켜주자.

    docker run --name 3d -e DISPLAY=$DISPLAY --runtime=nvidia --gpus all -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home:/workspace lidar_project:1.0.0

     

    참고: 

    open3d의 dockerfile에 대한 설명

     

    https://velog.io/@happy_quokka/docker-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-open3d-%EC%8B%9C%EA%B0%81%ED%99%94-%EC%97%90%EB%9F%AC-GLFWError-X11

    'Framework' 카테고리의 다른 글

    3D computer graphics history  (0) 2024.08.16

    댓글

Designed by Tistory.