目录
1.前期环境配置,这里推荐使用Conda虚拟环境,没配置这个的,可以参考这个安装教程最新版最详细Anaconda新手安装+配置+环境创建教程-CSDN博客。安装完后会有一个类似Windows下的命令提示符的应用,即,Anaconda Prompt, 直接打开它。编辑编辑
2.再是因果卷积的安装,即 causal-conv1d。同样再之前那个界面输入以下命令:
3.Mamba-ssm环境安装。在命令行输入以下命令,这里最好是选择mamba1.1.3版本的,同时git无法连接的话,跟之前一样,直接去网址栏输入这个链接就行,然后选择1.1.3版本的。
在这个界面中输入以下命令:(这里的命令,不要直接全部复制粘贴到界面中,一个一个复制粘贴)
conda create -n mamba python=3.10
conda activate mamba
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 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 本来需要自己编译,我这里提供编译好的https://drive.google.com/file/d/1lYXEro5ZbLsRLFLOkiyoY2ePFDWRVtVr/view?usp=drive_link
git clone https://github.com/Dao-AILab/causal-conv1d.git
cd causal-conv1d
set CAUSAL_CONV1D_FORCE_BUILD=TRUE
pip install .
这里提醒一下,如果git失败了,连接不上。可以直接再网址栏输入这个GitHub - Dao-AILab/causal-conv1d: Causal depthwise conv1d in CUDA, with a PyTorch interface将causal-conv1d的压缩包下载下来,然后解压,copy到你命令行界面的工作目录,就是当前目录咯。(如果不想浪费时间,我这里直接提供Windows下编译好的https://drive.google.com/file/d/1tzunHZ3SHHyI8qNT1DfxlxBVwalqjr3R/view?usp=drive_link,可以直接下载安装(只适用于torch2.1)。同样的把这个编译好的copy到当前命令行的工作目录,再执行以下这个安装命令)。
pip install causal_conv1d-1.1.1-cp310-cp310-win_amd64.whl
git clone https://github.com/state-spaces/mamba.git
cd mamba
4.Windows下Mamba-ssn环境编译。
setup.py
修改第41行配置FORCE_BUILD = os.getenv("MAMBA_FORCE_BUILD", "TRUE") == "TRUE"
csrc/selective_scan/selective_scan_fwd_kernel.cuh
的 void selective_scan_fwd_launch
函数改为void selective_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.
static constexpr int 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;
// constexpr int kSmemSize = Ktraits::kSmemSize;
static constexpr int kSmemSize = Ktraits::kSmemSize + kNRows * MAX_DSTATE * sizeof(typename Ktraits::scan_t);
// printf("smem_size = %d\n", kSmemSize);
dim3 grid(params.batch, params.dim / kNRows);
auto kernel = &selective_scan_fwd_kernel;
if (kSmemSize >= 48 * 1024) {
C10_CUDA_CHECK(cudaFuncSetAttribute(
kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, kSmemSize));
}
kernel<<>>(params);
C10_CUDA_KERNEL_LAUNCH_CHECK();
});
});
});
});
}
csrc/selective_scan/static_switch.h
的 BOOL_SWITCH
函数改为#define BOOL_SWITCH(COND, CONST_NAME, ...) \
[&] { \
if (COND) { \
static constexpr bool CONST_NAME = true; \
return __VA_ARGS__(); \
} else { \
static constexpr bool CONST_NAME = false; \
return __VA_ARGS__(); \
} \
}()
csrc/selective_scan/selective_scan_bwd_kernel.cuh
和 csrc/selective_scan/selective_scan_fwd_kernel.cuh
文件开头加入:#ifndef M_LOG2E
#define M_LOG2E 1.4426950408889634074
#endif
pip install .
一般即可顺利编译,成功安装。