目录

0. 参考文献

1. 安装WSL2 Ubuntu 20.04

1.1 不太靠谱的新方法

1.2 屡试不爽的老方法

2. 在Windows物理机内安装WSL Cuda驱动

3. 配置WSL2 Ubuntu内部的 cuda-toolkit, cudnn

3.1 WSL2中安装CUDA Toolkit (11.5)

3.2 安装Cudnn

4. 基于Cude10.2的Pytorch配置


0. 参考文献

Using PyTorch with CUDA on WSL2 | Christian MillsThis post covers my experience getting PyTorch to run with CUDA on WSL2.https://christianjmills.com/Using-PyTorch-with-CUDA-on-WSL2/【Win10/11 WSL2 Pytorch-GPU版安装避坑指南(慢更)】_superowner001的博客-CSDN博客https://blog.csdn.net/weixin_44029053/article/details/119480776在WSL2中使用CUDA - 知乎https://zhuanlan.zhihu.com/p/149848405

安装wsl2 + cuda driver for wsl + cuda toolkit + cudnn + pytorch 确实太折磨人了,中间出了无数大大小小的Bug,好几次都不准备搞下去了,但是每次躺下睡觉时候总是忍不住去谷歌一下突然冒出来的念头,好在失败了那么多次,基本的命令行和基本逻辑也开始渐渐清楚了,后来偶然的一次尝试终于把pytorch和cuda成功连通,所以在这里写此文记录一下。

1. 安装WSL2 Ubuntu 20.04

由于我是当时在Win 10 就安好了WSL2,现在升级到了Win 11也无法再复原安装过程,所以这里不会写太多详细的步骤,提供几条我当时用过的blog和教程。

另外,国内的网络问题,可能需要安装的人多操心一下网络下载方面的问题。

1.1 不太靠谱的新方法

微软官方的新的文档很简单,只有一条命令,具体见下方链接:

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

但是第一条命令我的机器上行不通,需要备注一下具体要安装的distro:

wsl --install     #你们可以试试,我的不行,必须定义后面的具体distro

wsl --install -d Ubuntu-20.04    #这个我可以

wsl -l -v   #安装完成后查看版本号

来个中文版教程:

