wsl即适用于Windows的Linux子系统支持几种常见的Linux系统,我主要用了ubuntu2004。
- 确实很方便,Windows下直接可以打开Linux环境,
- 显卡直通,Linux子系统直接可以认出Nvidia显卡,不用额外装驱动,这个好像用其他虚机做不到。并且在子系统里跑cuda任务,可以直接在Windows任务管理器做性能监控,感觉还是方便的。
- Linux子系统可以从/mnt直接读取Windows盘符,例如读取d盘的download的目录:
cd /mnt/d/download
1. 系统环境要求
我用的win11,没怎么在意操作系统要求,直接就是满足的,貌似专业版和家庭版都可以。
-
控制面板->程序和功能->启用或关闭windows功能,打开三个项目:
- 虚拟机平台
- 适用于Linux的Windows子系统
-
Windows虚拟机监控服务平台(我没开、没问题) ,这个据说主要解决多个hypervisor共存问题,比如vmware+hyper-v
2. WSL2操作(大多是命令行)
2.1 安装wsl
理论上在管理员权限下命令提示符运行:
wsl --update
即可。
一些文章要求手动执行两个dism命令,但如果不出问题应该可以不用执行。
#开启Windows Subsystem for Linux
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestar
#开启虚拟机特性
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
2.2 建议直接将默认版本设置为WSL 2(但可能不做这一步默认也是2)
wsl --set-default-version 2
2.3 检查版本或状态信息
wsl --status
wsl --version
wsl -l -v(主要是验证安装的)
在大多数情况下WSL2比1好,比如有完整的Linux内核等等。WSL1明显的好处只有一条:
从 Linux子系统中访问 windows 中的文件时,仍然是 WSL1 快。
2.4 安装Linux子系统
推荐直接到Windows Store中直接搜,比如Ubuntu 20.04等。
也可以用命令行通过网络安装,比如先列出可用的Linux发行版:
wsl --list --online
#或者
wsl --install
但我运行连接不上,参考其他文章,至少需要改DNS,或者之间那个啥。
基本安装指令:
wsl --install <发行版名称>
列出已经安装的子系统:
wsl --list --verbose
或
wsl -l -v
但是上述两种安装方法,对后续的维护貌似是有差别的:
- 用windows store做安装,后续有也可以直接在图形界面删除这个实例。
- 用命令行方式安装,卸载仍然要使用命令行方式,否则重装实例时会出错:
wsl.exe --unregister Ubuntu-20.04
这里没怎么做测试,可能用store安装之后,后续也需要unregister
2.5 修改安装位置
默认的安装位置:
<用户文件夹>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_<随机数>
最后一段总之是CanonicalGroupLimited开头的、很长的一个名字。在里面可以找到以一个名为LocalState文件夹,里面有个会有一个几十GB的vhdx文件,这个应该就是虚拟磁盘了。
修改安装位置理论上有两种方式,一个是安装之前设定工作目录(还没测试):
wsl --cd <Directory>
或者采用后文介绍的快照回滚方法,在进行回滚(import)时,可以指定一个新的位置。
2.6 启动镜像
可以在开始菜单找图标,或者在命令行执行:
wsl -d Ubuntu-20.04
貌似直接在命令行写名字也能启动:
ubuntu2004
在命令行环境直接exit就可以退出来。
2.7 如果启动实例报错
Error: 0x800701bc WSL 2
网上搜这个文件下载安装:
wsl_update_x64.msi
3. CUDA+CUDNN
3.1 安装cuda
Nvidia的下载界面如图所示:
- 可以i直接选择wsl-ubuntu,貌似这个是不带显卡驱动的,wsl方式不需要(有人说禁止)安装nvidia驱动。
- 有三种安装方式可选, 有文章推荐使用runfile方式进行安装,但只说安装没啥差别,页面下方就有安装方法。
- 他这个deb(network),下面的提示没看懂,不知道如何体现出这是什么版本。
- 此外,不同安装方式,貌似卸载方式也是不同的,如果安装错误,runfile方式卸载起来好像容易一些,我之前用deb(network)部署,卸载时出了一些问题,我Ubuntu不是特别熟,没深究。但如果一次性把版本和步骤都做完,这些烂事就都遇不到了。
再安装cuda toolkit:
sudo apt install nvidia-cuda-toolkit
查看一下安装状态、版本等信息:
nvcc -V
或
nvidia-smi
或
cat /usr/local/cuda/version.json
#很多文章说查看的是version.txt,但至少11.8版本cuda没有这个文件,只有json,意思应该是一样的,json内容很多。
配置环境变量:
编辑bashrc:
vim ~/.bashrc
在最后填写两行(注意路径中的版本号):
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
然后生效一下:
source ~/.bashrc
3.2 cudnn
首先下载cudnn文件,建议直接下载对应的deb包。
WSL是能够直接访问windows目录的,直接从/mnt文件夹下面就可以找到下载目录和文件。
在文件所在目录下执行:
sudo dpkg -i cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
#第二句是根据系统提示加的,我之后又运行了一遍dpkg,理论上不用
#这个更新一定执行一下
sudo apt-get update
然后执行三句话,暖它一整天:
sudo apt-get install libcudnn8=8.8.1.3-1+cuda11.8
sudo apt-get install libcudnn8-dev=8.8.1.3-1+cuda11.8
sudo apt-get install libcudnn8-samples=8.8.1.3-1+cuda11.8 (主要为了下面的测试)
注意对应的cudnn的文件名:
cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb
其中8.8.1.3,以及结合实际的cuda版本11.8,这个信息一定要结合实际信息修修改,否则找不到包。
比如,如果执行结果信息中有Unable、not found啥的,就是字符串没搞对:
E: Version '8.8.1.3_1.0-1+cuda11.8' for 'libcudnn8' was not found
总之这里一定要好好看输出信息有没有不对劲的地方。
最后测试一下,首先建议执行:
sudo apt-get install libfreeimage3 libfreeimage-dev
否则下面编译时可能出现:
fatal error: FreeImage.h: No such file or directory
执行:
cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN
正常情况下,应该一通输出之后显示
Test passed!
3.3 制作一个wsl快照
好不容易装好的,建议搞个快照备份一下:
在管理员权限的宿主机命令提示符下执行:
wsl --export Ubuntu-20.04 d:\downloda\wsl-ubuntu2004-20230626.tar
我没有关虚机。但貌似导出的时候自己退出来了,导出过程大概用了几分钟,出来一个17GB的tar文件,里面看上去就是文件目录格式,应该不包括内存状态。
回滚的方法(只总结了网上的教程,但不同版本教程基本都是这三步):
#先注销虚机
wsl --unregister Ubuntu-20.04
#然后回滚(中间参数为还原的位置,可能可以不设置,没测试过)
wsl --import Ubuntu d:\wsl d:\downloda\wsl-ubuntu2004-20230626.tar
#设置默认用户名(ubuntu2004 是系统默认给出的名字,这个没注意从哪里查)
ubuntu2004 config --default-user USERNAME
3.4 tensorflow装一下看看
这个版本的ubuntu,自带的python是3.8,没有pip。建议装完上述内容,运行几次”sudo apt-get update“之后,再根据提示安装pip,麻烦会少一些。
直接在ubuntu环境下安装tensorflow,自动装的2.12,跑了个简单代码试了一下,确实能看出再跑GPU,可以直接在windows任务管理器做监控:
4. pycharm远程调试
- 在Pycharm上编码,然后反正WSL可以访问到windows文件系统的代码,所以直接在wsl里面执行python命令跑代码就行,也可以直接再pycharm的终端窗口运行wsl命令,比如ubuntu2004,进入虚拟机操作。
- 注意linux下的代码,访问windows路径时的字符串写法,别的没啥了。
- 其他更高级的办法待查。
5. WSL的图形化界面
参考微软官网:
使用 WSL 运行 Linux GUI 应用 | Microsoft Learn
直接apt-get install需要的软件即可,比如gedit、或者Nautilus(一个文件管理器)等。安装好之后可以直接运行软件,软件界面直接在windows中打开,十分的人性。
6. 利用Docker实现GPU加速
参考微软官网的文章:
WSL 中的 GPU 加速 ML 训练 | Microsoft Learn
基本一条一条照着操作即可,目前看不需要科学的那啥。
只有一条,在执行最后的docker run命令之前,重启一下docker服务。
sudo service docker restart
否则找不到显卡。
这个教程里的容器,自带cuda10.2,以及python3.6和tensorflow2.1,版本比较老,但确实可以直接用。不过我觉得这个容器的方法不如前面直接装cuda的方式。
99. troubleshoot
- 据说WSL2利用了hyper-v,但我并没有主动安装hyper-v,不知道是否会有性能差异。
但我利用:
bcdedit
命令查看信息时,有一条信息是:
hypervisorlaunchtype Auto
如果不是,则可以执行:
bcdedit /set hypervisorlaunchtype auto
不知道是否是系统自动管理hyper-v的意思,这个没查到有什么具体影响,没问题可以先不管。