当包含不兼容的 nvml 库时,nvidia-smi 失败

nvidia-smi fails when an incompatible nvml library included

意外地将不兼容的 nvml 库添加到 linux 环境中的库路径。在该设置中,当我尝试查询 nvidia-smi 时,它给出了以下错误

Failed to initialize NVML: Driver/library version mismatch

当我从库路径中删除那个不兼容的库并再次查询 nvidia-smi 时,查询运行成功并且输出按预期显示。

然而,当我通过为 nvidia-smi 输入 ldd 来查看依赖库时,它并没有显示进程依赖于 nvml 库。

$>ldd /usr/bin/nvidia-smi 
    linux-vdso.so.1 =>  (0x00007fffa84db000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f58ba044000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f58b9e3f000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f58b9a7e000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f58b9876000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f58ba27d000)

如果不依赖nvml库,为什么在有不兼容的nvml库时会报错?

ldd 提供应用程序对库的依赖项列表,这些库动态 linked 到应用程序。

推测此应用程序使用了(共享)库的 runtime loading(例如,strace nvidia-smi 2>&1 |grep ml

在运行时加载库时,没有必要显式 link 应用程序针对库,并且库不会在 ldd 输出中显示为依赖项(如果它是未在应用程序构建时明确 linked)。