首页 > Python资料 博客日记

VMamba 安装教程(无需更改base环境中的cuda版本)

2024-09-25 11:00:05Python资料围观171

本篇文章分享VMamba 安装教程(无需更改base环境中的cuda版本),对你有帮助的话记得收藏一下,看Python资料网收获更多编程知识

导航

背景

最近有不少小伙伴在 Linux 上安装 VMamba (VMamba: Visual State Space Model)时,按照官方的安装命令会遇到各种各样的错误,部分错误可以按照 Mamba 以及 Vim 中相似的方法进行处理(参考笔者之前的博客:Mamba 环境安装踩坑问题汇总及解决方法),但是有些问题无法解决,特此汇总。注意,即使base环境中安装的 CUDA 版本过低,也不影响 Mamba,Vim 以及 VMamba 环境的正常安装。

安装问题 / 资源自取 / 论文合作想法请+vx931744281

Linux 下正确安装命令

运行之前需要下载好 Vmamba 官方的源码,用 git 下载方式如下:

git clone https://github.com/MzeroMiko/VMamba.git

下面分别是 CUDA 12.1 和 CUDA 11.8 两种环境的安装,由于此时 CUDA 的内核以及相关文件均安装在虚拟环境中,可以不考虑base环境里 CUDA 的版本。具体安装哪个版本由读者自由选择。环境安装成功的关键是最后一步是否能编译成功。

CUDA 12.1

conda create -n vmamba python=3.10
conda activate vmamba
conda install cuda-nvcc==12.1.105
pip install -r requirements.txt
conda install nvidia/label/cuda-12.1.0::libcusparse-dev  # 可选,根据最后一步报错
conda install nvidia/label/cuda-12.1.0::libcublas-dev  # 可选,根据最后一步报错
conda install nvidia/label/cuda-12.1.0::libcusolver-dev  # 可选,根据最后一步报错
conda install libxcrypt  # 可选,根据最后一步报错
cd kernels/selective_scan && pip install .

CUDA 11.8

conda create -n vmamba python=3.10
conda activate vmamba
conda install cudatoolkit==11.8
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
pip install setuptools==68.2.2
conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc
pip install -r requirements.txt
conda install nvidia/label/cuda-11.8.0::cuda-cudart-dev  # 可选,根据最后一步报错
conda install nvidia/label/cuda-11.8.0::libcusparse-dev  # 可选,根据最后一步报错
conda install nvidia/label/cuda-11.8.0::libcublas-dev  # 可选,根据最后一步报错
conda install nvidia/label/cuda-11.8.0::libcusolver-dev  # 可选,根据最后一步报错
cd kernels/selective_scan && pip install .

最后一步编译不成功

其中的部分命令实际是根据最后一步报错倒推的,根据大家实际环境的不同因人而异。最后一步的 selective_scan 笔者已经打包出 whl 安装包,见 selective-scan-0.0.2-cp310-cp310-linux-x86-64.whl (CUDA 12.1 不含core)。可联系本人vx自取,安装命令为:

pip install selective_scan-0.0.2-cp310-cp310-linux_x86_64.whl

selective-scan(CUDA 11.8 包含selective_scan_core)的whl 为:selective-scan(CUDA 11.8 包含core)
selective-scan(CUDA 12.1 包含selective_scan_core)的whl 为:selective-scan(CUDA 12.1 包含core)

报错及解决(20240714)

几乎所有的报错都集中在最后一步的编译上,总结如下。

1. 基本报错信息

出现报错:

Building wheels for collected packages: selective_scan
  Building wheel for selective_scan (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [61 lines of output]
      
      
      torch.__version__  = 2.3.1+cu121

...
...
...

 [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for selective_scan
  Running setup.py clean for selective_scan
Failed to build selective_scan
ERROR: Could not build wheels for selective_scan, which is required to install pyproject.toml-based projects

只有编译过程中出现错误,就会以这种输出结尾。因此,本段输出开头和结尾的报错信息毫无用处,需要重点查看中间部分的报错输出。如以下画框部分。

2. CUDA version mismatch

报错如下:

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

原因是 CUDA 版本和 PyTorch 支持的CUDA版本不一致。解决方案为 升高 CUDA 版本降低 PyTorch 支持的版本,即:

conda uninstall cudatoolkit  # 如果之前装了cudatoolkit,先卸载;其最高版本只有11.8
conda install cuda-nvcc==12.1.105

或者先卸载高版本的pytorch,然后

pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118

注意,不指定 index-url 会默认安装CUDA最新版本的pytorch。

3. fatal error: cusparse.h

出现报错 fatal error: cusparse.h: No such file or directory,如下:

....
xxxx/vmamba/lib/python3.10/site-packages/torch/include/ATen/cuda/CUDAContextLight.h:7:10: fatal error: cusparse.h: No such file or directory
          7 | #include <cusparse.h>
            |          ^~~~~~~~~~~~
      compilation terminated.

网传方法

网上有些博客的方法治标不治本,例如:

解决方法

解决方法是安装相关的环境,有两种解决方法:

  1. 更好的解决方法是利用 conda 安装 libcusparse-dev 来解决,笔者发现,在 Anaconda 官方网站中,在 nvidia 仓库 下面存在合适的包可供下载,它们将 CUDA 的各个核心算子都写成了可供 conda 安装的包。因此,缺少什么CUDA头文件,均可以从这个仓库里找到合适的包。因此,此处的命令是:conda install nvidia/label/cuda-12.1.0::libcusparse-dev

4. fatal error: cublas_v2.h

出现报错 fatal error: cublas_v2.h: No such file or directory,如下:

....
xxxx/vmamba/lib/python3.10/site-packages/torch/include/ATen/cuda/CUDAContextLight.h:7:10: fatal error: cublas_v2.h: No such file or directory
            | #include <cublas_v2.h>
            |          ^~~~~~~~~~~~
      compilation terminated.

原因同报错3,因此解决方法为:conda install nvidia/label/cuda-12.1.0::libcublas-dev

5. fatal error: cusolverDn.h

出现报错 fatal error: cusolverDn.h: No such file or directory,如下:

....
xxxx/vmamba/lib/python3.10/site-packages/torch/include/ATen/cuda/CUDAContextLight.h:7:10: fatal error: cusolverDn.h: No such file or directory
            | #include <cusolverDn.h>
            |          ^~~~~~~~~~~~
      compilation terminated.

原因同报错3,因此解决方法为:conda install nvidia/label/cuda-12.1.0::libcusolver-dev

6. fatal error: crypt.h

出现报错 fatal error: crypt.h: No such file or directory,原因同报错3,但此时 nvidia 下已经找不到对应的包了,出现报错的位置变成了 Python。

网传方法

有的博客先在Ubuntu中使用apt命令安装必要的库,针对虚拟环境调整文件路径,以及通过conda-forge渠道安装libxcrypt。(博客:crypt.h:No such file or directory 亲测

方法较为复杂,不推荐且无必要,一般需要管理员权限。

解决方法

受网上博客最后一步启发,在Anaconda 官方网站 conda-forge 仓库 发现了一个包——libxcrypt,因此解决方法为:conda install libxcrypt

7. fatal error: cuda_runtime.h

配置 CUDA 11.8 版本时,发现最后一步编译出现错误,fatal error: cuda_runtime.h: No such file or directory

....
cc1plus: fatal error: cuda_runtime.h: No such file or directory
      compilation terminated.

参考博客 如何在anaconda环境中安装cuda.h和cuda_runtime.h,得到具体的anaconda环境下的解决方法:

conda install nvidia/label/cuda-11.8.0::cuda-cudart-dev  # 根据CUDA版本

报错及解决(20240715)

8. 正常安装 Vmamba 找不到找不到 selective_scan_cuda 模块

VMamba 中遇到selective_scan_cuda 模块

  • No module named 'selective_scan_cuda'

VMamba 的代码和 Mamba 是独立的,如果想有 selective_scan_cuda 包,则需要安装 mamba_ssm,参考之前博客:

注意,mamba 的这个包在Vmamba里面不是必须的。

9. 无法导入selective_scan_cuda_oflex和selective_scan_cuda_core模块

同时出现以上报错,一般因为安装的是Mamba 而不是 VMamba,Mamba 安装成功后环境中本来就没有selective_scan_cuda_oflex和selective_scan_cuda_core模块,请按前文 Vmamba 正确的顺序安装 Vmamba的环境。

10. 正常安装 Vmamba 找不到 selective_scan_cuda_core 模块

除了selective_scan_cuda_core 模块,还有可能找不到 selective_scan_cuda_nrow 模块,这是因为在编译 selective_scan 时,在 setup.py 第40行选用的模式只有 [‘oflex’]

MODES = ["oflex"]
# MODES = ["core", "ndstate", "oflex"]
# MODES = ["core", "ndstate", "oflex", "nrow"]

改为:

MODES = ["core", "oflex"]
# MODES = ["core", "ndstate", "oflex"]
# MODES = ["core", "ndstate", "oflex", "nrow"]

修改此处再编译即可。注意,该模块也不是必须的。而ndstate 在最新代码中源文件已经被删除,默认模式即可,不需要修改。

selective-scan(CUDA 11.8 包含selective_scan_core)的whl 为:selective-scan(CUDA 11.8 包含core)
selective-scan(CUDA 12.1 包含selective_scan_core)的whl 为:selective-scan(CUDA 12.1 包含core)

11. g++ 版本不支持

出现报错 RuntimeError: The current installed version of g++ (4.8.5) is less than the minimum required version,具体为:

 RuntimeError: The current installed version of g++ (4.8.5) is less than the minimum required version by CUDA 11.7 (6.0.0). Please make sure to use an adequate version of g++ (>=6.0.0, <=11.5.0).

如下图


原因很明显,base 环境里的 gcc 版本老旧,而一般升级版本需要root权限,参考博客:

解决方法依然是利用 conda 在虚拟环境中安装相关的包,在anaconda库中找到合适的 gcc包g++包,譬如可以选择8.5.0版本

conda install conda-forge::gcc=8.5.0
conda install conda-forge::gxx=8.5.0

输入命令gcc-vg++ -v 查看识别到的 gcc 以及 g++版本,如版本还是原来的,则增加环境变量至 .bashrc,通过 vim ~/.bashrc 打开编辑,添加:

export PATH=/home/xxx/.conda/envs/xxx/bin:$PATH

12. fatal error: cuda_bf16.h:

发现最后一步编译出现错误,fatal error: cuda_bf16.h: No such file or directory,此类问题,执行

conda install nvidia/label/cuda-11.8.0::cuda-cudart-dev  # 根据CUDA版本

即可。

报错及解决(20240913)

13. RuntimeError:CUDA error:no kernel image is available

正常安装 Vmamba/ Mamba 后出现以下报错:

RuntimeError:CUDA error:no kernel image is available for execution on the device
CUDA kernel errors might be asynchronously reported at some other API call, so ther stacktrace below might be incorrect.

原因是显卡太老了(譬如有的读者使用的是GTX 1080 甚至GTX 1070 显卡),causal-conv1dmamba-ssm 以及 vmamba 均暂时不支持算力为6.1的设备。解决方法参考下面的博客:

  1. 解决装完mamba运行时报错RuntimeError:CUDA error:no kernel image is available for execution on the device
  2. Ubuntu下VMamba环境1080ti显卡踩坑问题和解决

即,修改这三个包的 setup.py,在代码段

cc_flag.extend(["-gencode", "arch=compute_70,code=sm_70"])
cc_flag.extend(["-gencode", "arch=compute_80,code=sm_80"])

之上插入:

cc_flag.append("-gencode")
cc_flag.append("arch=compute_60,code=sm_60")

或者

cc_flag.extend(["-gencode", "arch=compute_60,code=sm_60"])

然后再次重新按照前文的方法编译,不过官方提示太老的版本可能会对性能产生影响,建议最好更新设备。


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