【问题标题】:Cannot run CUDA code that queries NVML - error regarding libnvidia-ml.so无法运行查询 NVML 的 CUDA 代码 - 有关 libnvidia-ml.so 的错误
【发布时间】:2013-07-21 09:26:18
【问题描述】:

最近有同事需要使用NVML查询设备信息,于是下载了Tesla开发包3.304.5,将文件nvml.h复制到/usr/include。为了测试,我在 tdk_3.304.5/nvml/example 中编译了示例代码,它运行良好。

一个周末,系统发生了一些变化(我无法确定发生了什么变化,而且我不是唯一可以访问机器的人),现在任何使用 nvml.h 的代码(例如示例代码)都失败了以下错误:

Failed to initialize NVML:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
WARNING:

You should always run with libnvidia-ml.so that is installed with your NVIDIA Display Driver. By default it's installed in /usr/lib and /usr/lib64. libnvidia-ml.so in TDK package is a stub library that is attached only for build purposes (e.g. machine that you build your application doesn't have to have Display Driver installed).
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

但是,我仍然可以运行 nvidia-smi 并读取有关我的 K20m 状态的信息,据我所知,nvidia-smi 只是对 nvml.h 的一组调用。我收到的错误消息有点神秘,但我相信它告诉我 nvidia-ml.so 文件需要与我在系统上安装的 Tesla 驱动程序相匹配。为了确保一切正确,我重新下载了 CUDA 5.0 并安装了驱动程序、CUDA 运行时和测试文件。我确定 nvidia-ml.so 文件与驱动程序匹配(两者都是 304.54),所以我很困惑可能出了什么问题。我可以使用 nvcc 编译和运行测试代码,也可以运行我自己的 CUDA 代码,只要它不包含 nvml.h。

有没有人遇到过这个错误或者有任何解决这个问题的想法?

$ ls -la /usr/lib/libnvidia-ml*
lrwxrwxrwx. 1 root root     17 Jul 19 10:08 /usr/lib/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root     22 Jul 19 10:08 /usr/lib/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 391872 Jul 19 10:08 /usr/lib/libnvidia-ml.so.304.54

$ ls -la /usr/lib64/libnvidia-ml*
lrwxrwxrwx. 1 root root     17 Jul 19 10:08 /usr/lib64/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root     22 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 394792 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.304.54

$ cat /proc/driver/nvidia/version 
NVRM version: NVIDIA UNIX x86_64 Kernel Module  304.54  Sat Sep 29 00:05:49 PDT 2012
GCC version:  gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Fri_Sep_21_17:28:58_PDT_2012
Cuda compilation tools, release 5.0, V0.2.1221

$ whereis nvml.h
nvml: /usr/include/nvml.h

$ ldd example
        linux-vdso.so.1 =>  (0x00007fff2da66000)
        libnvidia-ml.so.1 => /usr/lib64/libnvidia-ml.so.1 (0x00007f33ff6db000)
        libc.so.6 => /lib64/libc.so.6 (0x000000300e400000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x000000300ec00000)
        libdl.so.2 => /lib64/libdl.so.2 (0x000000300e800000)
        /lib64/ld-linux-x86-64.so.2 (0x000000300e000000)

编辑:解决方案是删除所有额外的 libnvidia-ml.so 实例。由于某种原因,它们有很多。

$ sudo find / -name 'libnvidia-ml*'
/usr/lib/libnvidia-ml.so.304.54
/usr/lib/libnvidia-ml.so
/usr/lib/libnvidia-ml.so.1
/usr/opt/lib/libnvidia-ml.so
/usr/opt/lib/libnvidia-ml.so.1
/usr/opt/lib64/libnvidia-ml.so
/usr/opt/lib64/libnvidia-ml.so.1
/usr/opt/nvml/lib/libnvidia-ml.so
/usr/opt/nvml/lib/libnvidia-ml.so.1
/usr/opt/nvml/lib64/libnvidia-ml.so
/usr/opt/nvml/lib64/libnvidia-ml.so.1
/usr/lib64/libnvidia-ml.so.304.54
/usr/lib64/libnvidia-ml.so
/usr/lib64/libnvidia-ml.so.1
/lib/libnvidia-ml.so.old
/lib/libnvidia-ml.so.1

