CUDA问题 - 如何在Win 10中进行清洁安装CUDA以解决cudaGetDevice()失败

4

我之前在这个运行 Win 10 64 位 Home 系统(针对 1080Ti 显卡)上安装了 CUDA 9.x,但需要更新到 CUDA 10.0 以支持 TensorFlow 2。一开始我以为 TF2 可以使用 CUDA 10.1,于是先安装了 10.1,后来才发现必须是 CUDA 10。

但是我无法使其正常工作...

为了测试 TF,我运行了以下代码以验证安装(使用 Anaconda 中的 Jupyter Notebook - 全新构建的 TF2 环境)

import tensforflow as tf
print(tf.reduce_sum(tf.random.normal([1000, 1000])))

我在基本Python测试中遇到了这个错误

InternalError:cudaGetDevice()失败。状态:未找到cudaGetErrorString符号

这表明找不到关键文件,但是我无法找出根本原因 - 而且那个错误信息很少,其中没有一个对我有帮助。

当前配置

CUDA 10.0已安装 Nvidia驱动程序436.48适用于游戏的准备好的驱动程序

可能存在的问题和迄今为止的解决措施

显然,它们都没有解决问题

  1. 旧CUDA安装 - 9.0、9.1、10.0、10.1:卸载除了10.0之外的所有内容并重新启动PC;然后再运行10.0安装程序
  2. 更新cudnn文件:首先尝试使用原始文件,然后将cudnn文件v7.6.3.30复制到相应的bin、include、lib中
  3. 从游戏准备好的驱动程序切换到"Studio"驱动程序
  4. 检查所有环境变量 - 删除所有引用CUDA!= 10.0的内容
  5. 更新在system32中将nvcuda.dll重命名为.old,并重新运行CUDA 10.0安装程序...没有生成新的nvcuda。
  6. 更新2我在驱动程序存储库中找到了nvcuda64.dll v 10.0.132,并将其替换为system32中的nvcuda.dll;重启后,nvidia-smi现在报告根本没有CUDA版本:(

已知异常

  1. [已取代由Update 2] nvidia-smi.exe报告CUDA 10.1(是的,在我的Win 10上可用) - 但是通过注册表检查,我找不到任何提示CUDA 10.1还在那里.. 更新在C:\ Windows \ System32中找到它

  2. 尽管进行了卸载,但我仍然在注册表中拥有CudaXYZWizardsPackage,该键位于Computer \ HKEY_USERS.DEFAULT \ Software \ Microsoft \ VisualStudio \ 14.0_Config \ InstalledProducts下,其中XYZ = 90、91、100、101 - 但我怀疑这不是 Python中的TF问题;) 更新在C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ IDE \ Extensions \ NVIDIA中除了10.0之外,没有其他内容,因此只是孤立的reg条目。

其他信息

  1. 在执行所有卸载等操作之前,我成功地在VS 2017中构建并运行了Nvidia示例时钟项目,因此基础知识是正确的(那时)

问题

  1. 我应该如何完全删除CUDA的所有痕迹以便从干净的状态重新开始?
  2. 今后如何诊断此类问题以确定问题所在/该做什么?
  3. 是否有更简单的方法来解决这个特定的问题?
  4. (新)我在哪里可以获取nvcuda.dll 10.0以替换system32中的文件?- 答案一种可能是从C:\Windows\System32\DriverStore\FileRepository中获取。

一个踩?“这个问题没有展示努力,不清晰等等?”那个踩比问题更容易受到评估的影响,因为没有解释,没有建议如何改进等等。我总是乐于接受关于如何改进事物的积极贡献...请给予建议。 - Julian Moore
"nvidia-smi.exe 报告 CUDA 10.1" -- 这只是驱动程序的兼容性,它并没有说明您安装了什么。我的观点是这要么是一个关于tensorflow设置的问题,要么就是不相关的话题。您应该相应地标记和编辑它。 - talonmies
@talonmies 尽管最终目标是配置TF,但问题具体在于:如何彻底删除CUDA安装的所有痕迹,以便重新开始 + 相关项目。我会相应修改标题。 - Julian Moore
请随时告诉我们任何您发现的新信息。显然,要使其正常工作,需要非常敏感的cuda、tf、python、gpu和gpu驱动程序版本组合。非常令人恼火。 - Diego
@Diego 我知道这些依赖关系非常复杂...难的是要在一个地方找到一致的集合描述。我打算重新构建Windows(暂时使用新的HDD)并从头开始。非常痛苦。此外,nVidia完全删除说明与?Revo卸载程序不够完整,a)除非小心,否则会删除剩余的NVidia应用程序等的卸载信息,b)仍然留下一堆无法管理的注册表条目。我甚至无法“正确”删除纯VGA版本的nv图形驱动程序。非常,非常,非常恼人。 - Julian Moore
2个回答

2
  1. 下载并安装Anaconda (Python 3.7):https://www.anaconda.com/distribution/

  2. 在命令提示符中:

