cuda8和cuda10切换 以及正确按照配置cuDNN

摘要:
Caffe对cuDNN版本没有很严格的要求,只要它大于cuDNN4即可。TensorFlow的当前版本r1.2需要安装cuDNN,并且对版本有相应的限制。Torch可以通过LuaJit自动检测当前系统中的cuDNN版本,以进行相应的编译。如果不重置cuDNN的相应符号链接,此方法无法成功安装cuDNN。保存更改后的文件后,立即执行以下操作:sourceBashrc1重新启动终端。此步骤可以成功配置cuDNN的Lib文件。打开终端并输入/your/path/to/cudnn/include。其中,/your/path/to/cunnn/include是指解压缩路径中的include文件夹。tgz文件。

切换至 cuda-8.0
sudo rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-8.0 /usr/local/cuda
nvcc --version
which nvcc

切换至 cuda-10.0
sudo rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda
nvcc --version
which nvcc

为什么需要安装cudnn
cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络(Deep Neural Networks)中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式,例如convolution、pooling、normalization以及activation layers的前向以及后向过程。

cuDNN只是NVIDIA深度神经网络软件开发包中的其中一种加速库。想了解NVIDIA深度神经网络加速库中的其他包请戳链接https://developer.nvidia.com/deep-learning-software。

各深度学习框架安装cuDNN需知
基本上所有的深度学习框架都支持cuDNN这一加速工具,例如:Caffe、Caffe2、TensorFlow、Torch、Pytorch、Theano等。

Caffe可以通过修改Makefile.config中的相应选项来修改是否在编译Caffe的过程中编译cuDNN,如果没有编译cuDNN的话,执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍(Caffe官网上说不差多少,明明差很多嘛)。Caffe对cuDNN的版本不是很严格,只要大于cuDNN 4就可以。

TensorFlow目前的版本r1.2,强行要求装cuDNN,而且对版本也有相应的限制(cuDNN 5.1)。不过就官方说明看,TensorFlow将在下一个版本r1.3中加入对cuDNN 6.0的支持。

Torch通过LuaJit可以自动检测目前系统中的cuDNN版本来进行相应的编译(如没有cuDNN,也可在进行Torch的安装)。

如何安装cudnn
首先说一下网上大多数中文安装cuDNN教程的错误方式,这种方式真的坑人无数。

简单地说网上的大多错误的安装cuDNN的方式都是将下载后的cuDNN压缩包解压。然后再将cudnn的头文件(cuda/include目录下的.h文件)复制到cuda安装路径的include路径下,将cudnn的库文件(cuda/lib64目录下的所有文件)复制到cuda安装路径的lib64路径下。这种方法如果不重置cuDNN相应的符号链接的话是不能成功的安装cuDNN的。

下面我们说一下正确的安装cuDNN方式,其实跟着官方安装说明进行安装就可以了。

从https://developer.nvidia.com/cudnn上下载cudnn相应版本的压缩包(可能需要注册或登录)。

如果这个压缩包不是.tgz格式的,把这个压缩包重命名为.tgz格式。解压当前的.tgz格式的软件包到系统中的任意路径(这个路径很重要,以下将该路径的绝对路径简称为/your/path/to/cudnn),解压后的文件夹名为cuda,文件夹中包含两个文件夹:一个为include,另一个为lib64。
例如:我将这个压缩包解压在了/usr/local目录下,那么该文件的绝对路径为/usr/local/cuda

tar -zvxf archive_name.tar.gz -C /usr/local
1
将解压后的文件中的lib64文件夹关联到环境变量中。这一步很重要。
cd ~
sudo gedit .bashrc
1
2
在弹出的gedit文档编辑器(.bashrc中)中最后一行加入:

export LD_LIBRARY_PATH=/your/path/to/cuda/lib64:$LD_LIBRARY_PATH
1
其中/your/path/to/cudnn/lib64是指.tgz解压后的文件所在路径中的lib64文件夹。
保存更改的文件后,紧接着:

source .bashrc
1
再重启一下Terminal(终端),该步骤可以成功的配置cuDNN的Lib文件。

配置cuDNN的最后一步就是将解压后的cuDNN文件夹(一般该文件名为cuda)中的include文件夹(/your/path/to/cudnn/include)中的cudnn.h文件拷贝到/usr/local/cuda/include中,由于进入了系统路径,因此执行该操作时需要获取管理员权限。

打开终端,进入/your/path/to/cudnn/include。其中/your/path/to/cudnn/include指的是.tgz解压后的文件所在路径中的include文件夹。例如:

cd /YOUR/PATH/TO/cuda/include
sudo cp *.h /usr/local/cuda/include/
1
2
其中这里的cuda/include对于我自己的安装来说就是/your/path/to/cudnn/include。因为我将cudnn的.tgz压缩包解压到了home的当前用户的路径下,解压后的文件夹名为cuda。

之后,再重置cudnn.h文件的读写权限:

sudo chmod a+r /usr/local/cuda/include/cudnn.h
1
至此,cuDNN的配置就全部安装完成了。

另外:
查看cuda版本的方法:

cat /usr/local/cuda/version.txt
1
查看cudnn版本的方法:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

免责声明:文章转载自《cuda8和cuda10切换 以及正确按照配置cuDNN》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[luoguP1364] 医院设置(树的重心)android http 和https请求下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux系统监控示例:vmstat

一。基础演示: [nwom@WLAN-linux-3 ~]$ vmstat -n 2 10 ([nwom@WLAN-linux-3~]vmstat –n 2 10 以每2秒钟的频率执行10次取样) procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----...

verilog之预编译

verilog之预编译 1、基本作用 预编译,就是在verilog进入编译器前的准备工作。一般是完成一些文件的调用,一些编译器的设置,一些参数的定义。一般使用include,define,timescale就可以实现。比较灵活的使用是ifdef和endif的插入,可以将预编译的功能拓展。 2、使用事例 `define WIDTH 8`include "de...

【CUDA并行编程之八】Cuda实现Kmeans算法

本文主要介绍如何使用CUDA并行计算框架编程实现机器学习中的Kmeans算法,Kmeans算法的详细介绍在这里,本文重点在并行实现的过程。 当然还是简单的回顾一下kmeans算法的串行过程: 伪代码: [cpp]view plaincopy 创建k个点作为起始质心(经常是随机选择) 当任意一个点的簇分配结果发生改变时 对数据集中的每个数据点 对每...

assert用法

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: void assert( int expression ); assert的作用是计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。看下面的程序:...

Qt 访问网络

一、前言 Qt 中访问网络使用 QNetworkAccessManager,它的 API 是异步的,这样在访问网络的时候不需要启动一个线程,在线程里执行请求的代码。(但这一点在有时候需要阻塞时就是个麻烦了) 需要注意一点的是,请求响应的对象 QNetworkReply 需要我们自己手动的删除,一般都会在 QNetworkAccessManager::fin...

Android源码分析(一)-----如何快速掌握Android编译文件

一 : Android.mk文件概述 主要向编译系统指定相应的编译规则。会被解析一次或多次。因此尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析。这个文件的语法会把源代码组织成模块,每个模块属于下列类型之一: - APK程序:一般的Android程序,编译打包生成apk文件。 - JAVA库:java类库,编译打包生成jar包文件。...