Enable NVIDIA CUDA on WSL 2

1. 更新WSL内核

如何更新 Win10 WSL2 的 Linux 内核

2. 在 windows 中下载并安装 cuda 驱动

① 在官网按照 gpu 类型选择下载 cuda 驱动,并傻瓜安装即可。

(注意:这里的驱动是专为 wsl 设计的,因此整个过程是 windows 中的操作,不涉及 ubuntu)

验证:

在 windows 的 cmd 命令行中输入 nvidia-smi 有显卡信息说明安装成功。

注意:关于 cuda 驱动版本的解释

安装第 4 点之前需要对 cuda 版本做一个说明,之前被各种版本搞的相当混乱,理解了之后清晰了很多。

  1. 具体检查措施: ① 先去 pytorch 官网查看 torch 支持的最新的 cuda 版本(截止到 2021 年 7 月 27 日,torch 推荐安装的 cuda 版本是 11.1(当然 10.2 也行,这里以 11.1 为例),如下图 ② 再在 windows 命令行里输入nvidia-smi查看当前 cuda 的驱动版本(截图的时候我的电脑是 11.3,后来自己升级成 11.4 了),注意这里的 cuda version 只要大于 torch 官网支持的版本(11.1)就没问题。 ③ 检查完前两步之后,就可以进行第 4 步(在 ubuntu 中安装 cuda toolkit)了。注意:第 4 步中的 toolkit 版本与 torch 官网推荐的 cuda 版本保持一致(以本文为例,第 4 步中安装 cuda toolkit 11.1);同样第 5 步中也应该下载支持 11.1 版本的 cudnn。后续的版本选择按照这个原则即可。

  2. 总的来说:版本关系应该满足两条要求(可以不看):

    1. cuda toolkit(第 4 点),cudnn(第 5 点)和 pytorch 官网支持的 cuda 版本(第 7 点)保持一致。(本文中是 11.1)
    2. cuda toolkit 的版本小于等于 windows 中 cuda 驱动版本。

    解释:cuda 版本分为 “安装时版本”(即在 windows 命令行中通过 nvidia-smi 查看到的版本)和“运行时版本”(即在 ubuntu 命令行中通过 nvcc -V 查看到的版本)。可以简单地理解为,“安装时版本” 是你的 gpu 能够支持的最大版本,而 “运行时版本” 则是实际使用时的版本。这样 cuda toolkit 的版本(运行时版本)小于等于 “安装时版本” 是理所应当的。再者 torch 等实际应用需要和 “运行时版本” 保持一致也是理所应当的。

4. 在 ubuntu 中安装 cuda toolkit

① 在 ubuntu 的命令行中依次输入以下四句命令。(这些命令是官网中 “Setting up CUDA Toolkit” 部分的教程) 注意:命令中的 11-1 根据需要版本的不同自行调整(见上面的注意)。例如:安装 11.0 只需要把后续的 11-1 改为 11-0 即可。

sudo apt-key adv --fetch-keys <http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub>
sudo sh -c 'echo "deb <http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64> /" > /etc/apt/sources.list.d/cuda.list'
sudo apt-get update
sudo apt-get install -y cuda-toolkit-11-1

② 第一步完成且没有错误之后,配置环境变量,在 ubuntu 的命令行中输入,

sudo vim ~/.bashrc

③ 在打开的文件中,按 i 进入编辑模式,并在文件最底部添加:

export PATH=/usr/local/cuda-11.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

④ 保存并退出,回到 ubuntu 命令行,输入

source ~/.bashrc

验证: 在 ubuntu 命令行中输入 nvcc -V ,能够输出 cuda toolkit 信息即可。(如上所述,这里看到的是 “运行时版本”)

5. 在 ubuntu 中安装 cudnn

① 完全按照这里第 4 点的步骤操作即可。(同样要选择和第 4 步中相同的版本,本文是 11.1)

6. 在 ubuntu 中安装 anaconda3

① 在 windows 中下载 anaconda3 的安装文件,并把文件放到 ubuntu 文件系统中。(或者直接在 ubuntu 可视化桌面中打开浏览器下载即可。) ② 在 ubuntu 命令行中进入刚刚下载的. sh 文件所在的文件夹,输入:

bash Anaconda3-5.2.0-Linux-x86_64.sh

之后按照要求,enter、yes 完成安装。验证: 在 ubuntu 命令行中输入 python,显示 anaconda3 默认的 python 版本信息即可。注意: 可能会出现环境变量没有配置导致python命令失效,解决办法是配置一下环境变量,详细做法见这里sudo gedit ~/.bashrc ② 在打开的文件中末行,添加export PATH="/home/wang/anaconda3/bin:$PATH",其中 “wang” 是你自己的 ubuntu 用户名,自行修改(注意这里实际上是 anaconda3 的安装目录,如果在第 6 中没有选择默认目录,这里需要填入安装时自定义的目录) ③ source ~/.bashrc

7. 在 ubuntu 中安装 pytorch

官网中选择最适合自己的版本,按照其给出的命令,输入到 ubuntu 命令行中完成安装。注意: 这一步可能需要梯子,或者自行百度其他离线安装方法(这一步和在 ubuntu 中安装 pytorch 一样,不需要考虑 wsl 和 windows 的影响。)

8. 遇到的问题总结

  1. Win10 linux subsystem libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast

    Win10 linux subsystem libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast

    If you configure Xlaunch it via UI, in the additional parameters add nowgl

    -[no]wgl
        Enable the GLX extension to use the native Windows WGL interface for hardware-accelerated OpenGL
    
  2. 限制WSL2使用的内存大小

    https://github.com/microsoft/WSL/issues/4166

    Create a %UserProfile%\\.wslconfig file in Windows and use it to limit memory assigned to WSL2 VM.

    Example

    [wsl2]
    processors=8
    memory=8GB
    swap=8GB
    localhostForwarding=true
    
  3. WSL2 虚拟磁盘文件空间回收

    https://github.com/maboloshi/Recordum/issues/21

    从 WSL2 微软起将虚拟机磁盘镜像文件转换为vhdx格式,用于存储其内容,类似于vmdk、vdi,用过虚拟机的同学应该都不陌生。

    这种镜像文件的特点是支持自动扩容,即使磁盘镜像文件中已经删除了,但是一般不会自动缩容。因此磁盘镜像文件本身会越来越大。所以需要回收这部分已删除但是实际磁盘镜像文件并没有缩小的空间。

    # 彻底关闭 WSL2 虚拟机
    wsl --shutdown
    # 新开一个 Diskpart 窗口
    diskpart
    # 指定 WSL2 虚拟机磁盘镜像文件位置
    select vdisk file="C:\\WSL-Distros\\…\\ext4.vhdx"
    # 只读 附加磁盘镜像文件
    attach vdisk readonly
    # 压缩 vhdx 磁盘镜像文件
    compact vdisk
    # 分离 vhdx 磁盘镜像文件
    detach vdisk
    # 退出
    exit
    
  4. WSL2挂载虚拟磁盘

    WSL2通过挂载虚拟磁盘解决磁盘读写性能问题

    为了解决磁盘读写性能问题

    1. If you don't have vhdx file, you can generate it using windows disk management tool.
    
    2. Reformat the disk to exFat.
    
    3. Open PowerShell as administrator.
    
    4. Write the following command to mount the disk.
       Write-Output "\\\\.\\PhysicalDrive$((Mount-VHD -Path F:\\ext4.vhdx -PassThru | Get-Disk).Number)"
       wsl --mount \\\\.\\PhysicalDrive3 --partition 1
    
    5. Write the following command to umount the disk.
       wsl --unmount