Summary
GPUマシンで計算したいが、2台使うと面倒だから1台からコントロールしたい
GPU マシンは離れたところに置いて使う(ファンがうるさくない!)
Docker
Desktopをインストールしようとしたが、いろんな記事を読んで思いとどまり、一旦Uninstallした。
GeForce RTX 3080 LaptopをWSL +
CUDAとかで使いたいなら、Windows側にはDocker入れない方が安全らしい。(未確認情報)
Enable NVIDIA CUDA on WSLを参考に設定を行う
Windows Updateを適用してWindows 10 Pro version
21H2になっていることを確認する。
バージョンチェックはコマンドプロンプトまたはPowerShellからwinvarコマンドを実行
Windows 11 Proでも問題なく動作するようだ
> winver
wsl+ubuntuからはwinver.exeで実行可能
Windows StarttメニューのSettings–>Update &
Securityの設定で、Advanced optionsからUpdate
optionsを以下のように設定する。
Recieve updates for other Microsoft products when you update WindowsをONにする。
GPUの種類を確認して対応するドライバをインストール
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にアイコンを表示させるように設定
WindowsのstartメニューからUbuntuを実行するとroot権限で起動される
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
新しいユーザでsudoを実行すると、パスワードを聞かれる
Windowsのコマンドも実行できる。
フォルダを見たい時はexplorer
$ explorer.exe .
Visual Studio Codeも起動できる
$ code .
基本は以下の2つの記事を真似すれば問題なく実行できた。
やっちゃダメなことがいっぱい注意点として記載されている下記もチェックした。
ちょっと困ったところは以下を参考に解決
ドライバの確認
「3. NVIDIA CUDA enabled driver for WSLをインストールする」が完了していればOK
WSL2の実行
「4. UbuntuをWSLにインストールする」が完了していれば、Ubuntuを起動できるはず。 PowerShellから wsl.exeを実行しても良いが、Ubuntuアイコンをクリックして実行するとbashウインドウが開く。
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
これで実行できるようになる
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
この例では、22.04-py3とする
$ docker run --gpus all -it --rm --shm-size=8g nvcr.io/nvidia/pytorch:22.04-py3
実行結果
参考にしたブログでは、Shared
Memoryの拡張を推奨しているので、同様に”-shm-size=8g”を指定。
このようなイメージはソースコードが格納されたフォルダをマウントして使うことを想定しているので、実際はファイルコピーはしないことが多い。
マウントした実践的な使い方は後述(このほか、rootで実行されているなど気持ち悪いので、ユーザ名を指定したい)
動作確認
設定がうまくできたら、実行してみる。 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
さらに、pythonを実行して、PyTorchから見えているかどうか確認
$ python
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> print(torch.cuda.device_count())
1
【参考】
GPUを使う設定の方法だがTensorflowの例が書かれている
Getting started with CUDA on Ubuntu on WSL 2
これはどこでやるはずだったか忘れた・・・
$ sudo apt -y install docker.io
WSLではsystemdがPID1で起動しないので、WSL2起動時にsystemdを使ってサービスを自動起動させることはできないらしい。(やると不安定になるらしい) 以下を参考にwsl使用時に自動でdocker daemonを起動するように設定する
Windows Updateの設定で、自動再起動がかかって実行中のdockerがクリアされてしまったことがある。Windows Updateを自動で行わないように設定。 WiFi接続している場合には、ネットワークが「従量課金」と設定すると、アップデートファイルを自動ダウンロードしなくなる。
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設定を変更する必要があるらしい。
$ apt update && apt upgrade
$ apt-get install python3-tk
リモートデスクトップ経由でなく、SSHでリモート接続していると、回線断になったときにプロセスが死んでしまう。これを回避するにはSSH時にscreenを起動しておくと良い。
WSL2でscreenを使いたいが、docker container上でscreenを使うためには、permissionとかを考慮する必要がある。 さらに、dockerが強制終了させられた場合にも作業領域が保存されるためには、.screendirをmountされた外部領域に指定する必要がある。
$ mkdir $SOURCE_DIR/.screendir
$ chmod 700 $SOURCE_DIR/.screendir
run_docker_screen.shの中に以下を記述
export SCREENDIR=$(pwd)/.screendir
screen \
docker run ...
回線断によりコネクションをロストしてしまった時は、再接続後にscreen -rで作業復帰できる。
【参考】
$ sudo service docker start
起動時にDisable access control
のチェックと-ac
の追加を忘れずに。
念の為xeyesが表示されるか確認しておく。
$ xeyes
【参考】 + WSL2でのError: Can’t open display問題の解決
$ cd ~/src/project1/
$ ./run_docker.sh
やりたいこと
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
「WSL+nvidia-docker+Pythonの実践的な使い方」に続く>
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