non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

Xサーバーを入れずに、WSLでXクライアントを動かす

この記事は@kjunichiの2017年パーソナルアドベントカレンダーの25日目の記事です 。

Xサーバーを入れるのがめんどい

Windows側にXサーバーを入れずに、HTML5に対応したブラウザさえあれば、 WSLでXクライアントを動かして、画面に表示する方法のメモ

概略図

f:id:kjw_junichi:20171226214237p:plain

WSL側に必要なモノ

xvfb

aptでXの仮想サーバーであるxvfbをインストールして、起動させる。

インストール

sudo apt-get install xvfb

起動

Xvfb :1 -screen 0 1280x1024x16 -ac &

x11vnc

今インストールしたxvfbサーバーをVNC経由で利用できるようにする。

インストール

sudo apt-get install x11vnc

起動

x11vnc -display :1 &

novnc

インストール

git clone https://github.com/novnc/noVNC.git

noVNCの起動

cd novnc
./utils/launch.sh

実行結果

Edgeや他のWindowsのWebブラウザでnoVNCで割り当てられたURLへアクセスすることで、WSL側のxvfbサーバーに アクセスできる。

f:id:kjw_junichi:20171226214042p:plain

関連記事

13年前の記事

pytorchによるcycleGANの実装をWindowsで動かした

この記事は@kjunichiの2017年パーソナルアドベントカレンダーの24日目の記事です 。

背景

という記事を目にして、以前、別の場所で見て気になっていた画像処理関係の論文の実装を扱っている記事だと分かり読んでみました。

どうやらpytorchというTensorflowみたいなのがベースになっており、 このリポジトリに立っているissue見るとWindowsでもCUDAを使って動かせるような記述があったので、 Windows10を動かしてNVIDIAGPUが載っている自作PCで動かせそうだったので試してみた。

準備

Python3

Anacondaをインストールしており、これを使用して進めた。

conda create -n pttest python=3.6
activate pttest

として、環境を用意。以降この環境で作業した。

Windows版のpytorchのインストール

conda install -c peterjc123 pytorch

これで、今回使うcycleGANで使用している2.x系のpytorchがインストールされた。

その後、 pytorch-CycleGAN-and-pix2pixの公式READMEに従って、pytorchの他に必要なライブラリをインストール

git clone https://github.com/pytorch/vision
cd vision
python setup.py install
pip install visdom
pip install dominate
git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
cd pytorch-CycleGAN-and-pix2pix

データの入手

WSL大活躍、ubuntu入れて、そこで/mnt/c/..で作業しているディレクトリまで移動して、 公式のシェルスクリプトを実行。 (sudo apt-get unzipが必要だった)

cd /mnt/c/hoge/fuga/pytorch-CycleGAN-and-pix2pix
bash ./datasets/download_cyclegan_dataset.sh maps

これで、必要なデータのDLが行えた。WSLさまさまでした。 (その後、map以外のサンプルukiyoe2photoを試したら、zip展開後のファイル名にWindowsでは問題のある文字が使われているようで、 macOSで展開して、そこからリモートコピーすることで、取得できた)

うごかす

Windowsでの対応が必要だった。

Windows版の説明にちらっと書いてはあったが、意味が分からなかったが動かして分かった。

学習データの読み込み処理などをマルチプロセスで実行して処理速度を稼ぐようだが、 Windows版ではこれを無効にしないとだめらしい。そのための修正が以下

train.pyの修正

from util.visualizer import Visualizer
if __name__ == '__main__': # この一行を入れて、次行以降のインデントを下げる

test.pyの修正

from util import html
if __name__ == '__main__': # この一行を入れて、次行以降のインデントを下げる

実行

python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan --no_dropout --loadSize 128 --fineSize 128

多分警告が出るだけとは思うが

動き出すと、ローカルのvisdomのサーバーへのアクセスに失敗したと警告がでてくる。 で、これを解消しようと、

python -m visdom.server

として、visdomのサーバーをたてようとした。 が、

Traceback (most recent call last):
  File "C:\Users\kjw_j\Anaconda3\envs\pttest\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Users\kjw_j\Anaconda3\envs\pttest\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\kjw_j\Anaconda3\envs\pttest\lib\site-packages\visdom\server.py", line 636, in <module>
    download_scripts()
  File "C:\Users\kjw_j\Anaconda3\envs\pttest\lib\site-packages\visdom\server.py", line 616, in download_scripts
    with open(filename, 'wb') as fwrite:
OSError: [Errno 22] Invalid argument: 'C:\\Users\\kjunichi\\Anaconda3\\envs\\pttest\\lib\\site-packages\\visdom/static/fonts/glyphicons-halflings-regular.eot?#iefix'

と、エラーが出て動かない。

そこで、再びWSL登場!。 WSLのubuntuにvisdomを入れて、ここで動かしすことで解決した。

GPUを使用せずに動かす

AMD CPU Ryzen 7 2700 with Wraith Spire (LED) cooler YD2700BBAFBOX

AMD CPU Ryzen 7 2700 with Wraith Spire (LED) cooler YD2700BBAFBOX

学習中でもGPUを占有しているようで、じつは別のプロセスでGPU資源を利用出来てしまい、 この状態で、学習中のプログラムがGPU資源を掴もうとして、リソース不足になって途中でGPUエラーで 落としてしまいました。

まぁ、そもそも、viscomのサーバーにWebブラウザでアクセスすれば、途中経過が見れるのですが、 当初はその見方が全く分からず、別途test.pyを動かして確認してました。

そんな中、方法を編み出しました。




epochを途中から指定するには

こうして中断してしまった学習の続きをさせる場合、epochを指定することで、 途中から続けてくれる感じでした。

また、意図的にGPU資源を利用せずとも、Windows版のpytorchだからなのか、学習途中で予期せぬエラーが起きて中断することがありました。




まとめ

WSLのおかげで、データのDLと、visdomのサーバーを動かすことが容易に行えた。

TensorflowのmacOSでのGPUサポートが切れてからはWindows生活が加速してるが、今回使ってるpytorchなら、 MacBook ProでもGPU使えるのか気になった。

関連記事

3年前の記事

1年後の記事

basicなら一行なのにCだとスキルの無さもあり、長くなった件

この記事は@kjunichiの2017年パーソナルアドベントカレンダーの23日目の記事です 。

ついに英語でブログを実現した

ついに英語でブログを実現したdev.toのジェネラティブアートの記事にあったcomdor向けのbasicのコード、Cでやってみたら、一行どころでは済まなかった。

#include <stdio.h>
#include <stdlib.h>

#define COL_NUM 35

int main(void){
    int count=(COL_NUM)*50;
    while(count>0) {
        if(rand()%2==0) {
            printf("\\");
        }else {
            printf("/");
        }
        count--;
        if(count%COL_NUM==0) {
            //printf("(%d)\n",count);
            printf("\n");
        }
    }
}

関連記事

3年前の記事

2年前の記事

1年後の記事