Closed12

win11+WSL2+GPU+docker+CUDA+CuDNNでPytorchを動かすまで

yumizuyumizu

購入したPCのwindows versionがwindows 10 Version 20H2だったので、windows11に更新
ここは勢いでいける

win10の途中のversionから、簡単にwsl2がインストールできるようになった

yumizuyumizu

WSL2 のインストール

今回はUbuntu-20.04をインストール
もし --installのあと何もつけなかったらUbuntuが自動的にインストールされる

wsl --install -d Ubuntu-20.04

インストールできるディストリビューションの種類を見るには以下のコマンド。

wsl --list --online

上記のコマンドではUbuntu22.04 LTSは2022/5/19時点では表示されないが、Microsoft storeからは入手可能
https://apps.microsoft.com/store/detail/ubuntu-2204-lts/9PN20MSR04DW?hl=ja-jp&gl=JP

インストールが終わったらPCを再起動する
再起動後、自動でterminalが開き、ubuntu環境下でのユーザアカウント、passを設定を求められる。
※再起動せずとも、ユーザアカウント、passの入力が求められることも。

一応update確認

wsl --update

上記処理後、エクスプローラーの左欄にLinuxボタンが生成され、中にUbuntuのディレクトリ構成が作成されていればOK。
またwindows terminalを開くと、Ubuntuが選択できるようになっているはず。
今後Linuxコマンドを叩くときは、windows terminalからUbuntuを選択して叩く

もしwindows terminalからUbuntuが表示されないときは
windows terminalを開く→タブの下矢印→設定→左下の「JSONファイルを開く」
そして"list":の項目に以下を追加

{
    "guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
    "hidden": false,
    "name": "Ubuntu-20.04",
    "source": "Windows.Terminal.Wsl"
}

保存するとwindows terminalからUbuntuが表示されるはず

yumizuyumizu

Update & Upgrade

まずこの状態でaptをコマンド使用すると速度が非常に遅いことがある(数十kb/sとかのレベル)。理由はaptコマンドを実行する際のリポジトリが海外になっているため。なので日本のレポジトリから実行できるようurl に jp. をつける

sudo sed -i 's/\/\/archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i 's/\/\/us.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i 's/\/\/fr.archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list
sudo apt -y update
sudo apt -y upgrade

そのあとpowershellで以下のコマンドをたたいてwslを再起動

wsl --shutdown

https://blog.cles.jp/item/11315
https://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToInstallUbuntu2004OnWSL2.html#toc10
https://www.kkaneko.jp/tools/ubuntu/ubuntu_setup.html

yumizuyumizu

GPUドライバのインストール

以下のページからwsl専用のGPUドライバをインストールできる

https://developer.nvidia.com/cuda/wsl

「Get CUDA Driver」をクリックし、自分にあったGPUのドライバをインストール。

注意点は

  • Product Series,Productは据え置き型とlaptop型で分かれているので注意
  • Operating Systemはwin11を選択
  • Download TypeはGRDにした(あってる?)

インストール後、ドライバを起動しデフォルトの設定のまま、すすめばOK
Geforce Experienceはゲームの録画が便利になったりGPUにあった最新のドライバを更新通知してくれるらしいが、基本ゲームはしないはず(しても本格的にはしない)なので外した

yumizuyumizu

インストールするバージョンを確認

今回はdockerでpytorchを動かすことを目標とする
なのでpytorchが対応しているcudaやCuDNNを入れる必要がある
適当に最新のcudaをインストールするとpytorchが対応していない場合があるので要注意

DockerHubにて対応してるバージョンを確認
https://hub.docker.com/r/pytorch/pytorch/tags

今回は
pytorch:1.10.0
cuda:11.3
cudnn:8
でいくことにする

※ cuda11.1以降のバージョンでWSL2に対応したCUDAが用意されているので、それ以降のバージョンを選ぶと良い
※ちなみにcuda11.1とcuda11.2は途中でエラーがでたので、cuda11.3にした

yumizuyumizu

CUDA Toolkitのインストール

CUDA11.3のページに行く
https://developer.nvidia.com/cuda-11.3.0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local

設定はバージョンは違えどこのページのスクショを参考に。
ポチポチ設定すると、コマンドが表示されるので、それをコピーしてterminalをたたく

すべて終了後nvdia-smiをたたいて、例のやつがでたら成功

yumizuyumizu

cuDNNのインストール

以下のページからDL
https://developer.nvidia.com/rdp/cudnn-archive

今回は以下を選択
Download cuDNN v8.2.1 (April 23rd, 2021), for CUDA 11.x
→ cuDNN Runtime Library for Ubuntu20.04 x86_64 (Deb)

c:tempに保存した場合、以下のようにたたく(sudoつけないとダメかも)
dpkg -i /mnt/c/temp/libcudnn8_8.2.1.32-1+cuda11.3_amd64.deb

yumizuyumizu

環境変数設定

cuda-11-3にパスが通るように下記の設定を行う。

LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/usr/local/cuda-11.3/lib64
PATH="$PATH":/usr/local/cuda/bin

上の2行を ~/.bashrc に追加し、

source ~/.bashrc
yumizuyumizu

nvidia-docker

こいつがいいらしい。

以下を入力

curl https://get.docker.com | sh
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
sudo apt-get update
sudo apt-get install -y nvidia-docker2

あとはdockerデーモン起動すればOK

sudo service docker stop
sudo service docker start

一般ユーザーで以下のコマンドをたたいてみると、おそらく以下のコマンドがでるはず。

$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix

これは一般ユーザーがdockerコマンドを実行する権限がないため。このままだといちいちsudoをつける必要がある。
一般ユーザーでdockerコマンドを実行するためには、dockerグループに一般ユーザーを加える必要がある。まずはdockerグループが存在するか確認

cat /etc/group | grep docker

グループが存在しない場合は、以下のコマンドでdockerグループを作成。

sudo groupadd docker

以下のコマンドでdockerグループに登録

sudo usermod -aG docker ユーザー名

再起動すると一般ユーザーでもdockerコマンドが使えるようになる
また、docker起動にパスワード不要、またwsl2起動中は常時docker起動状態にしたい場合は以下参照
https://zukucode.com/2021/11/wsl2-docker-startup.html

yumizuyumizu

最終確認

これでうまくいけば成功

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

「xx.xx」にはバージョンをかく。バージョンはココのLatest Tagを確認

dockerコンテナに入って

nvidia-smi

import torch
print(torch.__version__)
print(torch.cuda.is_available())

がバージョンとTrueが返ってきたらOK

また念のため以下のdockerイメージで同じことして、成功すればOK

docker run --gpus all -it --rm --shm-size=8g pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel
yumizuyumizu

追記

docker imageでCUDA環境を用意するのであれば、WSL2のUbuntuにはインストール不要

このスクラップは2023/05/30にクローズされました