实战记录:在老旧 CUDA 环境下编译安装 Mamba (SSM) 全过程避坑指

Mamba(State Space Models)这段时间很火,但它的安装过程并不友好,尤其是牵扯到底层 selective_scan_cudacausal_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、自定义算子)

任意一块脱节,问题就会在编译期或运行期暴露出来。

这次踩完一圈坑之后,总结出几条经验:

  1. 不必追最新版本,先选一组别人验证过、自己也能查得到案例的组合更省时间。
  2. 从下往上锁版本:先看 CUDA 和 GCC 能配合到什么程度,再决定 PyTorch 的版本,最后再拉齐 NumPy 和 Transformers。
  3. 对于自定义 CUDA 扩展,尽量本地编译,并且用 --no-build-isolation 让整个编译过程只依赖你当前这套环境。

如果你也在类似的 CentOS 7 + CUDA 11.x 环境下折腾 Mamba,希望这篇记录能帮你少踩几次坑。

posted @ 2025-11-18 09:35  一只梦想家狐狸  阅读(8)  评论(0)    收藏  举报