Sparsebev环境问题(CUDA Runtime和nvcc 编译器版本冲突)和训练时间问题


前言

记录一下碰到的CUDA运行时库和nvcc编译器问题,以及训练时间问题:

配置sparsebev环境时一直报CUDA版本错误,

RuntimeError:
      The detected CUDA version (10.2) mismatches the version that was used to compile
      PyTorch (11.8). Please make sure to use the same CUDA versions.

但是我执行:

(sparsebev) lm@ubuntu-server:/data1/wjx/SparseBEV/models/csrc$ python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available())"
2.0.0
11.8
True
(sparsebev) lm@ubuntu-server:/data1/wjx/SparseBEV/models/csrc$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

我看sparsebev虚拟环境下就是CUDA-11.8啊,但是为啥nvcc --version之后就显示CUDA-10.2了呢?

下面从两个概念开始


一、CUDA运行时库和nvcc编译器都是什么?

1.1 概念

执行nvidia-smi

| NVIDIA-SMI 555.42.06              Driver Version: 555.42.06      CUDA Version: 12.5     |
|-----------------------------------------+------------------------+----------------------+
| 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. |

上面显示的就是CUDA的运行时库的版本,那什么是CUDA的运行时库(CUDA Runtime)?CUDA Runtime 是一个高级API,封装了底层的CUDA驱动程序API(Driver API)

这是NVIDIA 提供的一组预先写好的程序代码(库文件),它的作用是让你的程序(比如 PyTorch)能够直接使用 GPU 来运行计算任务,而不需要你自己从头编写复杂的 GPU 指令。在系统中,它通常是 libcudart.so(比如 libcudart.so.11.8),是运行时库的核心文件。

简单比喻:就像一个“外卖汉堡”,你直接拿来吃,不用自己去种小麦、养牛、做面包。CUDA 运行时库是已经做好的“汉堡”,帮你快速用 GPU。

执行nvcc -V

(sparsebev) lm@ubuntu-server:/data1/wjx/SparseBEV/pretrain$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

nvcc -V就是CUDA 编译器(NVIDIA CUDA Compiler)。

它是CUDA Toolkit中的核心编译器工具,用于将CUDA代码(通常以.cu扩展名标识)编译成可在NVIDIA GPU上运行的二进制代码(比如 .so 文件)。

编译过程本身不依赖运行时库,只依赖 nvcc

在这里插入图片描述

1.2 错误原因

RuntimeError:
      The detected CUDA version (10.2) mismatches the version that was used to compile
      PyTorch (11.8). Please make sure to use the same CUDA versions.

之所以出现这个问题,就是说明你的项目代码需要CUDA 编译器,但是你conda install只安装了CUDA运行时库,没有安装编译器。

conda install pytorch==2.0.0 torchvision==0.15.0 pytorch-cuda=11.8 -c pytorch -c nvidia

安装CUDA 运行时库,可以让 PyTorch 能跑 GPU 代码。

python -c "import torch; print(torch.cuda.is_available())"

以上命令输出 True,是因为 PyTorch 用CUDA 运行时库直接跟 GPU 通信。但是你没法编译 CUDA 代码(比如 .cu 文件),因为没有下载 nvcc。

【之所以报匹配的错误,是因为编译时,用到了系统目录中的CUDA 12.2的编译器版本】

1.3 下载CUDA完整工具包(包括 nvcc)

1.3.1 下载并安装(不用sudo权限):

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
chmod +x cuda_11.8.0_520.61.05_linux.run
./cuda_11.8.0_520.61.05_linux.run --no-opengl-libs --toolkit --installpath=
### NVCCCUDA的关系 NVCC(NVIDIA CUDA Compiler)是CUDA Toolkit中的一个重要组成部分,专门用于编译含有CUDA扩展的语言源文件(通常以`.cu`结尾)。它不仅能够处理标准C/C++代码,还支持特定于CUDA的语法功能[^1]。 当开发者编写涉及GPU加速的应用程序时,如果这些应用程序包含了CUDA特有的语法规则或调用了CUDA库函数,则需要借助NVCC来完成编译工作。具体来说: - **角色定位**:NVCC作为编译器驱动程序,在整个开发流程中扮演着核心角色。它可以识别并分离主机端(Host Code)设备端(Device Code),分别对其进行优化后再组合成最终可执行文件。 - **集成特性**:除了基本的编译能力外,NVCC还能与其他工具链无缝协作,比如链接必要的CUDA运行时库(`libcudart`)或其他高性能计算库如cuBLAS (`libcublas`) cuFFT (`libcufft`)等[^4]。 对于希望利用CUDA技术实现高效能数据处理或者机器学习训练任务的研究人员技术人员而言,掌握如何正确配置及运用NVCC至关重要。 以下是关于设置环境变量以及简单示例展示如何使用NVCC来进行项目构建的过程说明: #### 设置环境变量 为了使系统能找到所需的头文件库文件位置,建议先设定好PATH与LD_LIBRARY_PATH两个重要环境变量: ```bash export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH ``` #### 编写简单的CUDA程序 下面是一个非常基础的例子——向量加法操作演示了怎样定义核函数(kernel function),分配内存空间给GPU,并传输数据到那里进行实际运算之后再取回结果回到CPU侧继续后续逻辑处理的部分代码片段: ```cpp #include <cuda_runtime.h> #include <iostream> __global__ void add(int *a, int*b ,int*c){ c[blockIdx.x]= a[blockIdx.x]+b[blockIdx.x]; } int main(){ const int arraySize = 5; int h_a[arraySize]={1,2,3,4,5}; int h_b[arraySize]={10,20,30,40,50}; // Allocate device memory... } ``` 接着就是采用如下命令行方式去触发编译动作并将生成的目标二进制文件命名为example.out : ```bash nvcc vectorAdd.cu -o example.out -lcudart ./example.out ``` 以上步骤展示了从零开始创建基于CUDA架构下的应用实例所需经历的主要环节之一瞥见. ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值