RTX 5090跑大模型指南:sm_120架构、CUDA兼容与FlashAttention编译全攻略
2026/9/17 10:29:30 网站建设 项目流程

从RTX 5090发布那天起,我就知道它一定会成为本地跑大模型的一块“梦幻卡”——32GB GDDR7显存、Blackwell架构、更猛的Tensor Core,理论带宽直接把上一代按在地上摩擦。但等我把卡插上机器,兴冲冲地pip install完一堆东西,准备把模型跑起来的时候,迎面就是一记大耳光:CUDA error: no kernel image is available for execution on the device。那一刻我才意识到,新一代显卡的计算能力(Compute Capability)是sm_120,它说的是一套新“方言”,而手头这些旧驱动、旧PyTorch、旧FlashAttention,全都听不懂。

这篇文章就是我在这块卡上从“装不上”到“跑通一个大模型”的完整记录。核心就三件事:搞懂sm_120意味着什么、怎么把环境搭对、怎么让FlashAttention在新卡上真正跑起来。适合刚入手RTX 5090、想拿它跑本地大模型的玩家,也适合那些正在纠结“为什么新卡反而跑不了模型”的人。整个过程踩的坑不少,我会把每一步的“为什么”也讲清楚,尽量让你看完之后,不用再经历我那一晚上的血压飙升。

1. 先搞清楚RTX 5090的“新方言”:Blackwell与sm_120

很多人拿到新显卡,第一反应是装驱动、装CUDA、装PyTorch,然后直接开跑。但在RTX 5090上,这个流程行不通,至少不能全用旧版本。你得先理解一个概念:显卡的计算能力(Compute Capability)决定了它能执行哪些CUDA kernel。

1.1 计算能力(Compute Capability)到底是什么

打个比方,GPU的架构就像一门语言的不同方言。同一个“读取显存”的动作,在不同架构上的底层指令实现是不同的。CUDA通过sm_XX来标记这些方言,XX就是计算能力版本号。

  • RTX 30系列:Ampere架构,对应sm_86
  • RTX 40系列:Ada Lovelace架构,对应sm_89
  • RTX 50系列:Blackwell架构,对应sm_120

举个例子,RTX 4090的算力是8.9,所以所有为sm_89编译过的kernel它都能跑。而RTX 5090是12.0,也就是sm_120。这就产生了一个关键问题:那些在RTX 4090时代编译好的CUDA代码,如果不针对sm_120重新编译,显卡就不认识它。就像你跟一个只说英语的人用日语打招呼,对方一脸懵。

所以新卡跑不了旧库,不是因为你卡坏了,而是因为“翻译层”没有跟上。

1.2 Blackwell到底改了哪些东西

RTX 5090的Blackwell架构不是简单的“换了个名字”。它在硬件层面做了几件影响大模型性能的大事。

第一是Tensor Core升级到第五代。这一代把FP4、FP6这类低精度运算的吞吐提升到了夸张的水平,而低精度正是大模型量化和推理最常用的加速手段。配合缩放因子(Scale),FP4推理理论上能达到非常惊人的token数。

第二是显存升级到GDDR7。RTX 5090配备32GB GDDR7显存,带宽实测大概在1.7~1.8 TB/s级别,上一代RTX 4090大概1TB/s左右。别小看这70%的提升,对大模型来说,显存带宽基本就是“生命线”。因为推理时每个token都要遍历一遍模型权重,带宽越高,每秒能生成的token就越多。这也是为什么有人拿它跑本地模型比4090快一大截的原因。

第三是NVLink之类的东西……不过消费级卡一般也用不上,我就不展开了。核心就一句:Blackwell和Ada底层差异很大,sm_120的生态支持必须要新版本的CUDA工具链才能跟上。

1.3 兼容性陷阱:为什么旧版本直接GG

我一开始用的是系统里老的CUDA 12.4环境和PyTorch 2.5,加载模型时直接报错:

