WLS2安装CUDA保姆级教程

WLS2安装CUDA保姆级教程

目前很多服务器是unix系统或者linux系统,想学习Linux系统上调用GPU进行程序加速,但是没有Linux系统设备,要弄双系统也觉得麻烦。Windows系统有一个适用于Linux的windows子系统,叫做WSL,可以在Windows下使用Linux编程。因此这篇文章就是记录自己在wsl上安装cuda并进行程序测试的过程。

安装过程中由于ubuntu系统、NVIDIA显卡驱动以及cuda版本(包括后面可能安装pytorch等一些包)的适配问题,会有非常多的坑,因此,明确自己各个设备的版本十分有必要。

本人的设备以及要安装的软件系统包括:
NVIDIA GeForce GTX 750 ti显卡
NVIDIA 显卡驱动472.212
ubuntu22.04
cuda11.4

确认装好wsl2并设置为默认版本,同时安装ubuntu子系统

这个网上有很多教程,自己找个装就好了。这里贴一个:
Win11 WSL2 安装教程
我按照上面的教程,安装了wls2+ubuntu22.04。
注意,ubuntu安装过程会附带安装某个版本的gcc、g++,但是这个版本可能会与cuda版本不匹配,这个我们会讲。

安装cuda

此处参考教程:如何使用 GTX750 或 1050 显卡安装 CUDA11+win11 WSL ubuntu安装CUDA、CUDNN、TensorRT最有效的方式_wsl安装cudnn-CSDN博客

step1 查询当前驱动程序以及可安装的最高cuda版本

要安装 CUDA 的条件是电脑有独立显卡,并且显卡是英伟达也就是 N 卡。打开“控制面板”,点击“硬件和声音”,找到“NVIDIA控制面板”并打开,点击“系统信息”。
打开NVIDIA控制面板
查看驱动版本号
查看最高支持的cuda版本
“显示”里面可以看到当前驱动的版本。“组件”里面可以看到支持当前驱动的最高cuda版本。如果你想下载高版本cuda,那么就需要更新显卡驱动程序了。

或者打开命令行窗口,输入:

nvidia-smi

nvidiasmi命令
也可以看到驱动程序版本和最高支持的cuda版本。如果 cmd 输入后找不到该命令,需要把 “C:\Program Files\NVIDIA Corporation\NVSMI” (监控工具默认位置) 添加到 “path” 的环境变量中。可以看一下上面的参考链接。

step2 更新NVIDIA显卡驱动程序

首先查看显卡的型号,打开“任务管理器”,点击“性能”,找到GPU,这里将显示显卡的型号。查看显卡型号
然后下载显卡驱动。进入英伟达驱动下载网站:NVIDIA Driver Downloads.选择对应显卡型号的驱动程序并下载一个最新的。
下载显卡驱动
下载完之后双击进行安装。安装之后可以把原来版本的驱动程序给卸载。
卸载老版驱动
重启计算机之后,驱动程序应该更新到了下载好的版本!可以在Step1再次查看是否更新成功,并且查看当前最高支持的cuda版本。

step3 安装对应版本的cuda

打开网站developer.nvidia.com/cuda-toolkit-archive,找一个满足条件的cuda版本,比如我的驱动程序最高支持cuda11.4,于是选择cuda11.4.0.按照如图所示选择,下面会显示下载的指令。
cuda各个版本
下载对应版本cuda
之后,我们以管理员身份运行命令行窗口,并输入wsl切换至ubuntu系统。然后依次输入上面的下载指令。
切换wsl-ubuntu系统
注意,安装过程可能会出现如下问题:

  • 运行安装指令时,出现apt-key过时的问题:
W: http://mirrors.aliyun.com/kubernetes/apt/dists/kubernetes-xenial/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

可以直接忽略,也可以参考链接:ubuntu 安装 cuda-CSDN博客以去除“warning”代码提示。

  • 出现libcufile11-4没有安装的问题:
The following packages have unmet dependencies:
 libcufile-11-4 : Depends: liburcu6 but it is not installable
E: Unable to correct problems, you have held broken packages.

参考链接: WSL2 Ubuntu22.04 + 3070安装cuda11.6 +Pytorch1.13.0全纪录_wsl ubuntu cuda-CSDN博客进行解决。

