WindowsにMacからリモート接続してPythonでGPUを使う(2022.5.6)

Summary

GPUマシンで計算したいが、2台使うと面倒だから1台からコントロールしたい
GPU マシンは離れたところに置いて使う(ファンがうるさくない!)

System overview

0. Windowsの事前設定

1. MacからWindowsにRemote Desktopで接続できるようにする

2. WindowsにVS Codeをインストールする

3. WindowsnにGitをインストールする

4. WindowsにDocker Desktopは入れない!!!

Docker Desktopをインストールしようとしたが、いろんな記事を読んで思いとどまり、一旦Uninstallした。
GeForce RTX 3080 LaptopをWSL + CUDAとかで使いたいなら、Windows側にはDocker入れない方が安全らしい。(未確認情報)

1. WSLにUbuntuをインストールする手順

Enable NVIDIA CUDA on WSLを参考に設定を行う

NVIDIA CUDA on WSL

1. Windows 10 Proのversionを21H2にアップデートする

Windows Updateを適用してWindows 10 Pro version 21H2になっていることを確認する。
バージョンチェックはコマンドプロンプトまたはPowerShellからwinvarコマンドを実行
Windows 11 Proでも問題なく動作するようだ

> winver

wsl+ubuntuからはwinver.exeで実行可能

2. Windows updateの設定を確認

Windows StarttメニューのSettings–>Update & Securityの設定で、Advanced optionsからUpdate optionsを以下のように設定する。

3. NVIDIA CUDA enabled driver for WSLをインストールする

GPUの種類を確認して対応するドライバをインストール

4. UbuntuをWSLにインストールする

wslツール自体は既に入ってるらしい 以下を見ながら設定

wslのversion 1, 2が混在していた移行期は以下のような手続きが必要だったようだが、今はやらなくても問題なく設定完了している。

PowerShellをAdmin権限で立ち上げて、さらにそこから以下のコマンドを実行

wslのkernelのバージョンを確認
5.10.43.3以降のものならOKなようだ。今回は5.10.102.1なのでOK。

> wsl cat /proc/version
Linux version 5.10.102.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Wed Mar 2 00:30:59 UTC 2022

kernelのバージョンが古い場合は「2. Windows updateの設定を確認」の設定をした上で以下のコマンドを実行

> wsl --update

どのOSのどのバージョンがインストールされているか一覧表示
何も設定されていない場合は空行になっている

> wsl -l -v
NAME      STATE           VERSION

現在利用可能なゲストOSの種類とバージョンを確認
Ubuntuとなっているが実際は20.04だった

> wsl --list --online
The following is a list of valid distributions that can be installed.
Install using 'wsl --install -d <Distro>'.

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

上記コマンドで表示されるリストで確認した”NAME”を指定してインストール

> wsl --install -d Ubuntu

これにはしばらく時間がかかるが、無事インストールが完了すると、WindowsのStartメニューにUbuntuが表示される。

今度はversion表示ではWSL2とUbuntuが表示される。

> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

アイコンを右クリックしてMoreからpin to task barでtask barにアイコンを表示させるように設定

Ubuntuのbashから以下で確認したところ、Ubuntu 20.04 LTSがインストールされていた。

$ cat /etc/issue
$ cat /etc/lsb-release

root@DESKTOP-IOAL04A:~# cat /etc/issue
Ubuntu 20.04 LTS \n \l

root@DESKTOP-IOAL04A:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
root@DESKTOP-IOAL04A:~# cat /etc/issue

userがrootで立ち上がって来るのは気持ち悪いので、ユーザー名を指定 パスワードなどを設定

$ sudo add user <user name>

さらに追加したユーザにsudo権限を設定

$ sudo usermod -a -G sudo <user name>

WindowsからUbuntuを起動する際のデフォルトのログインユーザーを指定するにはPowerShellで以下を実行

> ubuntu config --default-user <user name>

追加したユーザにroot権限を設定するのを忘れたら困るが、一旦Windowsに戻ってデフォルトユーザをrootに戻すことができる

