Jetson AGX Orin 上 ComfyUI 报 CUBLAS_STATUS_ALLOC_FAILED 排查记录

一句话总结:Jetson 平台上 venv 内残留的 PyPI 版 nvidia-cublas-cu12 等 CUDA 运行时包覆盖了 JetPack 系统 CUDA,导致 cuBLAS 在 Tegra 硬件上初始化失败。卸载全部 pip 版 nvidia-* 包后恢复正常。


1. 环境信息

项目

配置

设备

Jetson AGX Orin 32GB(统一内存架构)

系统

Ubuntu 20.04 / JetPack(L4T r35.x)

应用

ComfyUI + Z-Image Turbo(6B DiT + LLaMA 文本编码器)

Python 环境

Python 3.10,uv 管理的 venv(/data/ComfyUI/.venv

进程管理

1Panel 的 supervisord

功耗模式

MAXN(nvpmodel -m 0

2. 故障现象

运行 Z-Image 工作流时,文本编码器加载成功(5371MB 载入 cuda:0),但首次执行矩阵乘法即崩溃:

[INFO] Requested to load ZImageTEModel_
[INFO] loaded completely;  5371.00 MB loaded, full load: True
[ERROR] RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)
  File "comfy/text_encoders/llama.py", line 430, in precompute_freqs_cis
    freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)

特征:模型权重能完整加载进显存,却在第一个 cuBLAS 调用上死掉

3. 排查过程(含弯路)

阶段一:按“显存不足”处理 → 不成立

独显平台上此报错 99% 是 VRAM OOM,初步给了 --lowvram、文本编码器挪 CPU、fp8/GGUF 量化等建议。但用户说明设备是 Jetson AGX Orin 32G——统一内存架构,“显存不足”的判断标准完全不同,需要换用 Jetson 专属工具排查。

阶段二:内存碎片化假说 → 被证伪

tegrastats 显示 RAM 仅用 6.2/30GB,但 lfb(最大连续空闲块)只有 54×4MB。据此推断“物理内存碎片化导致 cuBLAS 找不到连续块”,建议重启。

重启后再次采样:

RAM 2074/30684MB (lfb 4x4MB)   ← 内存几乎全空,lfb 反而更低

关键矛盾:lfb 更低了,但模型加载依然成功——如果 lfb 真是硬上限,5.4GB 的权重根本装不进去。结论:Orin 的 SMMU 支持离散物理页映射大块内存,tegrastats 的 lfb 在 Orin 上参考价值有限,碎片化假说证伪。(这条弯路的教训:老一代 Jetson 的 lfb 经验不能直接搬到 Orin。)

同时 free -h 显示 23GB available,dmesg 无任何 nvmap/OOM 报错——内核层面完全干净,内存侧排除

阶段三:判别实验 → 定位根因

内存排除后,只剩环境本身。设计了一个 ComfyUI 之外的裸测试(2048×2048 矩阵乘法,走的就是报错的 cuBLAS 路径),并检查 venv:

 $ uv pip list | grep -i nvidia
nvidia-cublas-cu12        12.6.4.1
nvidia-cuda-runtime-cu12  12.6.77
nvidia-cudnn-cu12         9.10.2.21
...(共 15 个 nvidia-* 包)

实锤:venv 里装了全套 PyPI 发布的通用 CUDA 运行时包。

