win10+CUDA11.2+cuDNN8.1+python3.8+tensorflow2.6.0环境配置

1. 基本知识

1.1 显卡

 显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来,同时显卡还是有图像处理能力,可协助CPU工作,提高整体的运行速度。对于从事专业图形设计的人来说显卡非常重要。 民用和军用显卡图形芯片供应商主要包括AMD(超微半导体)和NVIDIA (英伟达)2家。现在的top500计算机,都包含显卡计算核心。在科学计算中,显卡被称为显示加速卡。

1.2 GPU

 GPU就是用很多简单的计算单元去完成大量的简单的不相互依赖的计算任务。虽然GPU是为了图像处理而生的,但是它在结构上并没有专门为图像服务的部件,只是对CPU的结构进行了优化与调整,所以现在GPU不仅可以在图像处理领域大显身手,它还被用来科学计算、密码破解、数值分析,海量数据处理(排序,Map-Reduce等),金融分析等需要大规模并行计算的领域。

1.3 CUDA

 CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 和中央处理器(Central Processing Unit, CPU)相对,图形处理器(Graphics Processing Unit, GPU)是显卡的核心芯片。而cuda正是暴露了英伟达开发的GPU的编程接口。

1.4 cuDNN

 NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型,而不是简单调整性能,同时还可以在GPU上实现高性能现代并行计算。
 CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。

2. 显卡驱动安装

这一步其实可以不需要,因为CUDA自带显卡驱动,但其自带的驱动版本一般不是最新版本。我这里是更新到最新版本了。(显卡驱动的版本向下兼容,所以更新至最新版本可以适应于任何CUDA+cuDNN版本)

在任务管理器中查看自己电脑的显卡型号。
在这里插入图片描述
我电脑上有两个显卡,其中英伟达的显卡型号为NVIDIA GeForce RTX 2060。

显卡驱动下载


根据自己的显卡型号选择对应的显卡驱动,然后下载。
在这里插入图片描述
(一定要根据自己的操作系统和显卡型号选择对应驱动版本,进行下载)

然后右键点击“以管理员身份运行”,进行安装。可以选择安装位置,但一般建议安装在C盘,安装在系统盘之外的盘不知道是否会出问题。我个人是安装在C盘的。

安装完成之后查看驱动版本为511.79。
在这里插入图片描述

3. CUDA安装及配置

在网上翻教程的时候,发现CUDA在安装之前一般要先安装Visual Studio 2019或其他版本,因为CUDA需要Visual Studio的某个组件。但是我电脑很早之前就安装了Visual Studio 2019,所以也没有测试Visual Studio 2019对于安装CUDA的必须性。建议你先安装Visual Studio 2019或VS其他版本,再来继续安装CUDA,以免出现错误。

3.1 CUDA下载

首先,选择合适的CUDA版本,一定要与显卡驱动相匹配(上文说过,最新的显卡驱动向下兼容,可以适应于所有版本的CUDA+cuDNN)。

CUDA版本与显卡驱动版本对应关系如下:
在这里插入图片描述
CUDA下载地址
选择合适的CUDA版本进行下载
在这里插入图片描述

一般选择本地安装(下图中红框所示)
在这里插入图片描述
下载得到安装文件
在这里插入图片描述

3.2 CUDA安装

右键点击“以管理员身份运行”,进行安装。
选择自定义安装。
在这里插入图片描述
如果完全按照我上面的流程来,下图中红框所示应该是要取消勾选的。这里其实就是显卡驱动的安装,因为在第二步我们已经安装了最新版本,在这里当然是没有必要安装一个更低版本的驱动,所以取消勾选。另外,你可以自己查看要安装的每一项,如果你的现有版本比安装版本更新,那当然要取消勾选该项了。
我安装时是只勾选了上面两项,下面两项取消勾选了。(下图是从其他地方找来的,我安装时忘了截图)
在这里插入图片描述
选择安装位置,默认位置是在C盘,但是我放在D盘了,并且后续的所有安装以及调试都没有出现错误。如果你不想放在系统盘的话,可以跟我一样放在其他盘。
在这里插入图片描述
点击下一步,等待,安装完成。

