【踩坑记录】从 PyTorch 2.7.0+cu126 迁移到 RTX PRO 6000(Blackwell)后:torchcodec 报错“Could not load libtorchcodec”的排查与修复

Mistystar 发布于 13 天前 43 次阅读


【踩坑记录】从 PyTorch 2.7.0+cu126 迁移到 RTX PRO 6000(Blackwell)后:torchcodec 报错“Could not load libtorchcodec”的排查与修复

0. 背景:新主机新显卡,旧环境直接跑不起来

手头一个项目原本跑在 PyTorch 2.7.0 + CUDA 12.6 的环境里,迁移到另一台新主机(RTX PRO 6000,Blackwell 架构)后,出现了典型的“显卡架构不被老版本支持”的问题。

查了不少 issue/讨论,大意是:Blackwell 需要更高版本 CUDA(12.8+),甚至建议 CUDA 13 及以后。于是我按官网指引切到“最新稳定版”组合:PyTorch 2.9.1+cu130​。然后新坑来了:torchcodec 无法加载


1. 报错现象:torchcodec 动态库加载失败

运行:

python -c "import torchcodec; print(torchcodec.__version__)"

直接炸:

RuntimeError: Could not load libtorchcodec. Likely causes:
1. FFmpeg is not properly installed ...
2. The PyTorch version (2.9.1+cu130) is not compatible ...
...
FFmpeg version 8: Could not load ... libtorchcodec_core8.so
FFmpeg version 7: Could not load ... libtorchcodec_core7.so
FFmpeg version 6: Could not load ... libtorchcodec_core6.so
FFmpeg version 5: Could not load ... libtorchcodec_core5.so
FFmpeg version 4: Could not load ... libtorchcodec_core4.so

乍一看像“缺 FFmpeg”,但这种报错非常误导:torchcodec 只是在告诉你:它 dlopen(动态加载) 某个 .so 失败了,失败原因可能是 FFmpeg,也可能是 CUDA / libtorch / 运行时库缺失或路径没被动态链接器找到。


2. 第一坑:先确认 pip/python/conda 是否同一个环境(避免“混装”)

这一步非常关键。很多人会同时装了 anaconda3​ 和 miniconda3​,再加上同名 env,最后就是 python​ 指向 A,pip 装到 B。

我在激活环境后确认了一遍(这里输出是“正确的”,说明至少没有混装):

echo "CONDA_PREFIX=$CONDA_PREFIX"
which -a conda
which -a python
which -a pip
python -c "import sys; print(sys.executable)"
python -m pip -V
pip -V

关键点:python​ / pip​ / CONDA_PREFIX 必须一致。


3. 真正定位原因:用 ldd 查 torchcodec 的 .so 到底缺什么

直接对 torchcodec 的核心库做依赖检查(以 core6 为例):

ldd $CONDA_PREFIX/lib/python3.10/site-packages/torchcodec/libtorchcodec_core6.so | grep -i "not found" -n

我这里的结果非常典型(前期):

libtorch.so => not found
libc10.so => not found
libnvrtc.so.13 => not found
libc10_cuda.so => not found
libnppicc.so.13 => not found
libavutil.so.58 => not found
libavcodec.so.60 => not found
libavformat.so.60 => not found
...
libtorch_cpu.so => not found
libtorch_cuda.so => not found
libcudart.so.13 => not found

这说明两件事:

  • 不是“torchcodec 没装” ,而是它依赖的一堆库动态链接失败。
  • 缺的库来自三大类:
  • PyTorch 自带的 libtorch.so / libc10.so / libtorch_cuda.so...
  • FFmpeg 的 libavcodec / libavformat / ...
  • CUDA 组件库 libcudart / libnvrtc / libnppicc ...

4. 我以为是 FFmpeg:但 conda 装了还是不行

先按提示装 FFmpeg(Ubuntu 20 + conda 最稳):

conda install -c conda-forge ffmpeg

Conda 提示 “already installed”。我验证了一下,FFmpeg 确实在,而且是 6.x:

ffmpeg -version | head -1
# ffmpeg version 6.1.1 ...

并且 $CONDA_PREFIX/lib 下面也能看到对应的 so:

ls -l $CONDA_PREFIX/lib/libavcodec.so* $CONDA_PREFIX/lib/libavformat.so* $CONDA_PREFIX/lib/libavutil.so*

所以问题不是“没装 FFmpeg”,而是 动态链接器默认搜索路径没覆盖到这些库所在目录(尤其当 torch/torchcodec 是 pip wheel 安装时更常见)。


5. 关键修复:补齐 LD_LIBRARY_PATH,让动态链接器找到 torch/lib 和 conda/lib

