Singularity + headless VNC + Pipenvを使ってサーバ上で強化学習環境を整える(gym, pybullet)
はじめに
強化学習をしてると何かと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