conda update conda
conda update python
conda create --name tensorflow-gpu conda activate tensorflow-gpu conda install pip jupyter pip install tensorflow-gpu conda install cudatoolkit=10.0 -c pytorch
  1. 在开始菜单中选择 Anaconda3 (64-bit) -> Jupyter Notebook (tensorflow-gpu)
import tensorflow as tf
%%time
with tf.device('/CPU:0'):
    a = tf.random.uniform([1000,1000])
    b = tf.random.uniform([1000,1000])
c = tf.matmul(a, b)

墙上时间:18.9毫秒

%%time
with tf.device('/GPU:0'):
    a = tf.random.uniform([1000,1000])
    b = tf.random.uniform([1000,1000])
c = tf.matmul(a, b)

墙上时间:2.99毫秒


2
操作系统是Windows,根据此页面https://www.tensorflow.org/install/pip,在Linux下支持Python 3.7,但在Windows信息中明显缺失。您已经执行了所描述的步骤;问题出现在执行例如tf.random.uniform([1000,1000])时。当证据似乎强烈支持CUDA问题(即10.1 CUDA驱动程序卸载并安装了10.0时),您能否提供一些重新安装Python的有力理由? - Julian Moore
@JulianMoore 我使用的是Windows 10 (1903)、CUDA 10.1和cuDNN 7.6。MXNet可以识别CUDA 10.1,但TensorFlow 2.0和PyTorch只能与CUDA 10.0兼容。我的解决方法是:conda install cudatoolkit=10.0 -c pytorch。因此,我不需要删除CUDA 10.1。另外,是的,TensorFlow 2.0可以在Windows上与Python 3.7一起使用。 - Alexey Golyshev
明天我会尝试 - 谢谢。-c pytorch 技巧是什么意思? - Julian Moore
从PyTorch仓库下载。 - Alexey Golyshev
第一个测试(matmul)失败,错误为“在动态链接库C:\ WINDOWS \ SYSTEM32 \ nvcuda.dll中找不到过程入口fatBinaryCtl”(这恰好是我自己以前安装TF2时遇到的相同错误)。你有什么建议? - Julian Moore
1
我建议您重新安装Windows。我的答案中的指令适用于3台不同的计算机,均为Windows 10(1903),CUDA 10.1。但是它们使用了不同的GPU:940MX、GTX1050Ti和RTX2060。 - Alexey Golyshev

1

这基本上是一条扩展评论,因为@diego要求更新...

我现在安装了CUDA 10.0,并且nVidia控制面板报告nvcuda.dll为v 10.0.132

我使用Visual Studio 2017从C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\1_Utilities\deviceQuery中的vs解决方案构建了推荐的演示设备查询程序devicequery.exe(请注意,.exe最终位于C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\bin\win64\Debug中)

然后从cmd提示符运行该程序并给出以下输出。

设备查询开始... CUDA设备查询(运行时API)版本(CUDART静态链接) 检测到1个CUDA可用设备 设备0:“GeForce GTX 1080 Ti” CUDA驱动程序版本/运行时版本 版本号:10.0 / 10.0 CUDA能力主/次版本号:6.1 全局内存总量: 11264 MBytes(11811160064字节)(28)多处理器,(128)CUDA核心/MP: 3584 CUDA核心 GPU最大时钟速率:
1607 MHz(1.61 GHz) 内存时钟速率:
5505 Mhz 内存总线宽度:352位 L2缓存大小:2883584字节 最大纹理维度大小(x,y,z)1D =(131072),2D =(131072, 65536),3D =(16384,16384,16384)最大分层1D纹理大小, (num)层1D =(32768),2048层 最大分层2D纹理大小, (num)层2D =(32768,32768),2048层 常量内存总量:65536字节 每块共享内存总量:49152字节 每块可用寄存器总数:65536 Warp大小:
32 每个多处理器的最大线程数:2048 每个块的最大线程数:1024 线程块的最大维度大小(x,y,z):(1024,1024,64)网格大小的最大维度大小 (x,y,z):(2147483647,65535,65535)最大内存间距:
2147483647字节 纹理对齐:512字节 并发复制和内核执行:是,有2个复制引擎 运行时限制内核:是
集成GPU共享主机内存:否 支持主机页面锁定内存映射:是 表面对齐要求:是 设备支持ECC:
已禁用 CUDA设备驱动程序模式(TCC或WDDM):WDDM(Windows显示驱动程序模型) 设备支持统一寻址(UVA):是 设备支持计算抢占:否
支持合作内核启动:否 支持多设备合作内核启动:否 设备PCI域ID /总线ID /位置ID:0/1/0 计算模式: <默认(多个主机线程可以同时使用::cudaSetDevice()与设备)>

我是如何做到这一点的?很难具体说明,因为我没有意识到我已经成功了,但我记得将显示驱动程序设置为VGA,重新启动(为了安全起见两次),然后卸载CUDA 10.0,重新启动,然后安装10.0。

我刚刚注意到我使用vs 2012解决方案构建了deviceQuery,但我同意VS在打开解决方案时更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接