PAYATHON 2026

Colab 加载 Qwen 时缺少 libnvJitLink.so.13,如何排查?

AI 小顾

这个错误说明,bitsandbytes 加载原生动态库时,动态链接器无法找到或加载 libnvJitLink.so.13。日志显示,升级命令将原来的 PyTorch CUDA 12.8 环境换成了 CUDA 13.0,并与多项预装的 CUDA 12 依赖发生冲突。

建议优先重新创建干净的 Colab 运行时,保留预装的 PyTorch/CUDA 组合,再安装加载 Qwen 所需的依赖。如果必须保留当前 CUDA 13 环境,先检查 libnvJitLink.so.13 是否实际存在,再判断是否需要修复动态库搜索路径。仅凭现有日志,还不能认定这只是路径问题。

为什么 PyTorch 能使用 CUDA,bitsandbytes 却失败?

日志中的三项信息含义不同:

  • nvidia-smi 显示驱动及其支持的 CUDA 版本信息,不能证明 Python 环境中的 CUDA 动态库齐全。
  • torch.version.cuda 显示当前 PyTorch 构建使用的 CUDA 版本。这里是 13.0。
  • torch.cuda.is_available() 返回 True,说明 PyTorch 能检测并使用 CUDA,但不能证明 bitsandbytes 的全部原生依赖都能加载。

当前失败发生在 bitsandbytes 加载动态库时。它需要的 libnvJitLink.so.13 没有被成功解析,后续优化器检查也随之失败。应先解决最早出现的动态库加载错误,不必从最后的 cadam32bit_grad_fp32() 调用开始排查。

安装日志虽然列出了 nvidia-nvjitlink 13.0.88,但这只能说明 pip 报告安装了该软件包。文件是否仍在磁盘上、所在目录是否可搜索,以及该文件自身的依赖是否齐全,都需要进一步检查。

先恢复一致的 Colab 环境

原安装命令中的 torch>=2.3.0 只规定了最低版本,配合 -U 会允许 pip 升级 PyTorch。日志显示,它从 2.10.0+cu128 升到了 2.11.0+cu130,同时替换了 CUDA 相关依赖。

重启 Python 进程可以清除已经加载的模块,但不会撤销这些安装,也不会修复 pip 已经报告的依赖冲突。

建议按以下顺序操作:

  1. 保存需要保留的 notebook 和运行结果。
  2. 删除当前运行时并重新连接,或创建全新的 Colab GPU 运行时。
  3. 在安装其他包之前,记录预装的 PyTorch、CUDA 和相关包版本。
  4. 安装 Qwen 所需的依赖时,给 PyTorch 加上明确约束,避免再次切换 CUDA 构建。

可以先运行:

import sys
import torch
from importlib.metadata import version, PackageNotFoundError

print("Python:", sys.version)
print("torch:", torch.__version__)
print("torch CUDA:", torch.version.cuda)
print("CUDA available:", torch.cuda.is_available())

for name in ("torchvision", "torchaudio", "cuda-toolkit", "cuda-bindings"):
    try:
        print(f"{name}: {version(name)}")
    except PackageNotFoundError:
        print(f"{name}: not installed")

如果新运行时仍然预装原日志中的 2.10.0+cu128 组合,可以用下面的命令限制安装范围:

%pip install "torch==2.10.0+cu128" "torchvision==0.25.0+cu128" "torchaudio==2.10.0+cu128" "transformers==5.3.0" "accelerate==1.13.0" "bitsandbytes==0.49.2" "safetensors==0.7.0"

这些版本来自题目中的安装记录,目的是保留原有 PyTorch 基线、控制变量。这组版本能否加载你的 Qwen 模型尚未验证。若新运行时的预装版本不同,应根据实际环境调整约束;若 pip 无法解析依赖,先查看冲突原因。

安装后使用 Colab 的重启运行时功能,再检查:

import sys
import subprocess

subprocess.run([sys.executable, "-m", "pip", "check"], check=False)
subprocess.run([sys.executable, "-m", "bitsandbytes"], check=False)

