들어가기에 앞서
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
'IT > 기초 지식' 카테고리의 다른 글
[Linux] sed 커맨드 상황별 사용법 (0) | 2021.11.03 |
---|---|
[Linux] expect를 이용한 Linux 커맨드 입력 자동화 (0) | 2021.10.20 |
[Docker] Supervisor을 Docker에서 사용하기 (0) | 2021.10.14 |
[Docker] Docker 이미지를 오프라인에서도 사용하는 방법 (0) | 2021.10.13 |
[Docker/Singularity] Docker, Singularity의 차이 (0) | 2021.10.12 |