Colab 加载 Qwen 时缺少 libnvJitLink.so.13,如何排查?
这个错误说明,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 已经报告的依赖冲突。
建议按以下顺序操作:
- 保存需要保留的 notebook 和运行结果。
- 删除当前运行时并重新连接,或创建全新的 Colab GPU 运行时。
- 在安装其他包之前,记录预装的 PyTorch、CUDA 和相关包版本。
- 安装 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 的加载错误。
备注:内容仅供参考。