4. 根因分析

  • PyPI 上的 nvidia-cublas-cu12 等包是面向通用 x86_64/aarch64 服务器 GPU 的 CUDA 运行时,不兼容 Jetson Tegra 平台

  • Python 进程启动时,site-packages/nvidia/*/lib/ 的加载优先级高于系统路径,cuBLAS 走了错误的库实现,在 Tegra 上 cublasCreate 直接失败;

  • Jetson 的正确姿势:PyTorch 用 NVIDIA Jetson Zoo 的专用 wheel(版本号含 .nv 后缀,如 2.5.0a0+872d972e41.nv24.08),CUDA 库由 JetPack apt 提供,venv 里不应存在任何 pip 版 nvidia- 包*;

  • 推测引入路径:uv/pip 在解析某个依赖(很可能是通用版 torch 或某个自定义节点)时自动拉入了这批包。

5. 解决方案

cd /data/ComfyUI
# 1. 卸载全部 pip 版 CUDA 包
uv pip uninstall nvidia-cublas-cu12 nvidia-cuda-cupti-cu12 nvidia-cuda-nvrtc-cu12 \
  nvidia-cuda-runtime-cu12 nvidia-cudnn-cu12 nvidia-cufft-cu12 nvidia-cufile-cu12 \
  nvidia-curand-cu12 nvidia-cusolver-cu12 nvidia-cusparse-cu12 nvidia-cusparselt-cu12 \
  nvidia-nccl-cu12 nvidia-nvjitlink-cu12 nvidia-nvshmem-cu12 nvidia-nvtx-cu12
# 2. 确认 torch 是 Jetson 专用构建(版本号应含 .nv)
.venv/bin/python -c "import torch; print(torch.__version__)"
# 若不是 nv 构建 → 从 NVIDIA Jetson Zoo 下载对应 JetPack 版本的 wheel 重装
# 3. 裸测试验证
.venv/bin/python -c "
import torch
a = torch.randn(2048, 2048, device='cuda')
print('cublas OK:', (a @ a).float().mean().item())"

验证通过后 ComfyUI 正常出图。根因确认。

6. 后续加固与优化

6.1 supervisord 配置(防复发 + 稳定性)

[program:ComfyUI]
command                 = /data/ComfyUI/.venv/bin/python main.py --enable-manager --reserve-vram 3 --disable-auto-launch
directory               = /data/ComfyUI
autostart               = false
autorestart             = true
startsecs               = 10
startretries            = 5
stopwaitsecs            = 30
stopasgroup             = true
killasgroup             = true
numprocs                = 1
process_name            = %(program_name)s_%(process_num)02d
stdout_logfile          = /data/1panel/tools/supervisord/log/ComfyUI.out.log
stderr_logfile          = /data/1panel/tools/supervord/log/ComfyUI.err.log
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile_backups  = 5
stderr_logfile_backups  = 5
user                    = cikaros
priority                = 999
environment             = PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True",CUDA_HOME="/usr/local/cuda",LD_LIBRARY_PATH="/usr/local/cuda/lib64",PATH="/home/cikaros/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/cuda/bin"

要点:

改动

原因

uv run.venv/bin/python

防止 uv 按 lockfile 自动同步把 nvidia- 包装回来*(本次故障复发防线)

PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

缓解长跑后分配器碎片化

--reserve-vram 3

统一内存下给系统留余量,避免挤爆 swap

日志 2MB→10MB×5

2MB 存不下完整 traceback,排障时日志已滚没

保留 numprocs/process_name

1Panel 按旧进程名 ComfyUI:ComfyUI_00 调用,删除会报 ERROR (no such process)(本次踩坑)

6.2 工作流与系统层

  • Z-Image Turbo 用 CFG=1 + steps=8(原生设计,CFG>1 计算量翻倍);

  • ≥1536px 输出用 Tiled VAE Decode 削解码内存尖峰;

  • jetson_clocks --fan 做成 systemd 开机服务(防过热降频);

  • vm.swappiness=10;crontab 每日定时重启 ComfyUI 做内存卫生。

7. 经验教训

  1. Jetson ≠ 独显:无 nvidia-smi 进程视图、统一内存、lfb 含义不同——排查工具和经验都要换一套;

  2. Jetson 上严禁 pip 安装 nvidia- CUDA 包*,torch 必须来自 Jetson Zoo(.nv 构建);

  3. 依赖管理器是隐形杀手:uv/pip 解析依赖时可能静默引入错误包,uv run 的自动同步会在重启时复活已卸载的包——生产环境用裸 python 调用或 --no-sync

  4. 判别实验优先:一个脱离应用的 2048 矩阵乘裸测试,一次就分清了“环境坏了”和“运行时压力”,比反复调参有效得多;

  5. 对托管面板的隐式约定保持敬畏:1Panel 记住了 supervisor 的进程名模板,看似多余的配置删掉就会断联动;

  6. 报错位置 ≠ 病因位置:崩在 RoPE 的小矩阵乘上,只是因为它是第一个 cuBLAS 调用,与该代码本身无关。


记录时间:2026-08-27 · 环境:Jetson AGX Orin 32GB / JetPack / ComfyUI + Z-Image Turbo


Jetson AGX Orin 上 ComfyUI 报 CUBLAS_STATUS_ALLOC_FAILED 排查记录
https://blog.cikaros.cn/archives/jetson-agx-orin-shang-comfyui-bao-cublas_status_alloc_failed-pai-cha-ji-lu
作者
Cikaros
发布于
2026年08月27日
许可协议