3.3 CUDA安装确认

在自己安装路径的bin文件夹里可以找到nvcc.exe
在这里插入图片描述
在自己安装路径的extras\CUPTI\lib64文件夹里可以找到下面两个文件。
在这里插入图片描述

4. cuDNN下载及配置

选择与CUDA版本相匹配的cuDNN版本。
在这里插入图片描述

cuDNN下载地址
根据自己所选的cuDNN版本选择对应链接进行下载。
在这里插入图片描述
下载得到压缩文件。
在这里插入图片描述
将该压缩包解压后得到一个名为“cuda”的文件夹,将其重命名为“cudnn”。
在这里插入图片描述
将“cudnn”整个文件夹拷贝到安装目录下,“cudnn/”与“bin/”在同一级目录下。
在这里插入图片描述

5. 环境变量配置

在设置中搜索环境变量,选择“编辑系统环境变量”。

选择“环境变量”
在这里插入图片描述
单击系统变量下的Path,点击编辑
在这里插入图片描述
点击“新建”,将下面这四行加到环境变量里。

D:\setup\CUDA\CUDA11.2\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
D:\setup\CUDA\CUDA11.2\NVIDIA GPU Computing Toolkit\CUDA\v11.2\libnvvp
D:\setup\CUDA\CUDA11.2\NVIDIA GPU Computing Toolkit\CUDA\v11.2\extras\CUPTI\lib64
D:\setup\CUDA\CUDA11.2\NVIDIA GPU Computing Toolkit\CUDA\v11.2\cudnn\bin

一般新加的在最下面,所以需要重复点击“上移”将这四行移到最上面。
在这里插入图片描述

大功告成!测试一下
打开cmd,键入nvcc -V
如果安装成功,并配置了环境变量,会输出cuda的版本信息。
在这里插入图片描述

6. tensorflow环境配置

一定要选择与CUDA+cuDNN版本匹配的tensorflow版本和python版本。
版本对应关系如下
在这里插入图片描述

关于python环境的配置,我这里就不说了,网上有很多教程,还不会的可以自行去查找。我使用的是Anaconda,并配置了多个python环境,其中base环境就是我所要配置的环境。

我的版本是CUDA11.2,cuDNN8.1,python3.8,所以需要安装tensorflow_gpu2.6.0。

pip install tensorflow_gpu==2.6.0
pip install tensorflow==2.6.0
pip install keras==2.6.0

tensorflow_gpu、tensorflow、keras的版本一定保持一致,否则引用tensorflow中的某些函数时会报错

7. 测试

测试代码如下

import tensorflow as tf
import timeit

with tf.device('/cpu:0'):
    cpu_a = tf.random.normal([10000, 1000])
    cpu_b = tf.random.normal([1000, 2000])
    print(cpu_a.device, cpu_b.device)
with tf.device('/gpu:0'):
    gpu_a = tf.random.normal([10000, 1000])
    gpu_b = tf.random.normal([1000, 2000])
    print(gpu_a.device, gpu_b.device)
def cpu_run():
    with tf.device('/cpu:0'):
        c = tf.matmul(cpu_a, cpu_b)
    return c
def gpu_run():
    with tf.device('/gpu:0'):
        c = tf.matmul(gpu_a, gpu_b)
    return c
# warm up
cpu_time = timeit.timeit(cpu_run, number=10)
gpu_time = timeit.timeit(gpu_run, number=10)
print('warmup:', cpu_time, gpu_time)

cpu_time = timeit.timeit(cpu_run, number=10)
gpu_time = timeit.timeit(gpu_run, number=10)
print('run time:', cpu_time, gpu_time)

运行结果