安装时间可能比较长,耐心等待就好。

step4 将cuda添加至环境变量

使用cd ~命令切换至用户文件夹下,并用nano文本编辑器(没有这个就sudo install nano)打开.bashrc文件。

nano .bashrc

编辑bashrc

#config cuda
export CUDA_HOME=/usr/local/cuda-11.4 
export PATH=$PATH:$CUDA_HOME/bin       
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/extras/CUPTI/lib64

ctrl+X退出,Y保存,enter确定。然后输入:

source ~/.bashrc

环境变量生效。

如果这几步没有问题,cuda程序就安装好了,使用命令:

nvcc --version

如果安装成功,会输出类似如下信息:
nvcc

四、利用VScode运行cpp测试代码

确保windows下面安装了vscode,安装教程可以网上找。

首先安装WSL插件,确保WSL-Ubuntu系统下也能调用vscode。

在命令窗口,创建cpp文件夹并用vscode打开:

mkdir myproject
cd myproject
mkdir cpp
cd cpp
code .

在该文件夹下创建一个test.cu文件,并输入下面的测试代码并保存:

#include <stdio.h>

__global__ void myKernel() 
{
    printf("Hello, world from the device!\n"); 
} 

int main() 
{ 
    myKernel<<<4,4>>>(); 
    cudaError_t cudaError = cudaGetLastError();
    if (cudaError != cudaSuccess) {
        printf("CUDA error: %s\n", cudaGetErrorString(cudaError));
        return 1;
        }
        else {
            printf("No CUDA error\n");
            }
     cudaDeviceSynchronize();
} 

该代码调用4个线程块,每个线程块有4个线程,因此将会输出16个"Hello, world from the device!".
新建一个终端,在终端输入下面指令进行编译:

nvcc test.cu -o test

输入下面指令进行运行:

./test

如果输出结果为16个"Hello, world from the device!",那么测试成功!你已经可以成功调用GPU进行编程!

注意,也有可能出现如下的问题:

  • 回顾开头说的,出现gcc,g++版本不匹配的问题:
#error -- unsupported GNU version! gcc versions later than 10 are not supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
      |  ^~~~~

解决方法: 这说明cuda不支持ubuntu自带的gcc版本,因此我们需要重新安装gcc和g++,参考解决链接CUDA与我的gcc版本不兼容 | 码农家园 (codenong.com)。在命令行窗口依次执行以下命令:

# 安装支持的gcc版本
sudo apt-get install gcc-10
sudo apt-get install g++-10

# 更改软连接
cd /usr/bin
sudo rm gcc
sudo rm g++
sudo ln -s /usr/bin/gcc-10 gcc
sudo ln -s /usr/bin/g++-10 g++
  • cuda内核无法调用的问题:
CUDA error: no kernel image is available for execution on the device

解决方法: 在cuda调用GPU内核时,会默认指定GPU架构,不同版本cuda可能会有差异?如果默认的架构与我们的显卡架构不一致,就会出现内核无法调用的问题。按照链接CUDA GPUs - Compute Capability | NVIDIA Developer,查找显卡的算力。
各显卡算力对应
比如我的GTX 750 ti算力为5.0,因此算力架构为compute_50 sm_50,编译cpp代码时指定相应GPU架构编译再运行就不会出现上面的问题了。

nvcc -arch=compute_50 -code=sm_50 test.cu -o test

如果不想每次编译时都这么复杂,那也可以为nvcc设置别名,用nano编辑.bashrc并在末尾加入:

#  命名一个别名,以指定调用gpu的架构
alias nvcc='nvcc -arch=compute_50 -code=sm_50'

保存并source。这样,运行:

nvcc test.cu -o test

和运行上面指定GPU架构的编译命令就没什么区别了。

  • 更多问题欢迎一起讨论~

五、一些思考

个人感觉GPU可以看作CPU的一个辅助工具,用于快速的流水线作业,而CPU则是大脑发出生产的指令。cuda搭起了CPU指挥GPU的通信桥梁。所以CUDA的版本,GPU的版本都会影响二者之间建立联系。因此安装过程格外需要注意版本问题以及一些调用指令。

最后再次感谢文中出现的博客,讨论贴链接,学习了很多。抱拳了~

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值