先确认 PyTorch 的 libtorch.so 实际在哪:

python -c "import torch, os, glob; p=os.path.join(os.path.dirname(torch.__file__),'lib'); print(p); print(glob.glob(p+'/libtorch.so*'))"

我的输出是:

/home/nicola/miniconda3/envs/diffrhythm2/lib/python3.10/site-packages/torch/lib
.../libtorch.so

然后临时把两个路径加进 LD_LIBRARY_PATH

export TORCH_LIB=$(python -c "import torch, os; print(os.path.join(os.path.dirname(torch.__file__), 'lib'))")
export LD_LIBRARY_PATH="$TORCH_LIB:$CONDA_PREFIX/lib:$LD_LIBRARY_PATH"

再跑一次 ldd:

ldd $CONDA_PREFIX/lib/python3.10/site-packages/torchcodec/libtorchcodec_core6.so | grep -i "not found" -n

这一步后,大部分 “not found” 会消失,FFmpeg / libtorch 也基本能被找到。


6. 最后一块拼图:pip 的 NVIDIA CUDA 组件库不在系统默认搜索路径里

我这里最后剩下的是:

libnppicc.so.13 => not found

注意:很多 CUDA 组件(尤其是 pip 装的 nvidia-*​)并不在 /usr/lib​ 或 $CONDA_PREFIX/lib,而是在:

.../site-packages/nvidia/*/lib

所以我先把这些路径也加进 LD_LIBRARY_PATH

export NVIDIA_LIBS=$(python - <<'PY'
import site, glob, os
libs=[]
for sp in site.getsitepackages():
    libs += glob.glob(os.path.join(sp, "nvidia", "*", "lib"))
print(":".join(libs))
PY
)
export LD_LIBRARY_PATH="$NVIDIA_LIBS:$LD_LIBRARY_PATH"

但如果你像我一样,加了路径仍然缺 libnppicc.so.13​,那大概率不是路径问题了,而是:这个库压根没装进来

libnppicc 属于 CUDA 的 NPP 组件。最终解决办法是补装 NPP:

# 注意:别用 --index-url pytorch 的源;这个包在 PyPI
python -m pip install -U nvidia-npp -i https://pypi.org/simple

装完后建议确认库是否存在:

python - <<'PY'
import site, glob, os
paths=[]
for sp in site.getsitepackages():
    paths += glob.glob(os.path.join(sp, "nvidia", "*", "lib", "libnppicc.so*"))
print("\n".join(paths) if paths else "NOT FOUND")
PY

再验证 ldd​ 不应再有 not found

ldd $CONDA_PREFIX/lib/python3.10/site-packages/torchcodec/libtorchcodec_core6.so | grep -i "not found" -n

最后导入:

python -c "import torchcodec; print('torchcodec ok:', torchcodec.__version__)"

7. 可选优化:把 LD_LIBRARY_PATH 固化到 conda activate(免得每次手动 export)

在环境下创建:

$CONDA_PREFIX/etc/conda/activate.d/torchcodec.sh

写入(按需调整):

export TORCH_LIB=$(python -c "import torch, os; print(os.path.join(os.path.dirname(torch.__file__), 'lib'))")
export NVIDIA_LIBS=$(python - <<'PY'
import site, glob, os
libs=[]
for sp in site.getsitepackages():
    libs += glob.glob(os.path.join(sp, "nvidia", "*", "lib"))
print(":".join(libs))
PY
)
export LD_LIBRARY_PATH="$TORCH_LIB:$CONDA_PREFIX/lib:$NVIDIA_LIBS:$LD_LIBRARY_PATH"

之后每次 conda activate diffrhythm2 会自动生效。


8. 总结:这次踩坑的关键经验

  • torchcodec 的 “Could not load libtorchcodec” 不要只盯着 FFmpeg,先 ldd 看真正缺的依赖。
  • pip 安装的 PyTorch / CUDA 组件库经常散落在 site-packages/torch/lib​、site-packages/nvidia/*/lib,系统默认不会搜这些路径。
  • LD_LIBRARY_PATH 是最直接的救命手段;长期更建议把环境做干净、版本统一(尤其别同时混用 cu12/cu13 的 nvidia 包)。
  • 安装某些 CUDA 组件(如 nvidia-npp​)时,别走 PyTorch 的 --index-url​,要用 PyPI:-i https://pypi.org/simple

如果你也在做 Blackwell 新卡迁移,建议一开始就把“PyTorch + CUDA 版本 + nvidia-* 组件”当成一整套来配,少走很多弯路。

此作者没有提供个人介绍。
最后更新于 2026-01-21