/job:localhost/replica:0/task:0/device:CPU:0 /job:localhost/replica:0/task:0/device:CPU:0
/job:localhost/replica:0/task:0/device:GPU:0 /job:localhost/replica:0/task:0/device:GPU:0
warmup: 0.6469694000000006 0.4407160000000001
run time: 0.6350846000000008 0.000880000000000436

Process finished with exit code 0

成功!!!

然后去运行了一个简单的神经网络模型(LeNet_5),源码我就不列了,在我另一篇博文里。LeNet_5源码

运行结果:
在这里插入图片描述
速度飞快!比之前快了很多倍。

注:在训练神经网络时,可能会出现显存不够的情况,这是因为batch_size设置过大,使得原本用CPU可以跑的程序在GPU上无法运行。这时根据自己电脑的显存设置合适的batch_size即可。


2022/3/19更新

今天看到有人收藏了我的这篇博文,忍不住去翻了翻人家的文章。看到这位收藏兄也写了一篇CUDA+cuDNN配置的博文,而且发表日期还是今天,仔细地看了看,中间有些地方还是有借鉴我的这篇博文,对此我感到非常开心,毕竟写此文章的目的就是希望帮助到大家。但是最后我发现他其实没有配置成功,运行结果明显有问题(但是他以为自己成功了)。

在测试部分,我一共用了两个测试代码(以下简称为test1和test2),test2是LeNet_5的神经网络源码,这位收藏兄并没有运行我的test2,只是简单地测试了一下test1,他的运行结果如下:

/job:localhost/replica:0/task:0/device:CPU:0 /job:localhost/replica:0/task:0/device:CPU:0
/job:localhost/replica:0/task:0/device:CPU:0 /job:localhost/replica:0/task:0/device:CPU:0
warmup: 0.6677898000000013 0.6471977999999972
run time: 0.6454234999999997 0.6467144000000005

收藏兄看到这个运行结果,感到非常开心,大呼“运行成功!”,但是真的成功了吗?

请看我的test1运行结果:

/job:localhost/replica:0/task:0/device:CPU:0 /job:localhost/replica:0/task:0/device:CPU:0
/job:localhost/replica:0/task:0/device:GPU:0 /job:localhost/replica:0/task:0/device:GPU:0
warmup: 0.6469694000000006 0.4407160000000001
run time: 0.6350846000000008 0.000880000000000436

相信细心的coder已经发现了,我的第二行输出为“device:GPU:0 ”,同样的位置,收藏兄的输出是 “device:CPU:0”,显然,他根本没有调用到GPU,只是重复的在用CPU做运算。

再看输出的第三行和第四行,我的gpu_time相比cpu_time均有明显减小,这说明运行速度加快了! 特别是第四行,cpu_time(0.63508)是gpu_time(0.00088)的722倍!而收藏兄的cpu_time和gpu_time,呃,,,,不能说一模一样,只能说相差无几(^^),这显然就没有改进嘛。

至于为什么收藏兄会出现这种情况,大概率是版本没有对上,因为我在配置过程中也出现了和收藏兄一样的情况,那个时候我的tensorflow_gpu版本还是2.3.0,运行时发现程序明显没有调用到GPU。所以我又将tensorflow_gpu版本更新到了2.6.0,这时程序可以正常的调用到GPU了。

此外,当我将tensorflow_gpu和tensorflow都更新至2.6.0,再去运行LeNet_5神经网络模型时,程序竟然提示报错(应该是load_model模块引用错误)。但是就在上个月,我这个程序还在CPU上运行正常。后来发现是keras版本没有对上(当时版本是2.8.0),然后我又把keras版本重新安装成2.6.0,再去跑LeNet_5,运行成功!

所以!!! 版本一一对应非常重要!!!
我安装的所有版本如下:

'''
显卡驱动程序版本:	511.79
CUDA:				11.2
cuDNN:				8.1
python:			3.8
tensorflow:		2.6.0
tensorflow_gpu:	2.6.0
keras:				2.6.0
'''

所有版本必须一一对应

  • 23
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷冰殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值