实战记录:在老旧 CUDA 环境下编译安装 Mamba (SSM) 全过程避坑指
Mamba(State Space Models)这段时间很火,但它的安装过程并不友好,尤其是牵扯到底层 selective_scan_cuda 和 causal_conv1d 编译时,对环境的要求会一下子变得很苛刻。
我最近在一台 CentOS 7 服务器 上部署 Mamba,从编译器版本、CUDA 兼容性到 Python 依赖冲突,几乎能踩的坑都踩了一遍。这台机器的限制大致是:
- 系统:CentOS 7(glibc 比较老)
- System CUDA:11.6(不方便升级)
- 目标:把 Mamba 环境稳定跑起来
折腾了好一阵子,最后总算摸出了一个在老环境上也能跑通的配置组合。下面把过程和关键细节都记下来,方便之后自己或者别人遇到类似情况时少走点弯路。
🏆 最终环境(可直接参考的组合)
如果你的环境也是 CUDA 11.x,可以优先试下面这一套:
- Python:3.10
- PyTorch:2.1.2(CUDA 11.8 版本)
- Compiler:GCC 10.x + G++ 10.x(通过 Conda 安装,和 CUDA 11.6 能和平共处)
- NumPy:1.x 系列(锁在
< 2.0) - Transformers:4.38.2(适配 PyTorch 2.1,并且能配合 Mamba)
- 安装方式:本地源码编译,使用
--no-build-isolation
💣 踩坑记录
坑 1:GCC 版本太老,缺少 stdatomic.h
现象:
CentOS 7 自带的 GCC 是 4.8.5,编译 Mamba 时直接炸了:
fatal error: stdatomic.h: No such file or directory
原因:
Mamba 依赖 C11 标准,这个版本的 GCC 不支持,对应头文件也没有。
第一次尝试(失败):
最开始直接上:
conda install gcc_linux-64
Conda 给装上了 GCC 15,结果碰到了新的报错:
RuntimeError: The current installed version of ... (15.2.0) is greater than the maximum required version by CUDA 11.6 (<12.0)
最终做法:用 GCC 10
在 CUDA 11.x 这代里,GCC 10 是相对稳妥的选择。
# 先卸掉不合适的高版本
conda remove gcc_linux-64 gxx_linux-64
# 装 GCC 10 和适配 CentOS 7 的 sysroot
conda install -c conda-forge gcc_linux-64=10 gxx_linux-64=10 sysroot_linux-64=2.17
坑 2:PyTorch 太新,Mamba 源码跟不上
现象:
一开始想直接用最新的 PyTorch 2.6.0,结果在编译阶段挂掉:
error: subprocess-exited-with-error
...
RuntimeError: Error compiling objects for extension
原因:
PyTorch 2.6 调整了一些 C++/CUDA 接口,而当前版本的 Mamba 并没有跟着改,导致自定义算子在编译时就报错。
最终做法:回到 PyTorch 2.1.2
选择了 Mamba 开发期用得比较多、反馈也相对稳定的版本:
- PyTorch:2.1.2
坑 3:PyTorch 自带的 CUDA 版本和系统不匹配
现象:
在降级 PyTorch 时,如果不额外指定 CUDA 版本,很容易被装上带 CUDA 12.1 的构建(例如 2.1.2+cu121):
RuntimeError: The detected CUDA version (11.6) mismatches the version that was used to compile PyTorch (12.1).
原因:
- 本机
nvcc:11.6 - PyTorch 对应 CUDA:12.1
CUDA 跨大版本本来就比较敏感,这种组合基本没法正常跑。
最终做法:明确装 CUDA 11.8 版本的 PyTorch
实践下来,CUDA 11.8 和系统里的 11.6 能正常配合使用:
pip install \
torch==2.1.2 \
torchvision==0.16.2 \
torchaudio==2.1.2 \
--index-url [https://download.pytorch.org/whl/cu118](https://download.pytorch.org/whl/cu118)
如果访问不了官方源,就换成内网源或者离线 whl,但版本尽量保持一致。
坑 4:C++ 标准库兼容问题(parameter packs not expanded)
现象:
中途也试过用更高版本的 GCC(比如 11),结果在编译时又遇到:
/include/c++/bits/std_function.h:435:145: error: parameter packs not expanded with '...':
原因:
在 CUDA 11.6 下,nvcc 和 GCC 11+ 的某些标准库实现配合得并不好,模板展开这块容易翻车。
最终做法:把 GCC 稳定在 10
最后还是回到了:
- CUDA:11.6
- GCC:10.x
这一组在实际使用里要稳定得多。
坑 5:NumPy 2.0 带来的 ABI 问题
现象:
A module that was compiled using NumPy 1.x cannot be run in NumPy 2.1.2
原因:
NumPy 2.0 改了不少 ABI 相关的东西,很多早期只针对 1.x 编译的扩展模块在 2.x 直接就不兼容了。
最终做法:锁在 NumPy 1.x
pip install "numpy<2.0"
如果已经升到 2.x,可以先卸载再重装:
pip uninstall -y numpy
pip install "numpy<2.0"
坑 6:Transformers 版本区间不好选
现象 A:版本太新
AttributeError: module 'torch.utils._pytree' has no attribute 'register_pytree_node'
现象 B:版本太老
ImportError: cannot import name 'GenerateDecoderOnlyOutput' from 'transformers.generation'
原因:
- Transformers 4.39 往后要求 PyTorch 至少是 2.2,而前面已经因为 CUDA 兼容,把 PyTorch 锁在了 2.1。
- 太老的 Transformers 版本又缺少 Mamba 需要的一些新接口。
最终做法:选定 Transformers 4.38.2
pip install transformers==4.38.2
这个版本既能和 PyTorch 2.1 正常配合,也提供了 Mamba 相关的生成接口。
🚀 整体安装步骤
如果你的服务器是 CUDA 11.6 / 11.7,可以按下面的顺序来,一步一步走基本问题不大。
步骤 1:创建 Conda 环境并装好编译器
# 新建并激活环境
conda create -n mamba python=3.10 -y
conda activate mamba
# 安装 GCC 10、G++ 10、sysroot 和 git
conda install -y -c conda-forge \
gcc_linux-64=10 \
gxx_linux-64=10 \
sysroot_linux-64=2.17 \
git
步骤 2:安装带 CUDA 11.8 的 PyTorch
pip install \
torch==2.1.2 \
torchvision==0.16.2 \
torchaudio==2.1.2 \
--index-url [https://download.pytorch.org/whl/cu118](https://download.pytorch.org/whl/cu118)
如果换了镜像,只要版本号一致即可。
步骤 3:从源码编译安装 Mamba(mamba-ssm)
不太建议直接:
pip install mamba-ssm
更稳妥的做法是拉源码、本地编译:
# 克隆仓库
git clone [https://github.com/state-spaces/mamba.git](https://github.com/state-spaces/mamba.git)
cd mamba
# 安装
pip install -v -e . --no-build-isolation
这里加上 -v 方便看编译的详细日志,--no-build-isolation 则是为了强制复用当前环境里的 PyTorch 和 GCC。
步骤 4:编译安装 causal-conv1d
causal-conv1d 很容易在下载预编译包时因为网络或兼容性问题失败,所以干脆直接本地编译。
cd ..
git clone [https://github.com/Dao-AILab/causal-conv1d.git](https://github.com/Dao-AILab/causal-conv1d.git)
cd causal-conv1d
# 切到相对稳定的版本
git checkout v1.2.0
# 强制本地构建
export CAUSAL_CONV1D_FORCE_BUILD=TRUE
pip install -v . --no-build-isolation
步骤 5:安装其他依赖
pip install "numpy<2.0" transformers==4.38.2 einops
如果你需要 datasets、accelerate 等库,也可以在这里一起装上。
步骤 6:简单跑一遍验证
可以用下面这段代码做一个最小验证:
import torch
import mamba_ssm
import causal_conv1d
print(f"Torch Version: {torch.__version__}")
print(f"Mamba Version: {mamba_ssm.__version__}")
print("SUCCESS: All systems go!")
能顺利跑完并打印出 SUCCESS,基本就说明编译链路和依赖已经理顺了。
一些小结
在老服务器上安装 Mamba,关键在于把这几件事对齐:
- 编译器版本(GCC)
- CUDA 和驱动
- PyTorch 以及上层生态(NumPy、Transformers、自定义算子)
任意一块脱节,问题就会在编译期或运行期暴露出来。
这次踩完一圈坑之后,总结出几条经验:
- 不必追最新版本,先选一组别人验证过、自己也能查得到案例的组合更省时间。
- 从下往上锁版本:先看 CUDA 和 GCC 能配合到什么程度,再决定 PyTorch 的版本,最后再拉齐 NumPy 和 Transformers。
- 对于自定义 CUDA 扩展,尽量本地编译,并且用
--no-build-isolation让整个编译过程只依赖你当前这套环境。
如果你也在类似的 CentOS 7 + CUDA 11.x 环境下折腾 Mamba,希望这篇记录能帮你少踩几次坑。

浙公网安备 33010602011771号