pip check 检查 Python 包声明的依赖关系,bitsandbytes 诊断检查其实际加载和调用情况,两者不能互相替代。

如果保留 CUDA 13,先确认动态库是否存在

在当前出错环境中,可以通过安装包元数据定位文件,避免猜测它是否位于 /usr/local/cuda/lib64:

from importlib.metadata import distribution, PackageNotFoundError
from pathlib import Path

nvjitlink_paths = []

try:
    dist = distribution("nvidia-nvjitlink")
except PackageNotFoundError:
    print("当前 Python 环境未安装 nvidia-nvjitlink")
else:
    print("nvidia-nvjitlink:", dist.version)
    for entry in dist.files or ():
        if Path(str(entry)).name == "libnvJitLink.so.13":
            path = Path(dist.locate_file(entry)).resolve()
            print("library:", path, "exists:", path.is_file())
            if path.is_file():
                nvjitlink_paths.append(path)

if not nvjitlink_paths:
    print("未通过该安装包的文件记录找到可用的 libnvJitLink.so.13")

如果找不到文件,继续检查安装是否完整,以及命令是否使用了同一个 Python 环境。添加一个不存在的目录解决不了问题。

如果找到了文件,可以检查它自身是否还有缺失的依赖:

import subprocess

for path in nvjitlink_paths:
    subprocess.run(["ldd", str(path)], check=False)

关注输出中的 not found。没有 not found 也不代表 bitsandbytes 已经恢复,只说明这一步没有发现该文件的缺失依赖。

文件存在时,再测试搜索路径

如果上一步找到了真实文件,可以把它所在目录加入新 Python 进程的 LD_LIBRARY_PATH,然后重新运行 bitsandbytes 诊断:

import os
import sys
import subprocess

if not nvjitlink_paths:
    raise RuntimeError("请先定位实际存在的 libnvJitLink.so.13")

library_dirs = sorted({str(path.parent) for path in nvjitlink_paths})
env = os.environ.copy()
old_path = env.get("LD_LIBRARY_PATH", "")
env["LD_LIBRARY_PATH"] = os.pathsep.join(
    library_dirs + ([old_path] if old_path else [])
)

result = subprocess.run(
    [sys.executable, "-m", "bitsandbytes"],
    env=env,
    check=False,
)
print("exit code:", result.returncode)

使用新进程测试,是为了让动态链接器在进程启动时读取指定的搜索路径。直接在已经运行的 notebook 内修改 os.environ["LD_LIBRARY_PATH"],不能保证当前进程随后的动态库加载按预期变化。

如果测试消除了原来的报错,说明搜索路径至少是问题的一部分。随后加载 Qwen 的进程也需要继承相同配置。仅在 !export LD_LIBRARY_PATH=... 中设置变量,通常只影响那次 shell 命令,不会修改 notebook 内核的环境。

如果错误变成其他缺失库、符号解析失败或 GPU 执行错误,应根据新的首个错误继续排查。当前环境已经存在 CUDA 12 与 CUDA 13 依赖冲突,修复一个库的路径并不等于整个环境已经一致。

需要避免的操作

不要将 libnvJitLink.so.12 重命名或软链接成 libnvJitLink.so.13。文件名变化不能提供另一个主版本所需的 ABI。

也不要直接复制错误提示中的占位路径。/path/to/cuda-13.x/lib64 必须替换为真实目录,路径中的多余空格也会影响命令含义。

在 Colab 中,可以调整版本号、Python 包依赖、子进程环境变量和动态库搜索路径,驱动和 GPU 则由平台提供。当前日志没有证明所选 CUDA 13 构建与 Tesla T4 的整套组合可用,缺失库修复后仍需做实际诊断。

现有材料没有给出 Qwen 的具体模型标识、量化配置或加载代码,因此无法据此保证某个版本组合一定能完成模型加载。先让 PyTorch 的 CUDA 检查和 bitsandbytes 诊断通过,再检查 Qwen 的加载错误。

备注:内容仅供参考。