CUDA error: no kernel image is available for execution on the device

这个报错的字面意思就是:当前设备(RTX 5090,sm_120)没有可用的kernel镜像。原因很简单——CUDA 12.4自带的运行时和PyTorch 2.5编译时附带的CUDA kernel,都没有包含sm_120的版本。

实际上,NVIDIA从CUDA 12.8开始才正式加入对sm_120的支持。而PyTorch这边,你需要安装的是带cu128标号的版本(比如2.7.0+cu128或更新的nightly),这些版本的预编译包才内置了面向sm_120的kernel。

这里也是很多人容易踩的另一个坑:nvidia-smi显示的驱动版本很高,比如572.xx,就以为“驱动新就能支持”,然后傻乎乎地在老环境里折腾半天。但驱动高只代表“HAL层支持新卡”,具体到CUDA运行时、PyTorch这些上层软件,还需要它们自己也带了新架构的kernel。

注意:判断环境是否真正支持RTX 5090,最靠谱的方式不是看nvidia-smi,而是看PyTorch里torch.cuda.get_device_capability()是不是返回(12, 0)

2. 环境搭建:CUDA、PyTorch、FlashAttention三大件怎么搭配

把原理搞清楚之后,剩下的事情就是“选择正确的版本组合”。我最终跑通的环境组合是:

  • 驱动:572.60
  • CUDA Toolkit:12.8(其实runtime用12.8就行)
  • PyTorch:2.7.0+cu128
  • FlashAttention:从源码编译(v2.7.x)
  • 模型:一个7B参数的对话模型(Qwen2.5-7B-Instruct)

下面我把每一步的选型逻辑和具体操作写清楚。

2.1 驱动与CUDA Toolkit:别让版本拖后腿

驱动这步相对简单。到NVIDIA官网下载对应型号的最新驱动即可,安装完用nvidia-smi确认显卡被识别。

然后要确认CUDA Toolkit。很多人会问:“驱动里不是自带CUDA吗?”这里要澄清一个概念:驱动自带的叫“CUDA Driver”,它负责和硬件打交道;而编译CUDA代码、运行PyTorch时用的是“CUDA Runtime”和“CUDA Toolkit”。前者往往是向后兼容的,后者则必须足够新才能支持sm_120。

我的建议是直接安装CUDA Toolkit 12.8或更新版本。安装命令:

# 以Ubuntu为例,先下载12.8的runfile或deb包 # 然后设置环境变量 export PATH=/usr/local/cuda-12.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.8/lib64:$LD_LIBRARY_PATH

验证一下:

nvcc --version

如果输出显示release 12.8,就说明Toolkit这边OK了。这一步搞不定后面FlashAttention编译必炸,所以别偷懒。

2.2 PyTorch必须吃“新米”:cu128版本怎么装

PyTorch这边,千万别用默认的pip install torch。默认源装的通常是CPU版或者旧CUDA版,对于RTX 5090来说基本没法用。你需要明确指出用cu128的wheel源。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

这里有几个小坑值得说一下:

  • 如果你在国内,直接用这个官方源可能很慢。我建议先配好pip的代理加速,或者用镜像站但一定要手动指定--index-url指向PyTorch官方cu128源,不要用默认的PyPI源。
  • 安装完之后,尽快验证:
python -c "import torch; print(torch.__version__, torch.version.cuda); print(torch.cuda.get_device_capability())"

正常输出应该是2.7.0+cu128(12, 0)。如果capability不是(12, 0),说明环境还有问题。

2.3 FlashAttention:到底值不值得折腾

FlashAttention是当前大模型训练和推理里最常用的注意力加速库之一。它最核心的思想是“分块计算注意力,避免把完整的注意力矩阵写回显存”。传统的注意力计算需要把QK^T得到的大矩阵(形状是[batch, heads, seq_len, seq_len])存入HBM再读出来做softmax,这让显存占用和带宽消耗都非常大。FlashAttention通过分块(tiling)和在线softmax,让计算尽量在SRAM里完成,既省显存又提速。

