在 4090 上跑本地大模型,跑到一半突然蹦出「非法内存访问」或者类似的 CUDA 报错,进程直接挂掉,重复加载模型还是同样的位置翻车——这种情况多半不是卡坏了。这篇按从环境到模型到框架的顺序,给你一份能照着走的排查路线,并说明每种排查手段什么情况下不适用。
在 4090 上跑本地大模型,跑到一半突然蹦出「非法内存访问」或者类似的 CUDA 报错,进程直接挂掉,换个启动参数重来还是同样的位置翻车。先别急着怀疑显卡坏了,这类报错九成以上是软件栈、权重格式或者显存配置对不上,而不是硬件故障。
这篇按从环境到模型再到框架的顺序,给一份能照着走的排查路线。每一步都告诉你先看什么、怎么验证、以及什么情况下这条思路不适用,避免你在错误的方向上反复重装。
先别急着重装,把报错信息读完整
非法内存访问通常不是孤立一句话,前后会跟着一段 CUDA 或推理框架的堆栈。重点看报错之前最后一行在加载什么:是权重加载阶段、KV cache 分配阶段,还是正式跑 kernel 的阶段。这三个阶段对应的原因完全不同,看错阶段会白折腾很久。
| 报错时机 | 大概率原因 | 优先排查方向 |
|---|---|---|
| 启动加载权重就崩 | 权重残缺、量化格式不匹配 | 文件完整性、后端支持的量化类型 |
| 模型加载成功,第一次请求就崩 | 框架与 CUDA 运行时版本不合 | 驱动与框架编译版本 |
| 跑一会儿、生成长文本才崩 | 显存临界、并发冲突 | 上下文长度、批大小、并发数 |
| 换参数重跑还是同一位置崩 | 固定触发的格式或算子问题 | 用最小模型做对照测试 |
把完整报错原文拷出来,不要只截最后一行。可以去站内 /ai-dict/category/infra 对照术语,先确认报错里出现的关键词到底指向显存不足、驱动不兼容,还是运行时问题——这三者处理方式差别很大。
核对驱动、CUDA 与框架的版本三角
4090 属于较新的架构,驱动太旧、或者 CUDA 运行时版本与推理框架编译时用的版本对不上,很容易在加载 kernel 时触发非法访问。这不是「装最新就好」的问题,而是要保证三者主版本号别差太多,具体对应的组合到 /tools/speed-test 看当时的检测项说明。
- 打印驱动版本命令行查看当前显卡驱动版本,记下来。
- 打印框架的 CUDA 版本在推理框架里查询它编译时依赖的 CUDA 版本,注意这和系统装的 CUDA 不一定是一回事。
- 对比主版本号两者主版本差距过大时,优先把驱动或框架升到匹配区间,再重跑最小测试。
不适用的情况:如果你用的是官方打包好的一体化镜像或客户端,版本组合通常已经对齐,这一节可以快速过一遍直接跳到模型格式那步,不必在这里深挖。
模型权重与量化格式是最常见的坑
- 先确认权重文件是不是完整,下载中断留下的残缺文件加载时同样会触发内存异常
- 确认你用的推理后端是否支持当前这个量化格式,格式不对的时候有些后端不报「不支持」,而是直接非法访问
- 用一个小模型做对照:小模型正常、目标模型崩,问题基本锁定在权重或量化上
- 小模型也崩,说明问题在环境层面,回到上一节的版本核对
- 同一模型换一个已知可用的量化版本再跑,能跑通就说明是格式问题
量化格式和后端的匹配关系最容易被忽略,因为报错信息不会直白告诉你「格式不支持」。各家后端支持的量化类型和当前推荐用法,可以到 /tools 目录里找对应的推理工具条目核对,不用凭记忆猜。
非法内存访问在多数情况下不是显存不够,而是「读到了不该读的地方」——格式和版本问题比容量问题更常见。
显存边界与卸载策略的边界情况
显存刚好卡在临界值时,启动阶段可能侥幸通过,一旦生成到某个长度、或者并发请求上来,就会踩过界崩掉,表现为「跑一会儿才报错」。这类问题看着随机,其实有稳定阈值。
| 可调项 | 调小先试 | 观察什么 |
|---|---|---|
| 上下文长度 | 砍到最小可用值 | 是否还崩,崩在第几轮 |
| 批大小 / 并发数 | 降到 1 | 并发是否为触发点 |
| 卸载到内存的层数 | 先全卸载再逐步加载 | 崩溃阈值出现在哪一档 |
| 显存预留比例 | 留出更多余量 | 同样的参数是否还复现 |
做法是把这些参数先全部压到最低,确认能稳定跑通,再一项一项往上加,记录崩在哪一档。这个阈值本身比「能不能跑」更有参考价值。不适用的情况:如果报错发生在模型加载的第一秒,基本不是显存不够,而是格式或版本问题,别在这条路上浪费时间。
用最小复现锁定问题范围
- 建干净环境新建一个干净环境,只装一个推理框架,不装多余依赖。
- 跑最小组合用一个最小模型的最小请求确认能通,这是你的基线。
- 逐项加回变量依次换目标模型、加量化、加并发、加长上下文,每加一项跑一次。
- 记录崩溃点崩在哪一步,问题就锁定在那一步引入的变量上,把每步结论写下来。
这套流程的好处是把「玄学崩溃」变成一个能指认的具体环节。对照结论时,可以拿你记录的参数去站内相关部署指南页面比一比,看看你和别人写的有哪些出入,往往差异就在那一两个参数上。
下一步如果你已经排到模型格式或环境版本这一步,去站内工具目录看看各推理后端当前支持的量化类型和用法说明,比对着报错原文更容易定位。→常见问题
报错是不是说明 4090 显卡坏了?
大多数情况不是。非法内存访问是软件层面的地址异常,驱动版本、量化格式、框架编译版本对不上都会触发。真正硬件故障通常伴随花屏、掉驱动或者跑任何程序都报错。先用最小复现跑通一个小模型,能跑通就说明卡没问题。
关掉一部分显存占用能解决吗?
要看报错发生在哪个阶段。如果崩在加载权重的第一秒,多半不是显存问题,关显存没用。如果是跑一会儿才崩,把上下文和并发调小往往能绕过。建议先按最小复现定位阶段,再决定要不要动显存参数。
重装系统是最快的办法吗?
不一定。重装会覆盖掉你原来的版本关系,问题可能暂时消失也可能换个形式出现。更省事的顺序是先核对驱动与框架版本,再换一个已知能跑的小模型验证,两步都排除之后再考虑重装环境。