> ubuntu config --default-user root

Windowsのコマンドも実行できる。

フォルダを見たい時はexplorer

$ explorer.exe .

Visual Studio Codeも起動できる

$ code .

【参考】ユーザアカウントの追加や、実行権限の設定は以下を参考にした。

2. WSL2+nvidia-docker+PyTorchでGPUを使う設定

1. nvidia-dockerイメージを使ってPythonからGPUを使う

基本は以下の2つの記事を真似すれば問題なく実行できた。

やっちゃダメなことがいっぱい注意点として記載されている下記もチェックした。

ちょっと困ったところは以下を参考に解決

  1. ドライバの確認

    3. NVIDIA CUDA enabled driver for WSLをインストールする」が完了していればOK

  2. WSL2の実行

    4. UbuntuをWSLにインストールする」が完了していれば、Ubuntuを起動できるはず。 PowerShellから wsl.exeを実行しても良いが、Ubuntuアイコンをクリックして実行するとbashウインドウが開く。

  3. nvidia-docker2のインストール

    Dockerを手動でインストール(Docker Desktopは入れちゃダメらしい)

    $ curl https://get.docker.com | sh

    リポジトリーとGPGキーを設定

    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    
    $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    
    $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

    ログインしているユーザーをdockerグループへ追加

    $ sudo gpasswd -a $(whoami) docker

    docker.sockにグループの書き込み権限を付与

    $ sudo chgrp docker /var/run/docker.sock

    docker daemonを再起動 して一旦ログアウト

    $ sudo service docker restart
    $ exit

    これで実行できるようになる

  4. PyTorchのDockerイメージをイストール

    nvidiaが用意しているPytorch用のdockerのバージョンを指定してダウンロード&実行する

    $ docker run --gpus all -it --rm --shm-size=8g nvcr.io/nvidia/pytorch:XX.XX-py3

    XX.XXの部分は、下記のホームページに記載されているLatest Tagの値を指定する。

    https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch

    git for Windows

    この例では、22.04-py3とする

    $ docker run --gpus all -it --rm --shm-size=8g nvcr.io/nvidia/pytorch:22.04-py3

    実行結果

    git for Windows

    参考にしたブログでは、Shared Memoryの拡張を推奨しているので、同様に”-shm-size=8g”を指定。
    このようなイメージはソースコードが格納されたフォルダをマウントして使うことを想定しているので、実際はファイルコピーはしないことが多い。
    マウントした実践的な使い方は後述(このほか、rootで実行されているなど気持ち悪いので、ユーザ名を指定したい)

  5. 動作確認

    設定がうまくできたら、実行してみる。 Ubuntuを立ち上げてrootじゃないユーザーアカウントでログインすると、bashウインドウが立ち上がる。

    $ docker images
    $ docker ps -a
    $ docker run --gpus all -it --rm --shm-size=8g nvcr.io/nvidia/pytorch:22.04-py3

    実行されたら、nvidia-smiを実行してGPUが認識されていることを確認

    $ nvidia-smi

    git for Windows

    さらに、pythonを実行して、PyTorchから見えているかどうか確認

    $ python
    >>> import torch
    >>> print(torch.cuda.is_available())
    True
    >>> print(torch.cuda.device_count())
    1   

    git for Windows

【参考】

GPUを使う設定の方法だがTensorflowの例が書かれている

2. WSL2起動時にDocker daemonを自動で起動する設定

WSLではsystemdがPID1で起動しないので、WSL2起動時にsystemdを使ってサービスを自動起動させることはできないらしい。(やると不安定になるらしい) 以下を参考にwsl使用時に自動でdocker daemonを起動するように設定する

3. Windows Updateを自動で行わないように設定

Windows Updateの設定で、自動再起動がかかって実行中のdockerがクリアされてしまったことがある。Windows Updateを自動で行わないように設定。 WiFi接続している場合には、ネットワークが「従量課金」と設定すると、アップデートファイルを自動ダウンロードしなくなる。

