老卡上加载 FLUX 3 Image Klein 报错,多数情况不是模型文件坏了,而是 PyTorch 轮子自带的 CUDA 运行时和你显卡驱动能提供的版本对不上,或者这张卡的算力(sm 架构)不在该轮子的编译列表里。判断顺序建议是:先分别读出驱动版本和框架编译版本,再在干净虚拟环境里复现同一条报错,最后按报错关键字把“算子不支持”和“显存不足”分开处理。这三步都能用命令和日志验证,不需要凭感觉换版本。
换老卡后加载报错,先别急着升级驱动或降级模型。用 nvidia-smi 拿到驱动版本与可支持的 CUDA 上限,用 torch.version.cuda 拿到框架实际链接的运行时版本,两者对照才能判断是版本没对上还是硬件能力不够;再到干净虚拟环境里复现一次,排除旧环境污染。若报错关键字指向 no kernel image 一类,属于编译架构不匹配,换轮子不一定救得回来,需要结合显卡算力确认支持边界。
用系统命令和 Python 侧命令分别读出驱动与框架版本
这一步的目的,是确认运行时实际链接的是哪个 CUDA 版本,而不是安装时以为的那个。驱动侧和框架侧分别取一次,再对照。
nvidia-smi
# 看右上角 Driver Version,以及 CUDA Version(这是该驱动能支持到的运行时上限)
nvcc `--version`
# 若装过 toolkit,看 release 号;只代表本机编译器,不代表 PyTorch 用的运行时
python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available()); print(torch.cuda.get_device_capability())"
对照方法:torch.version.cuda 必须落在 nvidia-smi 显示的 CUDA Version 之内,超出时通常表现为 torch.cuda.is_available() 返回 False,或初始化时报 CUDA driver version is insufficient for CUDA runtime version。torch.version.cuda 为 None,说明装的是 CPU 轮子,和驱动无关。另外,pip 安装的 PyTorch 自带 cudart,所以 nvcc `--version` 与本机 CUDA toolkit 版本不作为判断依据,只作参考。get_device_capability() 输出的两位数(如 6.1、7.5、8.6)记下来,后面选轮子要用。
按版本对应关系选择匹配的安装命令
PyTorch 官方安装页里有历史版本对应表,行是 torch 与 torchvision 的版本,列是对应的 CUDA 构建(如 cu118、cu121、cu124)。使用方法分两步:先按驱动能支持的上限确定 CUDA 主版本,通常 CUDA 11.8 需要 450 以上驱动、CUDA 12.x 需要 525 以上驱动,具体下限以对应表格为准;再用上一步记下的算力去筛选,新版轮子往往只编译较新的 sm 架构,Pascal、Turing 这类老卡要确认轮子里是否还带对应 sm 的 kernel。
安装命令必须显式指定版本号和 index-url,不要让 pip install torch 装默认轮子,默认轮子一般跟最新 CUDA,老驱动跑不动:
# 版本号取对应表里与你环境匹配的那一行,下面是形式示例
pip install torch==2.x.y torchvision==0.x.y `--index-url` https://download.pytorch.org/whl/cu118
如果之前装过其他构建,先 pip uninstall torch torchvision 再装,混着装容易出现 +cu118 与 +cpu 同时存在、实际加载了错误那个的情况。
在干净虚拟环境里重装并复现同一条报错
多个环境相互干扰会造出假象,比如同一个 shell 里先激活过别的 venv、或者用户级 site-packages 里还留着一份旧 torch。用一个全新虚拟环境重跑一遍,报错还在,问题就在版本组合或硬件;报错消失,问题在原环境。
python -m venv ~/venvs/flux-klein
source ~/venvs/flux-klein/bin/activate
python -m pip install -U pip
pip install torch==2.x.y torchvision==0.x.y `--index-url` https://download.pytorch.org/whl/cu118
pip install diffusers transformers accelerate safetensors
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
然后写一个最小的复现脚本,放在模型目录同级执行。类名以模型仓库给出的为准,下面的 FluxPipeline 只是占位:
# repro.py
import torch
from diffusers import FluxPipeline
print("torch", torch.__version__, "cuda", torch.version.cuda)
pipe = FluxPipeline.from_pretrained("./本地模型目录", torch_dtype=torch.float16)
pipe = pipe.to("cuda")
img = pipe("a cat", num_inference_steps=4, height=512, width=512).images[0]
img.save("out.png")
脚本里把 torch 版本先打印出来,是为了让报错日志和版本信息出现在同一段输出里,便于事后回溯。运行 python repro.py,把完整 traceback 留下来,进入下一步。
读报错关键字区分算子不支持与显存不足
两类问题处理方向完全不同,看关键字就能分开。
算子或编译架构不匹配:典型关键字有 no kernel image is available for execution on the device、CUDA error: no kernel image、Torch not compiled with CUDA enabled、CUDA driver version is insufficient for CUDA runtime version,以及 bf16 相关的精度提示,例如提示某算力不支持 bfloat16。判断依据是:报错在第一次 .to("cuda") 或首个算子调用时就抛出,与分辨率、批量大小无关,同时 nvidia-smi 显示显存还有很多空余。下一步动作是核对算力与轮子的 sm 列表,换一个带对应 sm 的构建或较旧的 torch 版本;如果换过两三个构建仍然报同样的 no kernel image,基本可以判断这张卡不在支持范围内,继续试版本意义不大。老卡上用 bf16 加载也会触发类似的精度报错,可以先换成 float16 再判断。
显存不足:典型关键字有 CUDA out of memory、Tried to allocate ... MiB、OutOfMemoryError。判断依据是:报错出现在加载权重或推理中段,nvidia-smi 显示显存接近占满,把分辨率或批量调小后报错位置往后移或消失。下一步动作是降低出图尺寸与步数、用 float16 加载、开启 enable_model_cpu_offload()、以及 VAE slicing 与 tiling 这类分块手段。这些是让流程能跑起来的取舍,不是性能提升方案,出图速度通常会变慢。
把可用的版本组合写进环境说明文件
确认能跑之后,把当时的组合固定下来,下次重建不用再试错。文件内容以实际 pip freeze 输出为准,不要凭记忆手写:
# requirements-lock.txt
# 机器信息:GPU 型号 / 驱动 Driver Version / 算力 x.y
# 记录时间以实际为准
`--extra-index-url` https://download.pytorch.org/whl/cu118
torch==2.x.y+cu118
torchvision==0.x.y+cu118
diffusers==0.xx.x
transformers==4.xx.x
accelerate==1.x.x
safetensors==0.4.x
重建时新建一个空环境,按文件装完立刻验证,确认装出来的确实是记录里的构建:
python -m venv ~/venvs/flux-klein-rebuild
source ~/venvs/flux-klein-rebuild/bin/activate
pip install -r requirements-lock.txt
python -c "import torch; a=torch.randn(64,64,device='cuda'); print((a@a).sum().item()); print(torch.__version__, torch.version.cuda)"
验证命令里那次矩阵乘法是刻意的:它会在 GPU 上真正跑一个 kernel,能提前暴露 no kernel image 这类问题,比只看 torch.cuda.is_available() 更可靠。最后再跑一次 python repro.py 出图,把驱动版本、算力、torch 版本、torch.version.cuda 四个值一起写进 README,换机器或换卡时先对照这四个值,再决定是重装还是换卡。