一些WSL2的笔记

最近在使用WSL2做一些开发工作,主要是在Windows 11下通过WSL跑深度学习的训练,这里记录一些关于WSL2的用法。

1 什么是WSL

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核心。但是网络、文件读写等方面还是有一定的问题。

2. 安装

在windows 10 22H2和windows 11 22h2上只要在命令行下执行

wsl --install

默认就会安装Ubuntu的发行版本,也可以从Windows应用商店中安装其他发行版本。由于其本质其实是一个虚拟机,所以需要在BIOS中开启CPU的硬件虚拟化支持,如果没有开启的话是不能安装运行的。
安装成功后可以通过wsl命令直接登陆到Linux中。

3. 安装导入其他发行版本

这里以导入RockyLinux为例

3.1 导入Rootfs

1)官方下载

https://docs.rockylinux.org/guides/interoperability/import_rocky_to_wsl/

2)从docker中抽取

<podman/docker> export rockylinux:9 > rocky-9-image.tar

3.2 导入

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>

可以登陆。

4 桥接网络

默认情况下wsl2是nat方式,能访问外网,外网不能访问它。
可以通过桥接方式来解决问题,但是多个wsl是共享网络堆栈的。配置方法如下:

4.1 创建新的vSwitch

Set-VMSwitch WSL -NetAdapterName Wi-Fi(eth0)

4.2 设置路由

进入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

5. WSL2下安装cuda

做机器学习训练时,有时候需要LInux环境,windows的UI界面更合适开发,因此wsl2下训练时一个比较好的选择。

5.1 环境

首先只有算力比较高的显卡才支援,必须在windows下安装支持wsl和cuda的驱动。官方的说法是:WSL 2 support on Pascal or later GPUs,所以只要正确安装n卡的驱动后再安装wsl2就可以了。

5.2 cuda安装

可以在wsl下安装conda,在通过conda 初始化pytorch环境

 conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

5.3 测试

运行如下脚本:

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博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com