4. WSL2でGUI表示できない

  1. WindowsにVcXsrvをインストールする
  2. Windows側でVcXsrv起動時に以下のようにする
  1. Ubuntu側で.bashrcに以下の記述を追加する
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
export LIBGL_ALWAYS_INDIRECT=1

そのあと以下を忘れずに実行

$ source ~/.bashrc

確認(Ubuntuで以下を実行)

$ sudo apt install x11-apps
$ xeyes

*これでうまくいかない時は、WindowsのFirewall設定を変更する必要があるらしい。

  1. Ubuntu (docker)内で以下を実行
$ apt update && apt upgrade
$ apt-get install python3-tk

5. WSL2でscreenを利用するための.screendir設定

リモートデスクトップ経由でなく、SSHでリモート接続していると、回線断になったときにプロセスが死んでしまう。これを回避するにはSSH時にscreenを起動しておくと良い。

WSL2でscreenを使いたいが、docker container上でscreenを使うためには、permissionとかを考慮する必要がある。 さらに、dockerが強制終了させられた場合にも作業領域が保存されるためには、.screendirをmountされた外部領域に指定する必要がある。

  1. docker runで実行時にマウントされるディレクトリ(実行したいpythonプログラムのソースコードが入ったディレクトリ)の中に、.screendirを run_docker.shなどでdocker runするときに、screenを起動してからdocker runコマンドを実行する
$ mkdir $SOURCE_DIR/.screendir
$ chmod 700 $SOURCE_DIR/.screendir

run_docker_screen.shの中に以下を記述

export SCREENDIR=$(pwd)/.screendir
screen \
docker run ...

回線断によりコネクションをロストしてしまった時は、再接続後にscreen -rで作業復帰できる。

【参考】

3. WSL+docker+CUDA+Pythonの実践的な使い方

1. 設定完了後の起動方法

  1. Ubuntuのコマンドプロンプトを立ち上げて以下を実行
$ sudo service docker start
  1. VcXsrvを起動

起動時にDisable access controlのチェックと-acの追加を忘れずに。 念の為xeyesが表示されるか確認しておく。

$ xeyes

【参考】 + WSL2でのError: Can’t open display問題の解決

  1. src/project1のフォルダに移動して./run_docker.shを実行
$ cd ~/src/project1/
$ ./run_docker.sh

2. Windows上のGitHub Desktopで、wslのシステム内のファイルを管理

やりたいこと

  1. 正しいフォルダ(src & dataフォルダ)をmountして起動する
  2. 正しいユーザで起動する(これってできるのか?)
  3. pipの設定なども含めて理想的なコンテナを使う

GitHub DesktopでClone a repositpryするときにLocal pathにwslの場所を指定する。(Ubuntuで処理するファイルをWindowsのファイルシステム上に置くと遅い)

wslの中のubuntuのディレクトリを指定するには、“\\wsl$\Ubuntu\home\USERNAME\”
たとえば、src\test-test-testは以下のように指定できる

\\wsl$\Ubuntu\home\harada\src\test-test-test

git for Windows

WSL+nvidia-docker+Pythonの実践的な使い方」に続く>

X. Docker DesktopをWindows 10にインストールする(しない方が良い!)

Dockerを使ってPythonをインストールする

1. ubuntuをとってくる

Windows PowerShellで以下を実行

docker pull ubuntu
docker run -it python-ubuntu ubuntu:latest /bin/bash
docker images
docker tag [IMAGE ID] [TAG]

以下ubuntuのbash上での操作になる

$ apt update
$ apt upgrade
$ apt install python3
$ apt install python3-pip --fix-missing
$ apt install vim
$ apt install emacs

Docker command

docker images
docker ps
docker run
docker stop
docker rm
docker rmi

docker のuninstall

まず全てのimageを消去してからdockerをuninstall

$ docker images
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

スタートメニューからdockerを右クリックしてuninstallを選択 リストが出て来る場合は右クリックしてuninstall

Back to Index