WSL配置深度学习环境

官网教程

截至2023年11月8日,系统要求,本人使用的是wsl2 Ubuntu20.04wsl版本一定要是2

关于驱动

不需要在wsl中安装驱动,和windows系统共用一个驱动!

登录到wsl的ubuntu中,输入nvidia-smi

root@DESKTOP-SJ490MT:~# nvidia-smi
Thu Nov  9 20:20:48 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.01              Driver Version: 546.01       CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4060 Ti     On  | 00000000:01:00.0  On |                  N/A |
|  0%   42C    P8              10W / 165W |    672MiB / 16380MiB |      3%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A        23      G   /Xwayland                                 N/A      |
+---------------------------------------------------------------------------------------+

在wsl中没有显示使用显卡的windows进程。

安装cuda和cudnn准备

  1. 以root用户登录ubuntu子系统,打开cmd窗口

    wsl --user root
    

    为了方便后续开发,本人习惯root直接登录,可以修改wsl的默认登录用户,这样使用pycharm可以直接连接到wsl的python解释器。

    C:\Users\用户名\AppData\Local\Microsoft\WindowsApps目录下,打开cmd窗口,执行

    ubuntu2004.exe config --default-user root
    
  2. 查看硬件

    在wsl中,图形适配器显示为Microsoft Corporation设备(微软自己改的),自己知道自己显卡型号就行了,本人是4060ti。

    root@DESKTOP-SJ490MT:~# lspci | grep -i microsoft
    27c9:00:00.0 3D controller: Microsoft Corporation Device 008e
    39e1:00:00.0 3D controller: Microsoft Corporation Device 008e
    
  3. 升级软件包,本人使用ubuntu官方源速度也很快,有需要可以换成其他源

    apt update && apt upgrade
    
    # 换成阿里源
    # sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
    
  4. 查看系统信息

    root@DESKTOP-SJ490MT:~# uname -m && cat /etc/*release
    x86_64
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=20.04
    DISTRIB_CODENAME=focal
    DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"
    NAME="Ubuntu"
    VERSION="20.04.6 LTS (Focal Fossa)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 20.04.6 LTS"
    VERSION_ID="20.04"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=focal
    UBUNTU_CODENAME=focal
    
  5. 安装gcc等工具

    apt install build-essential -y
    gcc --version # 9.4.0
    
  6. 安装内核头文件(或许非必要?)

    下面这段来自官方CUDA安装教程,但是驱动都可以和windows共用了,或许没啥影响,但本人做了这步操作

    nvidia驱动程序需要内核头文件和开发包,并且一旦内核版本改变,驱动程序也需要重新编译安装。Runfile安装方式不对内核相关包做任何检验,但是RPM和DEB包则会检验,如果没有内核相关包,安装程序将自动安装这些包的最新版本,可能不匹配当前内核。因此,最好在安装驱动程序和CUDA之前,安装内核相关包的正确版本,否则可能出现各种各样的问题。

    root@DESKTOP-SJ490MT:~# uname -r
    5.15.90.1-microsoft-standard-WSL2
    

    下载微软wsl2的git仓库下载指定版本的内核源码,拷贝到wsl中

    apt install unzip
    cp /mnt/d/WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1.zip /usr/src
    cd /usr/src
    unzip  ./WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1.zip
    

    安装依赖并编译,编译需要比较长的时间

    apt install build-essential flex bison dwarves libssl-dev libelf-dev -y
    cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1
    make KCONFIG_CONFIG=Microsoft/config-wsl -j $(nproc)
    make KCONFIG_CONFIG=Microsoft/config-wsl modules_install -j $(nproc)
    

​ 此时可以看到在/lib/modules目录下生成和当前内核版本一致的文件夹,并有只想源代码文件夹的软链接

root@DESKTOP-SJ490MT:~# ll /lib/modules/5.15.90.1-microsoft-standard-WSL2/
total 236
drwxr-xr-x 3 root root   4096 Nov  8 21:14 ./
drwxr-xr-x 3 root root   4096 Nov  8 21:16 ../
lrwxrwxrwx 1 root root     48 Nov  8 21:07 build -> /usr/src/WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1/
drwxr-xr-x 2 root root   4096 Nov  8 21:14 kernel/
-rw-r--r-- 1 root root     45 Nov  8 21:14 modules.alias
-rw-r--r-- 1 root root     12 Nov  8 21:14 modules.alias.bin
-rw-r--r-- 1 root root  15426 Nov  8 21:14 modules.builtin
-rw-r--r-- 1 root root  45653 Nov  8 21:14 modules.builtin.alias.bin
-rw-r--r-- 1 root root  17880 Nov  8 21:14 modules.builtin.bin
-rw-r--r-- 1 root root 116066 Nov  8 21:14 modules.builtin.modinfo
-rw-r--r-- 1 root root      0 Nov  8 21:14 modules.dep
-rw-r--r-- 1 root root     12 Nov  8 21:14 modules.dep.bin
-rw-r--r-- 1 root root      0 Nov  8 21:14 modules.devname
-rw-r--r-- 1 root root      0 Nov  8 21:14 modules.order
-rw-r--r-- 1 root root     55 Nov  8 21:14 modules.softdep
-rw-r--r-- 1 root root     49 Nov  8 21:14 modules.symbols
-rw-r--r-- 1 root root     12 Nov  8 21:14 modules.symbols.bin
lrwxrwxrwx 1 root root     48 Nov  8 21:14 source -> /usr/src/WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1/

安装cuda

非常简单,去官网下载需要的版本即可,nvidia-smi显示的是当前驱动最高支持的cuda版本,windows上驱动更新频繁,一般都能支持最新的cuda,不过不建议下载最新的,我这里下载的是12.2。下载的时候选择wsl-ubuntu,然后网站下边的命令就能安装了。

添加环境变量,本人是在/etc/profile.d/cuda.sh中添加,也可以~/.bashrc,.profile文件中,了解它们之间的区别即可。

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

验证安装成功

source /etc/profile.d/cuda.sh
nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
Build cuda_12.2.r12.2/compiler.32965470_0

安装cudnn

到这里和在linux系统上安装cudnn已经没有什么区别了,可以参考我写的另一篇文章

Python环境和测试

剩下就是配置python虚拟环境并测试了,配置和使用上和在ubuntu系统上没啥区别,本人试着跑了Qwen-7B,编译了fastllm,都没有问题。
5b785dd97499426ea17309714789f434

注意事项

  1. 在wsl2上相比直接在windows上某些程序会略有性能损失。
  2. 不要跨系统读写文件,性能损失严重。

Q.E.D.


一切很好,不缺烦恼。