windows10のままでWSL2によるGPGPUを試してみる
windows10は「21H2」までアップグレードされている前提です
物理マシンのスペックは i7-4771(3.5GHz),16GB, NVIDIA A2000, windows10Pro です.
参照先: https://docs.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl https://docs.nvidia.com/cuda/wsl-user-guide/index.html
「コントロールパネル」->「プログラムと機能」にある「windowsの機能の有効化または無効化」に関しては
特段操作はしていない。「Linux用Windowsサブシステム」「仮想マシンプラットホーム」は無効のままです。
その状態でコマンドプロンプトを起動させ、インストール可能なLinuxOSを調べてみる
C:\Users\supervisor>wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
'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
C:\Users\supervisor>
とある。ここではUbuntu-20.04を入れてみる.
C:\Users\supervisor>wsl --install -d Ubuntu-20.04
要求された操作には管理者特権が必要です。
C:\Users\supervisor>
っとそのままのコマンドプロンプトからでは無理そうで、「スタート」->「Windowsシステムツール」->「コマンドプロンプト」を右クリックで選択して、そのサブツリーから「その他」->「管理者として実行」を選ぶ。すると下記のようなコマンドプロンプトが現れる
そのうえで再度コマンドを実行します
C:\WINDOWS\system32>wsl --install -d Ubuntu-20.04
インストール中: 仮想マシン プラットフォーム <--「windowsの機能の有効化または無効化」の1つ
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム <--「windowsの機能の有効化または無効化」の1つ
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: Ubuntu 20.04 LTS
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
C:\WINDOWS\system32>
っで再起動を行う. 再起動後にログインを行うとUbuntu20.04のパネルが表示され処理が進められる.
しばらくすると、Ubuntu20.04の中でのアカウントを作るように促される
アカウント名はなんでも構わない. ここでは露軍しているwindowsOSと同じアカウントにしてみた.
この段階で「スタート」->「Ubuntu20.04」が登録され、それを選択するとUbuntu20.04のターミナルとなっている
この物理マシンにはNVIDIA RTX A2000が搭載されている.
ここで nvidiaドライバーをインストールする
&ref(): File not found: "2022y09m14d_182323936.png" at page "WSL2-CUDA-windows10";
「516.94-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.ext」(638MB)を入手.
っでインストールを開始します
途中カスタムインストールを選ぶと何がインストールされるのかがわかり、規定で選ばれているすべてを選択します
インストール完了後に、「NVIDIAコントロールパネル」を開くと下記のようになる。nvidiaドライバが 516.94 である.
「NVIDIAコントロールパネル」が無事動くので、この段階で Warp を入れると動きます。
WarpはCUDAライブラリとか別途必要なく動くみたい
これで一応windowsOS管理下にあるGPUがWSL側にも繋ぐようになった.
次にWSLのUbuntu20.04にCUDAライブラリをインストールします.
ただしLinuxのnvidiaドライバーはインストールしません. cuda-toolkitのみ入れます
CUDAダウンロードサイトの「WSL-Ubuntu」はnvidiaドライバーが入らない工夫が入っている. 一応いつものパッケージを入れてもいいが、nvidiaドライバーを外せばいいみたい
supervisor@DESKTOP-P44EP9D:~$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
supervisor@DESKTOP-P44EP9D:~$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
supervisor@DESKTOP-P44EP9D:~$ wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.1-515.65.01-1_amd64.deb
supervisor@DESKTOP-P44EP9D:~$ sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.1-515.65.01-1_amd64.deb
supervisor@DESKTOP-P44EP9D:~$ sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
supervisor@DESKTOP-P44EP9D:~$ sudo apt-get update
supervisor@DESKTOP-P44EP9D:~$ sudo apt-get install -y cuda-toolkit-11-7
その後ターミナルにて
supervisor@DESKTOP-P44EP9D:~$ nvidia-smi
Wed Sep 14 18:28:27 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 516.94 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA RTX A2000 On | 00000000:01:00.0 Off | Off |
| 30% 30C P8 6W / 70W | 0MiB / 6138MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
supervisor@DESKTOP-P44EP9D:~$
と表示される。
nvidiaドライバが用意されてCUDAも入ったので、relionは作れる. 実際に作った. っでcryoSPARCを入れてみたいと思う
まずはパスワードなしで localhost にログインできるようにするために openssh-server のインストールとその稼働を行う
supervisor@DESKTOP-P44EP9D:~$ sudo su -
root@DESKTOP-P44EP9D:~# apt install openssh-server
root@DESKTOP-P44EP9D:~# /etc/init.d/ssh start
次に、/scratchも用意してみる。この辺は別のSSD(Dドライブ)を用意してmountの方がいいのかも。ここではsystemと同居させてます
root@DESKTOP-P44EP9D:~# mkdir /scratch/
root@DESKTOP-P44EP9D:~# chmod 1777 /scratch/
root@DESKTOP-P44EP9D:~# exit
自サイトパスワードなしログインを有効にさせるために
supervisor@DESKTOP-P44EP9D:~$ ssh-keygen
supervisor@DESKTOP-P44EP9D:~$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
supervisor@DESKTOP-P44EP9D:~$ chmod 600 ~/.ssh/authorized_keys
その上で cryoSPARCを入れてみる
supervisor@DESKTOP-P44EP9D:~$ export L=XXXXX-XXXXX-XXXX-XXXX-XXXXX
supervisor@DESKTOP-P44EP9D:~$ curl -L https://get.cryosparc.com/download/master-latest/$L > master.tar.gz
supervisor@DESKTOP-P44EP9D:~$ curl -L https://get.cryosparc.com/download/worker-latest/$L > worker.tar.gz
supervisor@DESKTOP-P44EP9D:~$ mkdir cryoSPARC
supervisor@DESKTOP-P44EP9D:~$ cd cryoSPARC/
supervisor@DESKTOP-P44EP9D:~/cryoSPARC$ tar xf ../master.tar.gz
supervisor@DESKTOP-P44EP9D:~/cryoSPARC$ tar xf ../worker.tar.gz
supervisor@DESKTOP-P44EP9D:~/cryoSPARC$ mkdir /scratch/cs
supervisor@DESKTOP-P44EP9D:~/cryoSPARC$ cd cryosparc_master
supervisor@DESKTOP-P44EP9D:~/cryoSPARC/cryosparc_master$ ./install.sh --standalone \
--license $L \
--worker_path /home/supervisor/cryoSPARC/cryosparc_worker \
--cudapath /usr/local/cuda-11.7 \
--ssdpath /scratch/cs \
--initial_email saber@fgo \
--initial_password saber \
--initial_username saber \
--initial_firstname Artoria \
--initial_lastname Pendragon
supervisor@DESKTOP-P44EP9D:~/cryoSPARC/cryosparc_master$
っで母機のwindowsPCのブラウザで「localhost:39000」を叩くと
リソースを見るとGPUも認識されて、ssdなscratchも見えている模様
nfsクラアントになるパッケージをインストールして、mountポイント(/Public)を作って、mount操作を行う
supervisor@DESKTOP-P44EP9D:~$ sudo apt install nfs-kernel-server
supervisor@DESKTOP-P44EP9D:~$ sudo mkdir /Public
supervisor@DESKTOP-P44EP9D:~$ sudo mount qnap:/Public /Public
これでnfs mountは完了. ってもautofsの方が現実的かな
supervisor@DESKTOP-P44EP9D:~$ sudo apt install autofs
supervisor@DESKTOP-P44EP9D:~$ sudo echo "/- /etc/auto.home" > /etc/auto.master
supervisor@DESKTOP-P44EP9D:~$ sudo echo "/Public qnap:/Public" > /etc/auto.home
supervisor@DESKTOP-P44EP9D:~$ sudo /etc/init.d/autofs status
* automount is not running
supervisor@DESKTOP-P44EP9D:~$ sudo /etc/init.d/autofs start
* Starting automount... [ OK ]
supervisor@DESKTOP-P44EP9D:~$ sudo update-rc.d autofs enable <-- init系でautofsを有効化
ただ、、、UID/GIDの統合とかの問題があります。でもwindowsPC内のWSL2にldap/NISを這わせる?ディスクトップなwindowsなら恒久的なので構わないと思うが、、、あー/etc/nsswitch.confを駆使して優先順序を
まずはWSL2上のマシンのIPアドレスを調べる
supervisor@DESKTOP-P44EP9D:~$ ip -4 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.30.224.248/20 brd 172.30.239.255 scope global eth0
valid_lft forever preferred_lft forever
supervisor@DESKTOP-P44EP9D:~$
なので「172.30.224.248」と分かる. 母機のwindowsPCのipアドレスは「192.168.0.6」とします
方策としては、「外部から 192.168.0.6 の39000に届いたアクセスを内部の 172.30.224.1:39000 へ回せばいい」
いわゆるポートフォワーディングです。
以前windowsPCをルーターに仕立てて、ポートフォワードを試したことがある。これを使います。router/windows#pe178b02
(設定)
netsh interface portproxy add v4tov4 listenport=39000 listenaddr=0.0.0.0 connectport=39000 connectaddress=172.30.224.248
(確認)
netsh interface portproxy show v4tov4
(解除)
netsh interface portproxy delete v4tov4 listenport=39000 listenaddr=0.0.0.0
っでこのように設定して外部からアクセスしてみます。0.0.0.0は本来 192.168.0.6なのでしょうけど
このように全くの外部からWSL2のサービスに繋げました。
上記はwindowsのファイアウォールをすべて解除してます。ファイアウォールを設けるなら下記をwindowsPCに付与します
...メモリーは潤沢にあったほうがいい. 16GBではwindowsOSは問題ないけどWSLなOS達を考慮すればもっとあっていい.
「/etc/init.d/ssh restart」で「sshd; no hostkeys avaiable -- exiting.」と出たら計算機の鍵がないだけ
ssh-keygen -A
で回避可能