Windows 10/11 安装 WSL2 的简单方法 - 简书本文采用 CC BY-NC-SA 2.5 CN[https://creativecommons.org/licenses/by-nc-sa/2.5/cn/] 协议授权。 前言...https://www.jianshu.com/p/6e7488440db2如果微软的新方法行不通的,别慌,我当时也不行,直接切到第二步老方法。

1.2 屡试不爽的老方法

老文档就是CSDN 或者知乎上一搜一大把的教程,我把官方链接贴上来:
https://docs.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-packagehttps://docs.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-packagehttps://docs.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package总结一下:

1. 命令行激活 Microsoft-Windows-Subsystem-Linux

2. 命令行激活 VirutalMachinePlatform

3. 下载Linux 内核更新包,是个msi文件 (本地下载安装)

4. 把WSL2 设置成默认的Linux子系统(主要是为了和WSL1做区分)

5. 在应用商店内或者是第一步的命令行直接install Ubuntu (前面几步完成后这部可以试试第一步的命令行)

2. 在Windows物理机内安装WSL Cuda驱动

试一下下面链接,能点开的话,根据自己的显卡情况安装CUDA driver on WSL 驱动。

我试验的机器是GTX 1650 Mobile,所以要下载Geforce driver。

CUDA on WSL | NVIDIA Developerhttps://developer.nvidia.com/cuda/wsl/download 下载好的安装包是GUI安装的,看需不需要自定义安装,点就完事了。安装过后用Windows Terminal或者Powershell检查一下驱动状况和Cuda版本,这里直接用命令行“nvidia-smi”检查一下windows物理机上的驱动状况。

切记这里输入nvidia-smi的终端不是linux的terminal,而是Windows的Powershell或者cmd!一定一定注意,nvidia-smi如果输出内容有问题,千万不要在linux terminal里通过命令行安装nvidia driver,cuda driver for wsl 会为我们配置好的,前提是你的Win10/11 版本号达到一定要求。

PS C:\Users\TF> nvidia-smi       #注意这里是WIN10/11的命令,如果你在WSL的终端里面没有结果,别慌

Thu Dec 23 18:14:18 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.06       Driver Version: 510.06       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A   43C    P0    14W /  N/A |    134MiB /  4096MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

我之前没有升级WIN 11,也没有加入dev channel,所以wsl2一直无法正常链接到GPU。以下是在版本受限的WSL2 终端里输入“nvidia-smi”的报错结果:

$ nvidia-smi       #一开始win 10 状态下的wsl2无法输出nvidia驱动信息
Failed to initialize NVML: GPU access blocked by the operating system
Failed to properly shut down NVML: GPU access blocked by the operating system

之后果断升级WIN 11,结果GPU和cuda的信息立马传到wsl2里,甚至还升级了一波wslg,连GUI都被微软官方给装上了,是通过remote desktop 连接的,速度有点慢但还是可以用的。

以上的命令你可以在wsl2的终端内试一下,我当时在win10(未开dev channel状况下),输出的是被宿主机block掉了,但是升级到win11后就好了。

以下是命令行运行代码以及输出:

$ nvidia-smi       #这是升级到WIN 11 后,表示显卡确实可以被Linux子系统检查到了
Thu Dec 23 18:27:28 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.00       Driver Version: 510.06       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0 Off |                  N/A |
| N/A   44C    P0    14W /  N/A |    134MiB /  4096MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


$ neofetch       #WIN11下的wsl2用neofetch也能检测到显卡了,之前win10下是没有显卡的
            .-/+oossssoo+/-.               我机器名字
        `:+ssssssssssssssssss+:`           -------------------
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 20.04.3 LTS on Windows 10 x86_64
    .ossssssssssssssssssdMMMNysssso.       Kernel: 5.10.60.1-microsoft-standard-WSL2
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Uptime: 1 min
  +ssssssssshmydMMMMMMMNddddyssssssss+     Packages: 1762 (dpkg)
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Shell: bash 5.0.17
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Theme: Adwaita [GTK3]
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Icons: Adwaita [GTK3]
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   GPU: ee5e:00:00.0 Microsoft Corporation Device 008e
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Memory: 280MiB / 7852MiB
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

3. 配置WSL2 Ubuntu内部的 cuda-toolkit, cudnn

我看哔哩哔哩有个视频专门讲cuda, toolkit, cudnn这些驱动之间的关系的,评论区有个高赞,是最简pytorch安装教程,说是不用安装cudnn,安装好了物理机cuda driver,装上toolkit,直接装pytorch就好了。确实我是后来有点不想冒险了,就一步一步按着别人说的来了,你们可以跳过cudnn,有兴趣的可以看一下那个视频和评论区。

【PyTorch】B站首个,终于有人把 GPU/ CUDA/ cuDNN 讲清楚了_哔哩哔哩_bilibili1. 不求绝对正确,但求足够直观,希望大家都能理解GPU是如何通过并行来加速计算的,以及CUDA和cuDNN发挥的作用!2. up不是计算机系科班出身的,很多表述可能不大规范,理解上也存在一些偏差,希望大家能多多包涵!https://www.bilibili.com/video/BV15Q4y1i7Bp?p=2

我这里简单把评论复制过来,有需要安装思路的小伙伴看一下:

Shiaoo:

小白朋友们别去折腾这些驱动cuDNN之类,最简gpu pytorch安装教程:
1、cmd输入nvidia-smi看右上角cuda版本
2、装上anaconda或者miniconda换国内源
3、打开anaconda prompt创建一个虚拟python环境:
conda create -n 环境名称 python=3.8
4、激活环境:
conda activate 环境名称
5、去pytorch官网选择对应的pytorch gpu版本比如:
conda install pytorch torchvision torchaudio cudatoolkit=11.3
(去掉了-c pytorch据说是下载更快)
6、等待安装完成后校验是否成功,依次输入:
ipython回车
import torch回车
torch.cuda.is_available()回车
若输出True就妥了

大致就是这个意思,装完cuda toolkit试验一下自己的“nvcc -V”, 有输出的话可以直接跳过cudnn,装好基于10.5的1.10pytorch后看下能否连接到GPU,可以的话就不用这折腾别的驱动了。

3.1 WSL2中安装CUDA Toolkit (11.5)

CUDA Toolkit 11.5 Update 1 Downloads | NVIDIA Developerhttps://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64这个业面一般都是提供最新的cuda toolkit,我安装时(2021年底)是11.5。进入页面后按照自己系统的实际情况选择。

我选择的是Linux-x86-WSL_Ubuntu-2.0-deb(network)

 下面三种方式都可以试一下,我用的是network版:

#依次输入以下命令,切记这里是linux命令,用windows terminal运行ubuntu就很方便

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin

sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/7fa2af80.pub

sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"

sudo apt-get update

sudo apt-get -y install cuda

接下来配置wsl2内部cuda的环境变量:

#这里先打开.bashrc文件
sudo nano /home/$USER/.bashrc
#把这三行复制到文件底部
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
#更新一下bashrc文件
source /home/$USER/.bashrc

#更新一下可能需要的依赖
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

#用以下代码检查cuda是否检查成功,注意此处的cuda版本是你在toolkit下载那里决定的,这个版本可能和nvidia-smi显示的版本号不一样,可高可低,这是因为nvidia给cuda开了两个api,这两个api只要差不是太远,基本都可以保证正常运行cuda
nvcc -V
此处runtime的版本是11.5,不同于系统驱动的11.6,但是无关紧要

nvcc -V如果可以出来结果的话,后面的问题基本上也就不大了,起码如果有问题,也只是pytorch的问题了,这些都可以慢慢解决。

3.2 安装Cudnn

cuDNN Archive | NVIDIA Developerhttps://developer.nvidia.com/rdp/cudnn-archive又是英伟达官网,和前面一样,需要注册个账户,随便用自己常用的邮箱账户注册一下就好,进去之后都是archive的版本号,选择和我们cuda toolkit版本号相匹配的包!

上图给出的是cuda_11.5,所以我们这里就选择 Download cuDNN v8.3.0 (November 3rd, 2021), for CUDA 11.5cuDNN Library for Linux (x86_64)

是个tgz文件,下载到Windows默认的路径就好,反正wsl2可以完全访问我们实体主机的所有文件路径。之后用Ubuntu的命令行cd到保存该包的文件夹,执行以下安装命令。

#以下是安装命令
tar -zxvf cudnn-自己补全版本号.tgz
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-11.5(自己检查具体的版本修改路径)/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda-11.5(自己检查具体的版本修改路径)/include/

#为更改读取权限:
sudo chmod a+r /usr/local/cuda-11.5(自己检查具体的版本修改路径)/include/cudnn.h
sudo chmod a+r /usr/local/cuda-11.5(自己检查具体的版本修改路径)/lib64/libcudnn*

 最后检验一下我们的cuda是否能够正常运行了,cuda自带一个测试文件,我们需要先cd到指令目录,一般都是相同的路径,试一下,如果找不到就看看是不是叫别的名字了。

#找到测试项目BlackScholes
cd /usr/local/cuda/samples/4_Finance/BlackScholes

#进行编译
sudo make

#在当前目录查看编译结果
./BlackScholes
$ ./BlackScholes    #运行后如果输出以下结果就代表cuda运行正常

[./BlackScholes] - Starting...
GPU Device 0: "Turing" with compute capability 7.5

Initializing data...
...allocating CPU memory for options.
...allocating GPU memory for options.
...generating input data in CPU mem.
...copying input data to GPU mem.
Data init done.

Executing Black-Scholes GPU kernel (512 iterations)...
Options count             : 8000000
BlackScholesGPU() time    : 0.722711 msec
Effective memory bandwidth: 110.694321 GB/s
Gigaoptions per second    : 11.069432

BlackScholes, Throughput = 11.0694 GOptions/s, Time = 0.00072 s, Size = 8000000 options, NumDevsUsed = 1, Workgroup = 128

Reading back GPU results...
Checking the results...
...running CPU calculations.

Comparing the results...
L1 norm: 1.741792E-07
Max absolute error: 1.192093E-05

Shutting down...
...releasing GPU memory.
...releasing CPU memory.
Shutdown done.

[BlackScholes] - Test Summary

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

Test passed

最后一行有test passed就代表大功告成了,接下来就是死磕Pytorch的时候了。

4. 基于Cude10.2的Pytorch配置

Pytorch有纯CPU版本,但是我们要用cuda加速训练,所以要下载安装GPU版本。

Start Locally | PyTorchAn open source machine learning framework that accelerates the path from research prototyping to production deployment.https://pytorch.org/get-started/locally/我安装了miniconda,但是虚拟环境给我恶心得不轻,每次一安装完pytorch可以用一下,测试完重启一下wsl2,立马import torch就没有module “torch”了,况且我一般都用Kaggle等服务器跑稍微大一点的任务,所以这次我用pip直接安装在生产环境里。

接下来一定要注意,我当时想着我的cuda driver是11.6,cuda toolkit是11.5,怎么说2021年底时候应该安装个基于cuda 11.3的pytorch,结果一直 print(torch.cuda.is_available()) 输出false,给我心态差点整崩了。

第一行pT版本,第二行我们系统类型,第三行安装包方式(pip事少),第四行如果是用python就选Python,最后一行是选择带不带cuda和具体的cuda版本(一定注意这个版本)

最后会直接生成一个命令行代码,11.3安装命令的代码很长,我就是一开始各种姿势安装了CUDA 11.3 based PyTorch 1.10.1,结果一直连接不到GPU,后来我看了 superowner001 的安装过程,虽然他是2021年中安装的,那时候还是10.2based pT,我寻思了一下,11.5+11.6向下兼容应该没问题吧?于是我就卸载了conda 和 pip下载好的 cuda 11.3 based pT,重新用pip安装10.2 based pT1.10.1,结果终于点亮GPU了!!!!

#用pip安装基于cuda10.2的pytorch 1.10.1
pip3 install torch torchvision torchaudio

#有需要卸载conda或者pip包的可以看着这几条命令,头一次安装的话直接跳过
conda uninstall pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch     #卸conda版
pip3 uninstall torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html

#顺便清理一下多余的包
pip-autoremove somepackage -y

最后来ipython测试一下:

$ ipython
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.30.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import torch

In [2]: torch.cuda.is_available()
Out[2]: True

输出为True基本上就舒服了,接下来用torch加速一些小型的模型,没什么问题了。

有什么问题可以在评论区留言,我不定期会抽空上线查看。

该教程未经本人允许请勿转载到其他平台,多谢 :)))

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