クラウドエンジニアのノート

情報技術系全般,自分用メモを公開してます。

Singularity + headless VNC + Pipenvを使ってサーバ上で強化学習環境を整える(gym, pybullet)

はじめに

強化学習をしてると何かとGUI問題に直面します. OpenAI GymもPyBulletもMoJoCoGUIです. というか,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の解説記事はこちらから

tmyoda.hatenablog.com

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のパネルが良く死ぬので初期化コマンド

www.achiachi.net

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