用大白话说:没有FlashAttention的时候,算注意力像你一边往书桌上堆笔记、一边翻找;有了它,像你在脑子里直接完成计算,所有草稿纸都不需要了。

对大模型推理来说,FlashAttention的收益主要体现在两个地方:一是省显存,可以把KV cache留更多给上下文长度;二是快,生成token时的注意力计算占比很高,优化它意味着吞吐量直接提升。

但问题在于,官方发布的FlashAttention wheel包里,很长一段时间没有包含sm_120的预编译kernel。你直接pip install flash-attn可能装的是针对sm_80/sm_90编译的版本,在RTX 5090上要么报错,要么根本用不上。所以想用上FlashAttention,就得自己从源码编译。

备选方案:PyTorch 2.7内置的SDPA(Scaled Dot-Product Attention)其实也支持sm_120,性能也很不错。如果编译FlashAttention实在搞不定,先用SDPA也能跑,只是上限略低一些。

3. 编译FlashAttention的实操流水账:从下载到真正跑通

这一章是整个流程里最折腾的部分,也是“含金量”最高的。很多人卡在编译阶段,其实往往不是代码问题,而是几个前置参数没设对。我按顺序记录我的实际操作。

3.1 编译前的三件事:缺一不可

第一件事,安装编译工具链。FlashAttention编译依赖ninja、gcc和CUDA工具链。很多人老是编译到一半报奇怪错误,后来发现是ninja没装或者版本太老。

sudo apt install -y ninja-build

第二件事,清理旧版本。如果你之前用pip装过flash-attn,先卸掉,避免残留的旧文件干扰编译。

pip uninstall flash-attn -y

第三件事,确认CUDA环境变量正确。编译时FlashAttention的setup脚本会查找nvcc,如果PATH里指向的是老版本CUDA,编译出来的东西就白搭。用which nvccnvcc --version确认一下,务必确保前面设的/usr/local/cuda-12.8/bin在PATH最前面。

3.2 编译命令与参数详解:关键就在TORCH_CUDA_ARCH_LIST

这一行命令是所有问题的核心:

git clone https://github.com/Dao-AILab/flash-attention.git cd flash-attention export TORCH_CUDA_ARCH_LIST="12.0+PTX" python setup.py build pip install .

TORCH_CUDA_ARCH_LIST这个环境变量的含义是告诉编译器:我要为特定计算能力生成kernel代码。

  • 12.0表示生成针对sm_120的原生kernel。
  • +PTX是关键中的关键。PTX是CUDA的中间表示,类似Java的字节码。加上+PTX,编译出来的kernel会包含一份PTX代码,GPU驱动可以在运行时把它JIT编译成适合后续小版本硬件的机器码。换句话说,12.0+PTX能让编译产物适配所有sm_120系列显卡,而不只是恰好这一张。

很多人编译FlashAttention失败,就是因为没设这个变量,setup脚本默认用旧世代架构列表(比如sm_70/sm_80/sm_90),编译出来之后拿到RTX 5090上一跑,直接报“no kernel image”。

编译时间挺长的,我当时大概等了40多分钟,取决于CPU和磁盘性能。如果日志里能看到类似sm_120或者compute_120的文件生成,那就说明编译目标找对了。

注意:编译FlashAttention很吃内存,建议系统内存不要低于16GB。我试过在内存小一点的云主机上编译,结果ninja直接被OOM杀死。如果内存紧张,可以适当限制并行度,比如加MAX_JOBS=4

3.3 编译常见错误与解决方案

我在整个过程中遇到过的坑,以及对应解法,整理在这里:

错误一:Unsupported gpu architecture 'compute_120'

这个错误一般出现在CUDA版本太老的情况下。CUDA 12.8之前不认识sm_120这个目标,所以会直接拒绝编译。解法就是回退到上一节说的,先安装CUDA 12.8或更新版本,刷新PATH,重新执行编译。

