最近在使用WSL2做一些开发工作,主要是在Windows 11下通过WSL跑深度学习的训练,这里记录一些关于WSL2的用法。
WSL即windows subsystem for Linux也就是windows的Linux子系统,有wsl1和wsl2两个版本,其中wsl1是微软将对Linux内核的调用转换成windows 内核的调用时没有Linux内核的,其优点在与和主机共享一个网络栈同时拥有比较好的对windows文件夹的读写性能。缺点也非常明显,由于没有一个真正的Linux内核,所以需要Linux内核的应用是没有办法的,比如不能使用容器,不能直接安装cuda做机器学习的训练,没有GUI等等。
WSL2是第二个版本,其本质其实是虚拟机,微软依赖于Hyper-V将一个修改过的Linux内核和windows系统同时在hyper上跑。优点自然就是有真正的Linux核心。但是网络、文件读写等方面还是有一定的问题。
在windows 10 22H2和windows 11 22h2上只要在命令行下执行
wsl --install
默认就会安装Ubuntu的发行版本,也可以从Windows应用商店中安装其他发行版本。由于其本质其实是一个虚拟机,所以需要在BIOS中开启CPU的硬件虚拟化支持,如果没有开启的话是不能安装运行的。
安装成功后可以通过wsl命令直接登陆到Linux中。
这里以导入RockyLinux为例
https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/
<podman/docker> export rockylinux:9 > rocky-9-image.tar
wsl --import <dis-name> <path-to-vm-dir> <path-to/rocky-9-image.tar.xz> --version 2
如:
wsl --import RockyLinx9 <path-to-vm-dir> <path-to/rocky-9-image.tar.xz> --version 2
成功后会在path-to-vm-dir下看到一个vhdx文件就表示成功了。运行
wsl --list
可以看到导入的所有发行版本,通过
wsl -d <dis-name>
可以登陆。
默认情况下wsl2是nat方式,能访问外网,外网不能访问它。
可以通过桥接方式来解决问题,但是多个wsl是共享网络堆栈的。配置方法如下:
Set-VMSwitch WSL -NetAdapterName Wi-Fi(eth0)
进入wsl运行下面命令:
sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 192.168.1.150/24 broadcast 192.168.1.255 dev eth0
sudo ip route add 0.0.0.0/0 via 192.168.1.1 dev eth0
做机器学习训练时,有时候需要LInux环境,windows的UI界面更合适开发,因此wsl2下训练时一个比较好的选择。
首先只有算力比较高的显卡才支援,必须在windows下安装支持wsl和cuda的驱动。官方的说法是:WSL 2 support on Pascal or later GPUs,所以只要正确安装n卡的驱动后再安装wsl2就可以了。
可以在wsl下安装conda,在通过conda 初始化pytorch环境
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
运行如下脚本:
import torch
print(f"{torch.cuda.is_available()=}")
f = torch.nn.Conv2d(3, 8, 3, device="cuda")
X = torch.randn(2, 3, 4, 4, device="cuda")
Y = X @ X
print(f"{Y.shape=}")
print("matrix multiply works")
Y = f(X)
print(f"{Y.shape=}")
print("Conv2d works")
如果发现如下问题:
Could not load library libcudnn_cnn_infer.so.8
解决方案如下:
打开windows cmd 命令行,不能用powershell
cd \Windows\System32\lxss\lib
del libcuda.so
del libcuda.so.1
mklink libcuda.so libcuda.so.1.1
mklink libcuda.so.1 libcuda.so.1.1
本文为Lokie.Wang原创文章,转载无需和我联系,但请注明来自lokie博客http://lokie.wang