导航
安装教程导航
- Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法
- Windows 下 Mamba 的安装参看本人博客:Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)
- Windows 下 Vim 安装问题参看本人博客:Window 下 Vim 环境安装踩坑问题汇总及解决方法
- Linux 下Vmamba 安装教程参看本人博客:Vmamba 安装教程(无需更改base环境中的cuda版本)
- Windows 下 VMamba的安装参看本人博客:Windows 下 VMamba 安装教程(无需更改base环境中的cuda版本且可加速)
- Windows下 Mamba2及高版本 causal_conv1d 安装参考本人博客:Windows 下Mamba2 环境安装问题记录及解决方法(causal_conv1d=1.4.0)
安装包导航
- Mamba 安装教程博客中涉及到的全部安装包:mamba 安装包,包括Windows和Linux
- Vim 安装教程博客中涉及到的全部安装包:vim 安装包,包括Windows和Linux
- Vmamba 安装教程博客中涉及到的全部安装包:vmamba 安装包,包括Windows和Linux
- Mamba2 及 更高版本causal_conv1d Windows安装包:mamba 2 windows安装包
目录
背景
Vim 官方代码链接为:https://github.com/hustvl/Vim,在原来博客 “Mamba 环境安装踩坑问题汇总及解决方法” 基础上,不绕过selective_scan_cuda进行 Vim 环境安装,这样可以获得和 Linux 一样的速度。注意,Vim (Vision Mamba)和 Vmamba (VMamba: Visual State Space Model)虽然都是基于mamba,但是它们不是同一篇!
本文涉及到的所有文件均可在:vim 安装包,包括Windows和Linux下载。
(安装问题 / 资源自取售后 / 论文合作想法请+vx:
931744281
)
Windows 下环境准备
- 前期环境准备,同原来博客 “Mamba 环境安装踩坑问题汇总及解决方法” ,具体为:
conda create -n mamba python=3.10
conda activate mamba
conda installcudatoolkit==11.8
pip installtorch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
pip installsetuptools==68.2.2
conda install nvidia/label/cuda-11.8.0::cuda-nvcc_win-64
conda install packaging
pip install triton-2.0.0-cp310-cp310-win_amd64.whl
其中
triton-2.0.0-cp310-cp310-win_amd64.whl
获取参看原来博客 “Mamba 环境安装踩坑问题汇总及解决方法” 。
然后下载 Vim 的官方代码:
git clone https://github.com/hustvl/Vim.git
causal-conv1d
的安装,Vim 官方代码仓里给了其源码,因此只需要利用其源码安装即可 ,类似 “Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)”
cd causal-conv1d
setCAUSAL_CONV1D_FORCE_BUILD=TRUE
pip install.
官方没有编译好的适用于Windows版本的 whl,因此需要用上述步骤来手动编译。
笔者编译好了 Windows 下的 causal_conv1d-1.0.0-cp310-cp310-win_amd64.whl ,亦可直接下载安装(只适用于torch 2.1,CUDA 11.8) 。
pip install causal_conv1d-1.0.0-cp310-cp310-win_amd64.whl
- Vim 官方代码仓给的
causal-conv1d
源码有误,过于老旧且不兼容,causal-conv1d版本应≥1.1.0,类似 “Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)”
git clone https://github.com/Dao-AILab/causal-conv1d.git
cd causal-conv1d
git checkout v1.1.1 # 安装最新版的话,此步可省略setCAUSAL_CONV1D_FORCE_BUILD=TRUE
pip install.
官方没有编译好的适用于Windows版本的 whl,因此需要用上述步骤来手动编译。笔者编译好了 Windows 下的 causal_conv1d-1.1.1-cp310-cp310-win_amd64.whl,亦可直接下载安装(只适用于torch 2.1)。
pip install causal_conv1d-1.1.1-cp310-cp310-win_amd64.whl
完成前期工作后进入下一步正式编译。注意安装成功后会在相应环境(
xxx\conda\envs\xxx\Lib\site-packages\
)中生成
causal_conv1d_cuda.cp310-win_amd64.pyd
文件,此文件对应
causal_conv1d_cuda
包。
Windows 下适合于Vim的
mamba-ssm
的编译
Vim 官方对
mamba-ssm
的源码进行了修改,所以其与原版有不同。
既可以在安装完原版的基础上再修改相应环境(
xxx\conda\envs\xxx\Lib\site-packages\
)中的源码文件,参考“Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)”。
也可以直接强行利用Vim的源码进行编译。方法如下:
cd mamba-1p1p1 # 先切换到Vim 下面的这个目录
- 在mamba-1p1p1下的
setup.py
修改第41行配置:
FORCE_BUILD = os.getenv("MAMBA_FORCE_BUILD", "TRUE")=="TRUE"
修改第261行配置为(可选,相当于在
BuildExtension
后多加了一个
.with_options(use_ninja=False)
):
cmdclass={"bdist_wheel": CachedWheelsCommand, "build_ext": BuildExtension.with_options(use_ninja=False)}
- 将
csrc/selective_scan/selective_scan_fwd_kernel.cuh
的void selective_scan_fwd_launch
函数改为
voidselective_scan_fwd_launch(SSMParamsBase ¶ms, cudaStream_t stream){// Only kNRows == 1 is tested for now, which ofc doesn't differ from previously when we had each block// processing 1 row.staticconstexprint kNRows =1;BOOL_SWITCH(params.seqlen %(kNThreads * kNItems)==0, kIsEvenLen,[&]{BOOL_SWITCH(params.is_variable_B, kIsVariableB,[&]{BOOL_SWITCH(params.is_variable_C, kIsVariableC,[&]{BOOL_SWITCH(params.z_ptr !=nullptr, kHasZ,[&]{using Ktraits = Selective_Scan_fwd_kernel_traits<kNThreads, kNItems, kNRows, kIsEvenLen, kIsVariableB, kIsVariableC, kHasZ, input_t, weight_t>;// constexpr int kSmemSize = Ktraits::kSmemSize;staticconstexprint kSmemSize = Ktraits::kSmemSize + kNRows * MAX_DSTATE *sizeof(typenameKtraits::scan_t);// printf("smem_size = %d\n", kSmemSize);
dim3 grid(params.batch, params.dim / kNRows);auto kernel =&selective_scan_fwd_kernel<Ktraits>;if(kSmemSize >=48*1024){C10_CUDA_CHECK(cudaFuncSetAttribute(
kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, kSmemSize));}
kernel<<<grid, Ktraits::kNThreads, kSmemSize, stream>>>(params);C10_CUDA_KERNEL_LAUNCH_CHECK();});});});});}
- 将
csrc/selective_scan/static_switch.h
的BOOL_SWITCH
函数改为
#defineBOOL_SWITCH(COND, CONST_NAME,...)\[&]{\if(COND){\staticconstexprbool CONST_NAME =true;\return__VA_ARGS__();\}else{\staticconstexprbool CONST_NAME =false;\return__VA_ARGS__();\}\}()
(这两步是将
constexpr
改为
static constexpr
)
- 在
csrc/selective_scan/selective_scan_bwd_kernel.cuh
和csrc/selective_scan/selective_scan_fwd_kernel.cuh
文件开头加入:
#ifndefM_LOG2E#defineM_LOG2E1.4426950408889634074#endif
- 完成上述修改后,执行
pip install .
一般即可顺利编译,成功安装。 - 本人编译好的Windows 下的适用于Vim的whl 也有:mamba-ssm-1.1.1 (只适用于torch 2.1,CUDA 11.8),可直接下载安装或联系本人vx自取售后。利用 whl 安装命令为:
pip install mamba_ssm-1.1.1-cp310-cp310-win_amd64.whl --no-dependencies causal_conv1d
由于此时没有绕过selective_scan_cuda,在虚拟环境中(
xxx\conda\envs\xxx\Lib\site-packages\
)产生了 selective-scan-cuda.cp310-win-amd64.pyd 文件,所以运行速度较快。
出现的问题
1. 出现
KeyError: 'HOME'
具体来说出现以下报错
Traceback (most recent call last):
.....
File "xxx\models\vimamba.py", line 115, in forward
hidden_states, residual = fused_add_norm_fn(
File "D:\Anaconda\envs\xxx\lib\site-packages\mamba_ssm\ops\triton\layernorm.py", line 478, in rms_norm_fn
return LayerNormFn.apply(x, weight, bias, residual, eps, prenorm, residual_in_fp32, True)
File "D:\Anaconda\envs\xxx\lib\site-packages\torch\autograd\function.py", line 539, in apply
return super().apply(*args, **kwargs)# type: ignore[misc]
File "D:\Anaconda\envs\xxx\lib\site-packages\mamba_ssm\ops\triton\layernorm.py", line 411, in forward
y, mean, rstd, residual_out = _layer_norm_fwd(
File "D:\Anaconda\envs\xxx\lib\site-packages\mamba_ssm\ops\triton\layernorm.py", line 155, in _layer_norm_fwd
_layer_norm_fwd_1pass_kernel[(M,)](
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\runtime\jit.py", line 106, in launcher
return self.run(*args, grid=grid, **kwargs)
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\runtime\autotuner.py", line 73, in run
timings ={config: self._bench(*args, config=config, **kwargs)
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\runtime\autotuner.py", line 73, in<dictcomp>
timings ={config: self._bench(*args, config=config, **kwargs)
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\runtime\autotuner.py", line 63, in _bench
return do_bench(kernel_call)
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\testing.py", line 136, in do_bench
fn()
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\runtime\autotuner.py", line 62, in kernel_call
self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages, **current)
File "<string>", line 41, in _layer_norm_fwd_1pass_kernel
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\compiler.py", line 1230, in compile
so_cache_manager = CacheManager(so_cache_key)
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\compiler.py", line 1102, in __init__
self.cache_dir = os.environ.get('TRITON_CACHE_DIR', default_cache_dir())
File "D:\Anaconda\envs\xxx\lib\site-packages\triton\compiler.py", line 1093, in default_cache_dir
return os.path.join(os.environ["HOME"], ".triton", "cache")
File "D:\Anaconda\envs\xxx\lib\os.py", line 680, in __getitem__
raise KeyError(key) from None
KeyError: 'HOME'
在Win下还需要修改 mamba 安装路径下 D:\Anaconda\envs\xxx\lib\site-packages\mamba_ssm\ops\triton\layernorm.py 文件,具体来说,是把原来 layernorm.py 里面的
deflayer_norm_fn(
x,
weight,
bias,
residual=None,
eps=1e-6,
prenorm=False,
residual_in_fp32=False,
is_rms_norm=False,):return LayerNormFn.apply(x, weight, bias, residual, eps, prenorm, residual_in_fp32, is_rms_norm)defrms_norm_fn(x, weight, bias, residual=None, prenorm=False, residual_in_fp32=False, eps=1e-6):return LayerNormFn.apply(x, weight, bias, residual, eps, prenorm, residual_in_fp32,True)
改为
deflayer_norm_fn(
x,
weight,
bias,
residual=None,
eps=1e-6,
prenorm=False,
residual_in_fp32=False,
is_rms_norm=False,):return layer_norm_ref(x, weight, bias, residual, eps, prenorm, residual_in_fp32)defrms_norm_fn(x, weight, bias, residual=None, prenorm=False, residual_in_fp32=False, eps=1e-6):return rms_norm_ref(x, weight, bias, residual, eps, prenorm, residual_in_fp32)
2. 出现
TypeError: causal_conv1d_fwd()
具体来说,出现以下报错:
conv1d_out = causal_conv1d_cuda.causal_conv1d_fwd(
TypeError: causal_conv1d_fwd(): incompatible function arguments. The following argument types are supported:
这种情况是 causal_conv1d 和 mamba_ssm 的版本兼容问题。
实测发现 Vim 官方给的 causal_conv1d 源码过于老旧,应该按照≥1.1.0的版本。
版权归原作者 yyywxk 所有, 如有侵权,请联系我们删除。