错误二:fatal error: cudnn.h: No such file or directory

如果你安装的CUDA Toolkit不是通过完整runfile方式安装的,可能缺少cuDNN头文件。FlashAttention在编译某些带cuDNN回退的模块时会找这个头文件。最简单的方法是安装完整的CUDA Toolkit,或者单独安装cuDNN的开发包。如果只是跑推理,也可以不折腾这个,省略相关模块。

错误三:编译中途Internal Compiler Error (ICE)

这个比较玄学,通常发生在内存不足或GCC版本过老。我建议先把GCC升到9以上版本,然后确认内存够用,再加MAX_JOBS=2降低并行度,基本能解决。

错误四:No module named 'flash_attn'但安装时没报错

有时候pip install .会因为setup脚本没实际执行而“假成功”。这种时候务必看安装日志里有没有building extension的字样,如果没有,说明编译产物没生成。最好的验证方式是在Python里直接:

import flash_attn from flash_attn import flash_attn_func print(flash_attn_func)

能正常import就说明真的装上了。

3.4 备选方案:实在编译不过,先用SDPA顶一阵

如果你的目标是快速先把模型跑起来,而不是一定要用到FlashAttention API,那可以先不编译FlashAttention。PyTorch 2.7内置的F.scaled_dot_product_attention在默认配置下会自动选择最高效的kernel后端,在Blackwell架构上也表现不错。我在编译FlashAttention之前,就是用SDPA先跑通的模型,后面才逐步切换到FlashAttention对比性能。

唯一的遗憾是,SDPA对某些高级特性(比如自定义attention mask、alibi等)支持不如FlashAttention灵活。但如果你只是跑常规对话模型,SDPA完全够用。

4. 性能验证、显存观察与常见问题排查

环境搭好、FlashAttention编译完成后,“跑通”并不是终点。跑通指的是模型能正常输出,不代表性能调到了最优。这个章节我会分享怎么验证环境真的生效了,以及一些容易被忽略的细节。

4.1 如何判断“跑通”不是“能用”

很多人在这一步其实很迷茫:模型能回复了,但到底有没有用上FlashAttention?显存有没有吃满?性能有没有达到预期?

我建议做三件事验证:

第一,跑一段常规推理,确认输出质量正常。这一步是最基本的,如果输出一堆乱码,说明kernel八成有问题。

第二,在显存占用和速度上对比SDPA和FlashAttention。我在同样一个7B模型、同样输入长度的条件下,分别跑了纯SDPA和启用FlashAttention的版本。FlashAttention的显存占用能省下不少,尤其是当sequence长度很长时,效果更明显。举个直观例子:当输入长度从2048涨到8192时,不开FlashAttention会慢慢逼近显存上限,而开了FlashAttention,显存占用增长明显平缓,而且每秒生成的token数更高。

第三,观察GPU利用率。用nvidia-smi dmon或者nvtop实时看显卡状态,流畅的推理应该有稳定的高占用和规律的显存读写波动。如果看到GPU利用率一直上不去、CPU却在狂转,大概率是kernel没有真正用起来,或者数据加载成了瓶颈。

4.2 32GB显存到底能跑多大模型

这个问题我隔三差五就会在群里看到。RTX 5090有32GB显存,跑FP16权重的话,7B模型大概占14GB左右(权重加激活和KV cache)。也就是说,7B模型在FP16下还有余量,能开很长的上下文。如果做4bit量化,7B模型权重只有大概4~5GB,剩下的空间可以全砸给KV cache,跑个几万token的上下文不在话下。

但如果你想跑13B或者更大的模型,就得认真规划显存了。FP16的13B模型权重就要26GB左右,剩下的空间捉襟见肘。这种情况下建议用4bit或8bit量化,再配合FlashAttention省下的激活显存,才能跑得舒服。

