2013 年的 K40c,跑起了现代 LLM 训练栈
移植了什么
作者把现代 LLM 训练栈搬到了 Windows 上的旧 CUDA 显卡。覆盖范围是 SM 3.5 到 SM 7.5。SM 是显卡的计算能力等级编号,数字越小,卡越老。
组件是重新编译的。PyTorch 用 v2.7.1,基于 CUDA 11.8 自定义编译。编译时保留了旧版 SASS。SASS 是老显卡能直接执行的机器码,不只剩新架构的代码路径。causal-conv1d 用 v1.7.0;mamba_ssm(Mamba-1)走纯原生 CUDA 内核。
多卡也没落下。Windows 上实现了 NCCL(DDP),可以在多块 Kepler 显卡之间做分布式训练。Kepler 是那一代架构的代号,2013 年的 Tesla K40c 属于它。
K40c 上的实测
Mamba-1 的纯 CUDA 版本在 SM 3.5 到 SM 7.5 上功能完整,执行也做了优化。测试跑在 2013 年的 NVIDIA Tesla K40c 上,跟 PyTorch 参考实现比,最大绝对误差 3.8e-06。
计算能力 3.5 的卡上,序列长度 64 到 2048 的用例全部通过。单次耗时在 1.00ms 到 2.57ms 之间。误差落在 1e-06 量级,说明这组用例的数值跟参考实现对得上,不是勉强跑通。
Mamba-2 和 Mamba-3 暂时不行
Mamba-2 和 Mamba-3 目前只在 Turing(SM 7.5)及更新的架构上有优化执行。它们依赖 Triton 和 TileLang,这两套工具没有覆盖老卡。
作者留了退路。在旧硬件上,包会检测出不可用的 Triton 依赖模块,自动回退到纯 CUDA 的 Mamba-1 实现。装得上,跑得起来,只是跑的不是最新那一代。
把 Mamba-2 和 Mamba-3 回移植到旧架构列进了后续计划。时间表没写,要迈过哪些坎也没写。
需要更多旧卡来测
作者本地只有 Kepler 硬件,所以特别希望有人拿 Maxwell 和 Pascal 的卡来试。任何旧 GPU 上的基准测试、性能对比或 profiling 数据都欢迎。
评论区补了几条线索。有人说 V100 有 Triton 的移植版本,还整理了一份 SM70/Volta 的资源列表。有人提到 1Cat 有 mamba2,mamba3 太新,不确定跟上了没有。r/P100Users 这类按旧卡聚起来的社区也被点了出来。
项目基于 Tri Dao 和 Albert Gu 的研究与原始实现。Windows NCCL 在多卡训练里能加速多少、稳不稳,目前没有数据。K40c 上的那组测试只证明了一件事:数值对得上。
关键事实
- 作者将现代LLM训练栈移植到了Windows上的旧CUDA GPU(SM 3.5到SM 7.5)
- PyTorch v2.7.1使用CUDA 11.8自定义编译,保留旧版SASS
- 移植了causal-conv1d v1.7.0
- 移植了mamba_ssm(Mamba-1),使用纯原生CUDA内核
- 实现了Windows NCCL(DDP),支持跨Kepler显卡的多GPU训练
- Mamba-1纯CUDA版本在SM 3.5–SM 7.5上完全可用并优化执行
- 在2013年的NVIDIA Tesla K40c上测试,与PyTorch参考实现的最大绝对误差为3.8e-06
- Mamba-2和Mamba-3目前仅在Turing(SM 7.5)及更新架构上支持优化执行,因为它们依赖Triton和TileLang