Apex的Cuda版本与Pytorch的Cuda版本不匹配(无root权限)

最新编辑于:2023年11月19日15:20:30

摘要

这个年代了谁还用apex啊!Pytorch自带的不好用吗?说的就是你,Megatron!


要解决这个问题,我们需要安装和Pytorch版本一致的cuda。然后再安装apex。

先简单说下步骤:

  1. 下载cuda的安装程序,然后安装在无需root权限的目录。
  2. 下载cudnn,把一些文件移到cuda的目录下。
  3. 修改.bashrc里的环境变量。

从上面也能看出来,安装只有在第3步做完才会生效。所以可以随时停止。即便安装完了,只要把环境变量复原,也就可以回到最初没有安装的状态。

那么,我究竟要安装什么版本的 cuda 呢?

  1. 如果你已经安装了 pytorch,那么你可以根据 apex 的报错,得知编译了 pytorch 的 cuda 版本,然后安装这个版本的。
  2. 当然,你也可以选择安装最新的 cuda 版本,然后重新下载安装 pytorch 。

步骤

1. 下载cuda


地址在这:https://developer.nvidia.com/cuda-downloads 。注意,我们要下载的是 runfile(local) 文件。也就是说能在命令行运行的文件。如下图所示:

选中后,网页会提供下载指令, 比如:

wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda_12.3.0_545.23.06_linux.run

这里默认提供最新的几个版本的cuda。如果要安装历史版本,请下拉这个页面,在 "Resources" 里找到 "Archive of Previous CUDA Releases"。

2. 安装cuda


(以下几节参考了文章:https://blog.csdn.net/weixin_42262721/article/details/108278214 。)

下载完成后,bash cuda_10.1.105_418.39_linux.run(注意,没有 sudo。)

一、敲下accept。

没什么好说的。

二、只选择CUDA Toolkit。

取消其他的安装,但是要全部安装CUDA Toolkit里的东西(用方向键→可以查看),包括compiler啥的,不然会没有nvcc。

本节开头提到了一个参考文章,这个文章说不要安装 compiler ,但根据本人亲测,如果不安装,后续会有问题,所以安装了,可根据个人情况尝试。

三、修改安装路径,然后安装。

在上图显示的界面中,移动到 CUDA Toolkit, 按A跳到Advanced options,会出现如下界面:

  1. 回车进入 “Change Toolkit Install Path”,输入不需要 sudo 权限的文件夹,比如用户目录。
  2. 取消其他所有的√。

四、Done、Install。

3. 安装 cuDNN


一、下载、解压。

下载链接在这:https://developer.nvidia.com/rdp/cudnn-archive 。根据 CUDA 的版本选择合适的 cuDNN。

下载 tar 文件,比如 Local Installer for Linux x86_64 (Tar)

二、把解压的文件夹里的一些东西copy到cuda安装目录下。

假如 cuDNN 的安装路径是 cudnn/,cuda 的安装路径是 cuda12.1。那么:

cp cudnn/include/cudnn.h cuda12.1/include/
cp cudnn/lib/libcudnn* cuda12.1/lib64/
chmod a+r cuda12.1/include/cudnn.h
chmod a+r cuda12.1/lib64/libcudnn*

注意事项:第二行命令中,我们将文件从cudnn的lib文件夹,拷贝到cuda的lib64文件夹下。这是因为,我下载的版本的cudnn,只有lib文件夹,没有lib64。参考文章的 cuDNN 里有lib64,那就将第一个lib改成lib64就行。

三、修改环境变量

~/.bashrc中添加几行命令。下面直接拷贝参考文章:

export CUDA_HOME=cuda12.1/
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

碎碎念:第三行,export LD_LIBRARY_PATH 这行,看着好高端啊,我试着让 ChatGPT 说明了一下:

export LD_LIBRARY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64 有什么区别吗?

ChatGPT:这两个命令都是在设置环境变量 LD_LIBRARY_PATH,它们的目的是让系统知道在哪里可以找到动态链接库。这在一些需要用到特定版本库的程序中是非常重要的。

命令 export LD_LIBRARY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 是在 LD_LIBRARY_PATH 已经存在的情况下,在其原有值前面添加 $CUDA_HOME/lib64。如果 LD_LIBRARY_PATH 不存在或为空,那么 LD_LIBRARY_PATH 就会被设置为 $CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 这部分的语法意味着,只有当 LD_LIBRARY_PATH 非空时,才会在 $CUDA_HOME/lib64 后面添加 :LD_LIBRARY_PATH 的当前值。

命令 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64 是在 LD_LIBRARY_PATH 已经存在的情况下,在其原有值后面添加 $CUDA_HOME/lib64。如果 LD_LIBRARY_PATH 不存在或为空,那么 LD_LIBRARY_PATH 就会被设置为 :$CUDA_HOME/lib64,即其值将以冒号开始。

这两个命令的主要区别在于新添加的库路径是被放在原有路径的前面还是后面。当系统加载动态链接库时,它会按照 LD_LIBRARY_PATH 中的顺序从左到右搜索库。因此,如果 $CUDA_HOME/lib64 中的库和 LD_LIBRARY_PATH 中其他位置的库有冲突,那么这两个命令的效果就会有所不同。前者会优先使用 $CUDA_HOME/lib64 中的库,而后者会优先使用 LD_LIBRARY_PATH 原有路径中的库。

四、重启终端

不会有人在修改了~/.bashrc后既不重启终端,也不source一下吧?

4. 大功告成


参考文章中列举了命令,用于检验有没有安装成功啥的,我试了下,我这什么反应都没有,别试了。反正能用就行。

5. 失败经验


虽说上面的安装流程有板有眼的,但还是会遇到很多头疼的问题。

没必要安装太新的 cuda。

在我这时候,安装 torch,只有两个选项,要么 cuda11.8,要么是 12.1。我试了下安装 12.1,结果在运行代码时报错,说是驱动太老。因为我没有 root 权限,也更新不了驱动,怎么办呢?

https://pytorch.org/get-started/previous-versions/ 这个网站里,可以找到 pytorch 历史版本,以及不需要那么新 cuda 的版本。相中一个命令,重新安装它所需要的 cuda 版本。


安装 apex 中途编译出错 / 安装成功但 import 失败。

正如上一条所说,我一开始安装了 12.1 的 cuda,然后安装了 pytorch,然后安装了 apex。

因为发现驱动太老,于是我删除了这个虚拟环境,接着在新环境里,重新安装了 11.7 的 cuda,安装了 pytorch,然后进入了之前克隆的 apex 项目,安装了 apex。

这里要注意!因为 apex 的安装会编译,编译取决于当前的 cuda 和 pytorch,而且 apex 的编译结果会缓存留着以后复用。这意味着我使用了先前 cuda 编译的 apex,于是运行代码,也是个大写的寄。

这里的解决方法是删除 apex,卸载 pytorch,重新来过。


apex 自己的问题 12 errors detected

参考这个网站 https://github.com/NVIDIA/apex/issues/1735 。 如果安装失败,或许是当前代码有错误(2023年11月12日01:47:21)。

如果遇到 12 errors detected in the compilation of "csrc/update_scale_hysteresis.cu". 什么的,或许需要做的是安装老版本的 apex。

据说这是因为 apex 与某些 pytorch 版本不兼容。

结语

完了。都完了。有什么要修改的,没讲清楚的,留言便是了。

posted @ 2023-09-28 18:20  ysngki  阅读(842)  评论(0编辑  收藏  举报