【问题讨论】:

    标签: cuda nvcc tesla nvml


    【解决方案1】:

    您收到此错误是因为尝试使用 nvml 的应用程序正在加载位于以下位置的存根库:

    ...tdk_install_path/lib64/libnvidia-ml.so
    

    而不是:

    /usr/lib64/libnvidia-ml.so
    

    当我将存根库路径添加到我的LD_LIBRARY_PATH 环境变量时,我能够重现您的错误。因此,如果有人将 tdk 发行版附带的存根库的路径添加到您的 LD_LIBRARY_PATH 环境变量中,这可能是一种可能的错误来源,但可能不是发生这种情况的唯一方式。如果有人以不寻常的方式将存根库复制到某个系统路径,这也可能是一个问题。

    您需要尝试找出为什么您的系统加载该存根库而不是 /usr/lib64 中的正确库。或者,出于发现目的,您可以尝试删除系统上任何位置的存根库的所有实例(将正确的库保留在 /usr/lib/usr/lib64 中),您应该能够观察到正确的行为。

    【讨论】:

    • 感谢您的回复。我查看了我的 LD_LIBRARY_PATH 并没有找到对 tdk 目录的任何引用。在 libnvidia-ml.so 上执行 whereis 只会给我 /usr/lib 和 /usr/lib64 目录,所以我假设那里没有冲突,但我绝不是 Linux 专家,所以我可能错过一些东西。除了 LD_LIBRARY_PATH 之外,是否还有其他可能有错误引用的路径?也许有一个好方法让我检查并查看是否正在使用存根 .so ?我还 rm tdk 目录中的 lib 和 lib64 目录。
    • 你有什么操作系统?如果您有一个使用 nvml 构建的应用程序,但无法正常工作,那么当您运行以下命令时会发生什么:ldd myapp? (将myapp 更改为您编译的可执行文件的名称)也就是说,请使用该ldd 命令的输出编辑您的问题。
    • 我正在运行 centos 6.0。我没想过要检查 ldd,但我现在会发布结果。幸运的是,您的建议确实帮助我解决了这个问题。无论出于何种原因,执行 whereis 只会给我两个 /usr/lib* 目录,但执行 find / libnvidia-ml* 会发现一堆分散在文件系统中的条目。将它们全部删除即可解决问题。向你致敬!
    【解决方案2】:

    我在 GTX 1070 上使用 Windows 10 以这种方式解决了问题:转到设备管理器,选择有问题的 GPU,禁用 GPU 并重新启用。

    【讨论】:

    • 这对我也适用于 win10。至少我不必注销并重新登录。有没有人有永久的解决方案?
    【解决方案3】:

    我在使用 EWBF Cuda Miner for zCash 时遇到了相同或类似的问题。

    这是一种为 WIN10 自动实现 Pro7ech 的答案(对我有用)的方法:

    如果您还没有适用于 Windows 10 的 WDK,请安装它:这将使您能够使用 devcon.exe,它允许通过批处理脚本操作设备: https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk

    如果您没有使用 C++ 工作负载进行桌面开发的 Visual Studio,您可能还需要 Windows SDK: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk

    为了方便起见,您可能需要将安装路径添加到 PATH 环境变量中: https://www.howtogeek.com/118594/how-to-edit-your-system-path-for-easy-command-line-access/

    这里为我安装了 Devcon.exe:

    C:\Program Files (x86)\Windows Kits\10\Tools\x64
    

    所以现在在 cmd.exe 提示符下运行此或类似命令以获取设备 ID:

    devcon findall * | find /i "nvidia"
    

    这是我的样子:

    C:\Users\Soenhay>devcon findall * | find /i "nvidia"
    HDAUDIO\FUNC_01&VEN_10DE&DEV_0083&SUBSYS_38426674&REV_1001\5&1C277AD4&0&0001: NVIDIA High Definition Audio
    SWD\MMDEVAPI\{0.0.0.00000000}.{574980C3-9747-42EF-A78C-4C304E070B81}: SAMSUNG (NVIDIA High Definition Audio)
    ROOT\UNNAMED_DEVICE\0000                                    : NVIDIA Virtual Audio Device (Wave Extensible) (WDM)
    PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000: NVIDIA GeForce GTX 1070
    

    从中我看到我的图形设备 ID 是:

    PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000
    

    所以我创建了一个批处理文件,其中包含以下内容来禁用和重新启用驱动程序:

    devcon disable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"
    devcon enable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"
    

    现在,当我在启动矿工时收到 NVML 错误时,我只需运行这个批处理文件并修复它。您也可以每次都将这两行添加到您的 start.bat 文件的开头来执行此操作,但我发现现在每次重新启动矿工时间时并不总是发生错误。


    参考资料:

    superuser post

    devcon commands

    devcon examples

    No matching devices found.

    注意: 该命令应该在设备 ID 的开头有 @ 符号。 批处理脚本应以管理员身份运行。

    【讨论】:

      【解决方案4】:

      我也遇到了同样的错误。

      找到解决办法是运行命令:

      nvidia-uninstall
      

      【讨论】:

        猜你喜欢
        • 2022-10-17
        • 2016-07-08
        • 2020-09-26
        • 2016-02-15
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多