顺便说一个我实测后很惊讶的点:RTX 5090在跑4bit量化模型时,解码速度通常比RTX 4090快很多,甚至接近翻倍水平。原因很简单:GDDR7带宽提升太猛,加上FP4/INT4的Tensor Core吞吐也翻倍了。如果你是因为性能而从4090升级到5090,这钱花得值。

4.3 常见问题速查表

我把这一路遇到的典型问题汇总成一个速查表,方便你对照排错。

问题现象根本原因解决方式
no kernel image is availableCUDA Runtime或PyTorch版本太老,没有sm_120 kernel升级CUDA到12.8+,安装PyTorch cu128版本
torch.cuda.get_device_capability()返回(8, 9)而不是(12, 0)显卡没被正确识别,或驱动太老升级驱动到支持Blackwell的版本(572.60+)
FlashAttention编译报Unsupported gpu architectureCUDA版本低于12.8,不认识sm_120升级CUDA Toolkit到12.8+
编译一直不生成sm_120的kernel没设TORCH_CUDA_ARCH_LIST,用了默认架构列表设置TORCH_CUDA_ARCH_LIST="12.0+PTX"后重新编译
import flash_attn报错编译没成功,或装了不匹配的wheel包卸载后从源码重新编译并确认日志
显存占用不稳,GPU利用率低可能没启用FlashAttention,或数据预加载瓶颈开启FlashAttention,检查数据加载器
推理速度远低于预期模型量化精度不合理,或没利用FP4/FP8能力尝试4bit量化,并确认kernel使用到了Tensor Core

这个表格里的前三条是“新手三连”,基本覆盖了RTX 5090玩家能遇到的大部分问题。

4.4 独家避坑技巧:CUDA生态的“最小震惊原则”

最后分享一个我在折腾中总结出的经验——所谓“最小震惊原则”。

很多人拿到新硬件后,喜欢一次性把驱动、CUDA、PyTorch、FlashAttention、vLLM、Transformers全部升级到最新版,然后出了问题完全不知道是哪个环节炸的。我建议反过来做:每次只升级一个组件,验证通过后再动下一个。

  • 第一步,驱动升级到最新,确认nvidia-smi正常。
  • 第二步,单独装新CUDA Toolkit,用nvcc --version确认。
  • 第三步,装PyTorch cu128版本,用torch.cuda.get_device_capability()确认。
  • 第四步,先不装FlashAttention,直接跑一个最小的注意力计算测试,确认PyTorch自带SDPA正常。
  • 最后一步,才编译FlashAttention,然后对比测试。

这样做的好处是,出问题的时候你能快速定位是哪一个环节引起的,而不是在一团乱麻里找线头。我自己第N次踩坑的时候,就是用这个方法把问题锁定在“PyTorch装错源”这一个环节上的,比之前盲试快了几倍。

另外,强烈建议用conda或venv单独开一个虚拟环境,不要把这一套sm_120的包直接装进系统全局Python。我之前就是因为在全局环境里装了一堆不兼容的老包,导致新包装上去了,老的代码又跑不了了。隔离好环境,切来切去也不心疼。

其实这一整套折腾下来,我最大的感受是:RTX 5090的硬件性能已经非常能打了,缺的只是软件生态的适配。而作为最早吃螃蟹的人,我们不得不亲自去解决这些适配问题。这个过程虽然痛苦,但当你看到模型在新卡上流畅输出、显存占用比老卡还低的时候,那种成就感绝对是“买卡一时爽,调通一直爽”。

最后再分享一个小技巧:编译FlashAttention的时候,建议把编译好的wheel包留一份备份。以后如果换了机器或者不小心重装了系统,直接pip install flash_attn-2.x.x-cp310-cp310-linux_x86_64.whl就能装好,不用再等这40分钟编译时间。我之前就是没留备份,后面在另一台机器上重新折腾了一遍,悔得肠子都青了。希望这篇文章能让你少走这些弯路,一次就把RTX 5090跑起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询