#author("2022-09-14T14:04:40+00:00","default:sysosa","sysosa") #author("2022-11-15T12:05:40+00:00","default:sysosa","sysosa") windows10のままでWSL2によるGPGPUを試してみる windows10は「21H2」までアップグレードされている前提です 物理マシンのスペックは i7-4771(3.5GHz),16GB, NVIDIA A2000, windows10Pro です. &ref(2021y11m20d_213520504.png,nolink); 参照先: [[https://docs.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl>+https://docs.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl]] [[https://docs.nvidia.com/cuda/wsl-user-guide/index.html>+https://docs.nvidia.com/cuda/wsl-user-guide/index.html]] ***wslコマンドでwindows10の中にLinuxをインストールします [#r932b095] 「コントロールパネル」->「プログラムと機能」にある「windowsの機能の有効化または無効化」に関しては 特段操作はしていない。「Linux用Windowsサブシステム」「仮想マシンプラットホーム」は無効のままです。 その状態でコマンドプロンプトを起動させ、インストール可能なLinuxOSを調べてみる #code(nonumber){{ 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を入れてみる. #code(nonumber){{ C:\Users\supervisor>wsl --install -d Ubuntu-20.04 要求された操作には管理者特権が必要です。 C:\Users\supervisor> }} っとそのままのコマンドプロンプトからでは無理そうで、「スタート」->「Windowsシステムツール」->「コマンドプロンプト」を右クリックで選択して、そのサブツリーから「その他」->「管理者として実行」を選ぶ。すると下記のようなコマンドプロンプトが現れる &ref(2021y11m20d_215731308.png,nolink); そのうえで再度コマンドを実行します #code(nonumber){{ 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の中でのアカウントを作るように促される &ref(2021y11m20d_220900862.png,nolink); アカウント名はなんでも構わない. ここでは露軍しているwindowsOSと同じアカウントにしてみた. この段階で「スタート」->「Ubuntu20.04」が登録され、それを選択するとUbuntu20.04のターミナルとなっている &ref(2021y11m20d_221355481.png,nolink); ***GPU [#w66fc664] この物理マシンにはNVIDIA RTX A2000が搭載されている. ここで nvidiaドライバーをインストールする &ref(2022y09m14d_182323936.png,nolink); 「516.94-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.ext」(638MB)を入手. っでインストールを開始します 途中カスタムインストールを選ぶと何がインストールされるのかがわかり、規定で選ばれているすべてを選択します インストール完了後に、「NVIDIAコントロールパネル」を開くと下記のようになる。nvidiaドライバが 516.94 である. &ref(2022y09m14d_182523685.png,nolink); ***WARP [#w31cb393] 「NVIDIAコントロールパネル」が無事動くので、この段階で [[Warp]] を入れると動きます。 WarpはCUDAライブラリとか別途必要なく動くみたい ***CUDA [#u03ff047] これで一応windowsOS管理下にあるGPUがWSL側にも繋ぐようになった. 次にWSLのUbuntu20.04にCUDAライブラリをインストールします. ただしLinuxのnvidiaドライバーはインストールしません. ''cuda-toolkitのみ''入れます &size(10){CUDAダウンロードサイトの「WSL-Ubuntu」はnvidiaドライバーが入らない工夫が入っている. 一応いつものパッケージを入れてもいいが、nvidiaドライバーを外せばいいみたい}; #code(nonumber){{ 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 }} その後ターミナルにて #code(nonumber){{ 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:~$ }} と表示される。 ***cryoSPARC [#g3863388] nvidiaドライバが用意されてCUDAも入ったので、relionは作れる. 実際に作った. っでcryoSPARCを入れてみたいと思う まずはパスワードなしで localhost にログインできるようにするために openssh-server のインストールとその稼働を行う #code(nonumber){{ 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と同居させてます #code(nonumber){{ root@DESKTOP-P44EP9D:~# mkdir /scratch/ root@DESKTOP-P44EP9D:~# chmod 1777 /scratch/ root@DESKTOP-P44EP9D:~# exit }} 自サイトパスワードなしログインを有効にさせるために #code(nonumber){{ 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を入れてみる #code(nonumber){{ 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」を叩くと &ref(2022y09m14d_215829866.png,nolink); &ref(2022y09m14d_220134113.png,nolink); リソースを見るとGPUも認識されて、ssdなscratchも見えている模様 ***nfsクラアントになってファイルを参照したい [#p861d5a9] nfsクラアントになるパッケージをインストールして、mountポイント(/Public)を作って、mount操作を行う #code(nonumber){{ 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の方が現実的かな #code(nonumber){{ 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のcryoSPARCを母機windows以外からアクセスしたい [#g84faa36] まずはWSL2上のマシンのIPアドレスを調べる #code(nonumber){{ 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]] #code(nonumber){{ (設定) 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 }} っでこのように設定して外部からアクセスしてみます。&size(10){0.0.0.0は本来 192.168.0.6なのでしょうけど}; &ref(2022y09m14d_225523757.png,nolink); このように全くの外部からWSL2のサービスに繋げました。 上記はwindowsのファイアウォールをすべて解除してます。ファイアウォールを設けるなら下記をwindowsPCに付与します &ref(2022y09m14d_230310227.png,nolink); ***メモ [#x2d22f33] ...メモリーは潤沢にあったほうがいい. 16GBではwindowsOSは問題ないけどWSLなOS達を考慮すればもっとあっていい. #code(nonumber){{ 「/etc/init.d/ssh restart」で「sshd; no hostkeys avaiable -- exiting.」と出たら計算機の鍵がないだけ ssh-keygen -A で回避可能 }}