wsl2 AI 推理使用体验

wsl2 看起来让 Windows 成为最好的 Linux 发行版之一了

wsl1 or wsl2

简单使用下来,wsl2 省去了大量的无意义的驱动安装、配置的过程,在这个基础上还提供了易用且(暂时看下来)稳定的用户体验

笔者写这篇博客的时候网上依然有许多关于 wsl1 和 wsl2 优劣的各种争论,从原理上讲,wsl1 非常类似 Cygwin 这种开发环境兼容层,wsl1 把所有的系统调用翻译成 Windows NT 的内核调用来实现,也就是说 wsl1 能够实现哪些特性需要取决于微软决定兼容哪些 Linux 特性,类似 systemd 的兼容层实现在 wsl1 上实现成本非常高,并且未来的 Linux 新特性更新都要微软出人力来做一层兼容层的更新

而 wsl2 是一个更加可持续的路径,基于一套完善的 wsl.exe 工具集合和完整虚拟化的 Linux Kernal,在完整兼容所有 Linux 特性的同时避免了过多的维护成本。很多人抱怨 wsl2 的问题集中在跨系统 io 上,这个见仁见智了,如果真的有用户需要在 ntfs 文件系统上大量依赖 Linux 的工具链调用,那 Cygwin、 MinGW 包括 wsl1 都是很好的选择,毕竟就像海勒姆定律说的那样,系统中只要是能够观测到的功能,都会被某些人依赖。微软也明确了 wsl1 和 wsl2 在可预见的未来会同时存在,可以根据需求自由选择

本文以下全部基于 wsl2 ,Nvidia cuda 提供了完整的 wsl2 支持,在 wsl2 中能够实现非常便捷的 cuda 调用,同原生 Linux 可以说几乎毫无差异

安装过程

Windows 下强烈推荐通过 Microsoft Store 安装 Windows Terminal 来替换自带的 Powershell 终端

github release 安装也行,但通过 Microsoft Store 安装可以获得自动更新

安装 wsl2

通过以下命令来设置默认的 wsl 的版本,我们需要安装 wsl2

1
wsl.exe --set-default-version 2

然后我们选择一个我们熟悉的发行版进行安装即可,笔者这里选择的 Debian

1
wsl.exe --install Debian

安装完成后完成设置即可通过 wsl.exe 启动 wsl2 的实例,或者我们可以设置 Windows Terminal 的默认 profile 来让 wsl2 替换掉默认的 Powershell

https://docs.microsoft.com/en-us/windows/wsl/install

https://docs.microsoft.com/en-us/windows/wsl/basic-commands

cuda

不要在 wsl2 下安装任何 Nvidia 驱动

虽然每次聊到 Linux 和 Nvidia,都会感叹这两个水火不容的物种,但老黄不愧是资本家,还是很明确的知道谁在贡献收入,对于现在的这些商用场景的支持是非常到位的(钱到位了

Windows 下最新的 Nvidia 驱动(Game Ready 或者 Studio)本身就包含了完整的 wsl2 的 cuda 支持,只要正确安装了驱动,就能够调用 Nvidia GPU 来跑编译好的 cuda 应用程序

也就是说其实这一步什么也不用干,直接就能用了(魅力时刻

如果你希望在 wsl2 下编译 cuda 应用,那么请参考 Nvidia 的官方手册

Docker

docker 有两种安装方式,一种通过 Docker Desktop ,一种通过 wsl2 下的包管理来安装 docker-engine

作为一个单纯的用户,我更推荐 Docker Desktop 的方式,开箱即用的体验对于很多人非常重要,虽然 Docker Desktop 改 lisence 收费这事确实影响挺大的,但对于这种事情的评价超出了本文的范畴,选择权在你手里

通过 Docker Desktop 安装完成后,在 Settings -> Resources -> WSL integration 中勾选对应的 Distro 即可,不需要再额外安装 NVIDIA Container Toolkit

另一种是直接在 wsl2 里安装 docker-engine,然后安装 NVIDIA Container Toolkit

docker-engine 的安装参考 docker 官网对应 distro 的安装手册,然后通过以下的命令来安装 NVIDIA runtime

1
2
3
4
5
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker-keyring.gpg
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-docker-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2

安装完成后我们通过经典的 nvidia-smi 可以验证是否正确完成了配置

1
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

至此我们就完成了所有的配置,可以像原生 Linux 一样调用熟悉的 pytorch、cuda 来运行推理模型了