はじめに
強化学習をしてると何かとGUI問題に直面します. OpenAI GymもPyBulletもMoJoCoもGUIです. というか,GUIで動作確認ぐらいしか,学習経過を把握できるものがありません.
ということで,GPUサーバ上でGUIが見れるような環境が欲しくなりました.
追記: Sylabs.ioにcontainerをpushしました.
headless VNCとは
VNCとは離れた環境のGUIを操作するリモートデスクトップのことを指しますが,headlessマシンとはディスプレイを持たない,つまりGUIを持たないマシンのことを指します.
つまり,GUIを持たない共有のGPU付きサーバ上に,xfce環境 (GUI) を作って,しかもブラウザ上からVNCできかつ,pytorchがGPU上で動く環境を作成します.
headless VNCを触ってみる
楽するために,Docker, もしくはSingularityを使って今回は進めます. また,私はxfceの方が好きなのでxfceでの例を示します.(もちろんIceWMでも良いです)
Singularityの解説記事はこちらから
https://hub.docker.com/r/consol/ubuntu-xfce-vnc/
docker
docker run -d -p 5901:5901 -p 6901:6901 consol/centos-xfce-vnc:latest
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しても動きますが,プロセス管理が大変なのでinstanceで動かします.
あとはブラウザでlocalhost:6901/vnc.htmlへアクセスすればなんとGUIが見れます.(初期パスワードは vncpassword )
これでgymとかpybulletとかの動作を確認できます.
導入
docker
dockerの導入はかんたんで,先程のコンテナに好きなだけaptでほしいものを入れればokです.
singularity (rootless)
非ルート権限サーバへの導入方法は3つあります. - singularity libraryからpull - ローカルPCでbuild - サーバ上でremote build
singularity libraryからpull (おすすめ!)
sylabにuploadしました.
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
root権限付きローカルPCでbuildします.
sudo singularity build --fix-perms ubuntu-xfce-pipenv.sif ubuntu-xfce-pipenv.def
*.defからローカルでbuildするのはroot必須です.
しかしsingularityには--remoteというオプションがあり,これを用いると非rootでもbuildできます.
出来上がったxfce-pipenv.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