IT/기초 지식

[Singularity] Singularity + headless VNC + Pipenv를 사용한 강화학습 환경 만들기(gym, pybullet)

개발자 두더지 2021. 10. 14. 23:52
728x90

들어가기에 앞서


GPU 서버 상에 GUI가 보이는 환경이 필요했기 때문에 정리하였다. 

- gym(OpenAI Gym): 강화학습 알고리즘을 개발하고, 비교하기 위한 툴 키트

- pybullet(PyBullet Robotics Environments) : 심층강화학습을 위한 물리 시뮬레이션 환경

 

headless VNC란


VNC란 떨어져 있는 환경의 GUI를 조작하는 리모트 데스크톱을 의미하지만, 앞에 붙어 있는 headless머신이란 디스플레이를 가지지 않은, 즉 GUI가 없는 머신을 일컫는다.

즉 GUI를 가지지 않는 공유 GPU가 붙은 서버 상에, xfce 환경(GUI)를 만들어, 거기다 브라우져상에 VNC를 붙여 pytorch가 GPU상에서 움직이는 환경을 만들 수 있다.

 

 

headless VNC를 사용해보자


이번 포스팅에서는 Docker 혹은 Singularity를 사용하여 진행한다. 또한 나는 xfce를 좋아하기 때문에 xfce를 사용했지만, 본인이 원하는 것을 사용해도 괜찮다.

docker

docker 커맨드로 본다면 아래와 같을 것이다.

docker run -d -p 5901:5901 -p 6901:6901 consol/centos-xfce-vnc:latest

Singularity

동일한 내용을 singularity상에서 실행한다면 아래와 같다.

# sandbox작성
singularity build --sandbox ubuntu-xfce docker://consol/ubuntu-xfce-vnc:latest

# instance작성
singularity instance start -w --nv ubuntu-xfce xfce

# vnc실행
singularity run instance://xfce

singularity에서도 run 커맨드가 있으므로 그대로 run해도 괜찮지만, 프로세스 관리가 힘드므로 먼저 instance(Docker container같은 느낌)을 만들어 실행했다.

실행 후 localhost:6901/vnc.html으로 액세스하면 GUI를 볼 수 있다(초기 패스워드는 vncpassword). 이것으로 gym이나 pybullet등의 동작을 확인할 수 있다.

 

 

도입


docker

 docker를 통한 도입은 간단하고 앞에서 실행시킨 컨테이너에 apt를 이용해 필요한 것들을 설치하면 된다.

singularity(rootless)

 sylab에 upload했으므로 pull로 가져왔다.

singularity pull library://tmyoda/default/headless-ubuntu-xfce-pipenv

 이것으로 sif파일을 얻어냈다.

로컬 PC에서 build

 rootless라면 apt 커맨드를 사용할 수 없으므로, 로컬 PC에 singularity를 도입했다. 그리고 def 파일을 아래와 같이 만들었다.

Bootstrap: docker
From: consol/ubuntu-xfce-vnc:latest


%environment
    export LC_ALL=C.UTF-8
    export Lang=C.UTF-8
    export PIPENV_VENV_IN_PROJECT=1
    export PATH="/usr/local/opt/openssl/bin:$PATH"


%post
    apt-get -y update 
    # for jupyter and pipenv 
    apt-get install -y bzip2 ca-certificates curl git ffmpeg openssl libssl-dev \
    libsqlite3-dev libreadline6-dev libbz2-dev libssl-dev libsqlite3-dev libncursesw5-dev \
    libffi-dev libdb-dev libexpat1-dev zlib1g-dev liblzma-dev libgdbm-dev libmpdec-dev \
    vim-tiny build-essential inkscape jed libsm6 libxext-dev libxrender1 lmodern netcat tzdata unzip
    
    # pyton3.6 from source
    apt-get install -y wget build-essential gcc zlib1g-dev
    cd /root/
    wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
    tar zxf Python-3.6.8.tgz
    cd Python-3.6.8
    ./configure 
    make altinstall
    cd .. && rm -rf Python-3.6.8.tgz Python-3.6.8
    cd $HOME
    rm /usr/bin/python3
    ln -s /usr/local/bin/python3.6 /usr/bin/python3
    # install pip
    export PATH="/usr/local/opt/openssl/bin:$PATH"
    curl -kL https://bootstrap.pypa.io/get-pip.py | python3
    apt-get clean
    rm -rf /var/lib/apt/lists/*
    # pipenv
    pip3 install virtualenv
    pip3 install pipenv

%labels
    Author tmyoda
    Version v0.1.0

루트 권한이 있는 로컬 PC에서 build한다.

sudo singularity build --fix-perms ubuntu-xfce-pipenv.sif ubuntu-xfce-pipenv.def

def를 이용해 로컬에서 bulid하기 위해서는 root권한이 필수이다. 그러나 singularity에서는 --remote이라는 옵션이 있는데, 이것을 사용하면 root가 아니더라도 build가 가능하다.

완료됐다면 xfce-popenv.sif를 scp등에 복사하자.

 

 

서버 상에서의 작업


pull 혹은 def를 이용해 build한 sif 파일을 서버상에 올린 상태가 되어있을 거라고 생각한다.

1) 서버상에서 --sandbox 옵션을 붙여서 빌드한다. 이때는 vnc가 움직이지 않는다.

singularity build --sandbox ubuntu-xfce ubuntu-xfce-pipenv.sif

2) 서버상에서 instance start하여 run한다.

singularity instance start -w --nv  ubuntu-xfce xfce
singularity run -w --nv instance://xfce

그 이후에는 아까와 동일하기 localhost:6901/vnc/html에 액세스한다.

그리고 pipenv가 도입되어 있으므로, gym, pybullet, jupyter 나름대로의 환경을 만들 수 있다.

 

 

xfce4 패널 초기화 커맨드


마지막으로 xfce4의 패널이 잘 중지되므로 최기화 커맨드를 적용할 필요가 있다. 커맨드는 다음과 같다.

xfce4-panel --quit
pkill xfconfd
rm -rf ~/.config/xfce4/panel
rm -rf ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
xfce4-panel

참고자료

https://note.com/npaka/n/nce9c85eb253e

https://tmyoda.hatenablog.com/entry/20200819/1597845031#headless-VNC%E3%81%A8%E3%81%AF

728x90