Stable Diffusion 3.5 装了却跑不动 / 是显存不够还是驱动没对上?

文章导读
Stable Diffusion 3.5 跑不动,先别急着判断是显存不够还是驱动没对上——这两种原因在同一台机器上会留下不同的痕迹。报错发生的时机本身就是线索:在 import 阶段或初始化 pipeline 时就报错,通常属于驱动与运行库这一层;模型能加载、一进入采样或 VAE 解码才崩,通常是显存资源层;卡在读取文件、连模型都没建起来,则是权重与加载参数没对上。用同一台机器分三层验证,比反复重
📋 目录
  1. 把启动报错原文完整抄下来并按关键词归类
  2. 用显卡信息命令和框架自检确认显卡是否被看到
  3. 用单张低分辨率图测试是否只是资源不够
  4. 核对权重文件格式与加载参数是否匹配
  5. 把验证通过的组合固定成一份启动参数快照
A A

Stable Diffusion 3.5 跑不动,先别急着判断是显存不够还是驱动没对上——这两种原因在同一台机器上会留下不同的痕迹。报错发生的时机本身就是线索:在 import 阶段或初始化 pipeline 时就报错,通常属于驱动与运行库这一层;模型能加载、一进入采样或 VAE 解码才崩,通常是显存资源层;卡在读取文件、连模型都没建起来,则是权重与加载参数没对上。用同一台机器分三层验证,比反复重装依赖更快收敛。

先把启动报错的原文完整保留,按「显存不足 / 找不到可用显卡 / 权重文件缺失」三类关键词归类,再决定往哪一层查。显卡信息命令能确认驱动到框架这一段是否通畅;单张低分辨率图能把资源问题和环境问题剥离;核对权重目录结构与加载日志能排除文件层面的失败。最后把跑通的参数固定成快照,避免每次重装都重新试错。所有判断以本机命令输出和日志为准,不同显卡、驱动版本、框架版本结论可能不同,需要结合环境确认。

把启动报错原文完整抄下来并按关键词归类

不要只截最后一行,把从启动到退出的完整输出保留下来。先看报错出现在哪一步:是 import torch、初始化 pipeline,还是开始采样。环境层问题一般更早出现,资源层问题一般更晚出现。

  • 显存不足:常见原文是 torch.cuda.OutOfMemoryErrorCUDA out of memory。典型上下文是显卡已被识别、权重已加载完成,报错栈里能看到采样或 VAE 解码的函数名。这类属于资源层,不是驱动层。
  • 找不到可用显卡:常见原文是 no CUDA-capable device is detectedTorch not compiled with CUDA enabledCUDA driver version is insufficient for CUDA runtime version。典型上下文是 import 或初始化阶段,栈里还看不到模型文件。这类属于环境层,先处理驱动与框架版本,别去调分辨率。
  • 权重文件缺失:常见原文是 No such file or directoryError no file named ... found in directory,或 safetensors 解析报错。典型上下文是 from_pretrained 读取目录时。这类既不是驱动也不是显存,属于文件与加载参数层。

归类的意义在于:三类关键词指向三个不同的下一步动作,混在一起排查会来回试错。

用显卡信息命令和框架自检确认显卡是否被看到

在同一个终端、同一个虚拟环境里依次执行,先确认系统层看得到显卡:

nvidia-smi
nvidia-smi -L
nvcc `--version`

nvidia-smi 能列出显卡型号、驱动版本和当前显存占用,说明驱动层正常;nvidia-smi -L 用于确认显卡数量与编号。如果这里就报错或没有输出,问题在驱动或显卡直通,不用往下查框架。

系统层正常后,再确认框架层能不能用到显卡,这段可以放在 Python 交互环境里执行:

import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))

预期是 is_available() 为 True、device_count() 大于 0、能打印出显卡型号。如果 nvidia-smi 正常而这里为 False,通常是装成了 CPU 版 torch,或 torch 编译时对应的 CUDA 运行库与本机驱动不匹配,此时换回匹配的安装方式,先处理驱动与框架的对应关系。

用单张低分辨率图测试是否只是资源不够

显卡自检通过后再看显存。把参数压到最小:单张图、低分辨率、单批、采样步数调低,并关闭同时加载第二个模型或额外后处理。以常见推理脚本为例,关键项大致是:

Stable Diffusion 3.5 装了却跑不动 / 是显存不够还是驱动没对上?
width=512
height=512
num_images_per_prompt=1
num_inference_steps=20
guidance_scale=4.5

运行时另开一个终端观察显存占用,可以看到显存随采样波动:

nvidia-smi -l 1
# 或
watch -n 1 nvidia-smi

也可以在脚本里用 torch.cuda.max_memory_allocated() 观察本进程峰值。如果最小组合能出图,说明环境层是通的,之前的失败主要是资源层;如果最小组合仍然报 CUDA out of memory,再考虑降精度、减少同时驻留的模型,或用更小的测试图确认。注意这些都属于止血,不是性能优化。

核对权重文件格式与加载参数是否匹配

文件层最容易出错的是目录结构。单文件权重通常是一个 model.safetensors*.ckpt 放在目录里;分片权重则是多个带编号的文件,例如 diffusion_pytorch_model-00001-of-00002.safetensors,并配套一个索引 json 说明分片映射关系。

  • 只有单个文件时,加载参数应指向该文件本身,或指向只含它的目录。
  • 存在分片文件时,加载参数必须指向包含索引 json 的目录,不能只指向其中一个分片。
  • 日志里出现具体文件名时,往上翻看它是在哪个目录下查找的,用实际目录列表对照该文件是否存在,再判断是路径写错、文件名拼错,还是分片索引缺失。

这一步的判断标准很简单:日志说找不到哪个文件,就去确认那个文件在不在、路径层级对不对,不需要改分辨率或驱动。

把验证通过的组合固定成一份启动参数快照

定位完成后,把跑通时的环境与参数逐项记下来,下次重装直接对照,不用重新试错。建议记录并对比这些项目:

项目能跑通的记录跑不通的记录
torch 版本 / CUDA 运行库具体版本号具体版本号
驱动版本(nvidia-smi 输出)具体版本号具体版本号
权重类型与加载路径单文件或分片目录另一侧写法
分辨率 / 批大小 / 步数实际数值实际数值
精度或显存相关开关开启或关闭相反设置
相关环境变量变量名与取值变量名与取值

两份记录逐行对比,差异项就是最可能的触发点。需要提醒的是,这份快照和具体机器绑定,换机器、换驱动版本后应重新走一遍分层验证,不要直接照搬结论。