WSL2+nvidia-docker+PyTorchの実践的な使い方(2022.5.7)

Summary

やりたいこと

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

0. WSL2+nvidia-docker+PyTorchがちゃんと設定できているか確認

前の記事 「WindowsにMacからリモート接続してPythonでGPUを使う(2022.5.6)」を参照

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

現在利用可能なゲスト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

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

docker inspectは、現在実行中のコンテナの中身を調べるコマンド
CONTAINER_IDの部分はdocker psで表示されるIDを使う

$ docker images
$ docker ps -a
$ docker ps
$ docker inspect CONTAINER_ID

1. WSL2+nvidia-docker+PyTorchの実践的な使い方

2. WSL2+nvidia-docker+PyTorchの仕組み

1. ホストのディレクトリをマウントして起動する方法

ただ立ち上げるなら以下でOK(GPUを全部使うように指定している)
/workspaceには何もマウントされていない

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

実行したいプログラムのパッケージのルートにcdして、以下のようにdockerを実行すればよい
$(pwd)を/workspace/worksにマウントした状態で起動される

docker run --gpus all -it --rm --shm-size=8g -v $(pwd):/workspace/works nvcr.io/nvidia/pytorch:22.04-py3

WindowsでGitHub Desktopやtreeを使うが、gitリポジトリは、ubuntuのネイティブFSに置いて管理したい。
同様に、ソースコードの修正はWindows側でVS Codeを使って作業したい。
実行などはubuntuのdockerにリモート接続して行う。

docker run --gpus all -it --rm --shm-size=8g -v $(pwd):/workspace/works nvcr.io/nvidia/pytorch:22.04-py3

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

GitHub DesktopでClone a repositpryするときにLocal pathにwslの場所を指定する。

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

git for Windows

##【参考】

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

  1. 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

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

  2. 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で実行されているなど気持ち悪いので、ユーザ名を指定したい)

  3. 動作確認

    設定がうまくできたら、実行してみる。 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の例が書かれている

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

Back to Index