Caffe实战(五):Caffe计算加速之CUDA安装配置(win+ubuntu)

CUDA是又NVIDIA在2006年推出的一套针对异构计算资源下的大规模并行计算的架构,包括编译器(nvcc)、开发工具、运行时库和驱动等模块。
(在安装CUDA时会安装相应版本的驱动,如果需要多个CUDA版本并存,则应该将高版本的CUDA最后安装,这样高版本的驱动向下兼容低版本)

1、区分cuda driver version和runtime version

几个易混淆的概念:
  • nvidia 显卡驱动(与cuda driver概念等同):不管是否使用cuda,都需要安装显卡驱动(比如玩游戏等)。简单说,只要使用nvidia显卡, 就要安装相应的驱动。可通过“nvida-smi”指令查询
上图显示,这台电脑的显卡驱动版本是388.57
  • cuda toolkit:也就是所说的cuda版本(开发工具包,包括nvcc编译器等,利用显卡进行并行计算处理),在官网下载的就是这个,如cuda8.0等;注意,安装的cuda版本要和显卡驱动匹配,cuda版本需要的最小驱动版本对比表
  • cuda runtime version:这里包括一些进行cuda高性能计算用到的库文件;如果分开安装时需要先安装cuda driver,然后在安装这个。不过,现在下载的cuda版本都包括显卡的驱动,cuda toolkit以及runtime文件,不需要再分开安装。
  • cudnn版本:这个是Nvidia公司提供的深度学习加速库,可以提高深度学习的计算速度;
 
正确的安装顺序是:Nvidia显卡驱动--->cuda (需要查看显卡驱动是否支持该版本,还要和电脑的操作系统匹配,主要是cuda toolkit和runtime)--->cudnn(需要和cuda版本匹配)
 
注意:现在下载的cuda安装包中通常包含有一个对应的显卡驱动版本,可以安装,也可以不安装。无论是单独安装,还是利用cuda安装包中指定的版本,一定要保证电脑中各个版本相互匹配。
  • cuda driver(显卡驱动)
  • cuda toolkit
  • cuda runtime
 
通过cuda sample自带的工具deviceQuery.exe可以查询显卡cuda详细信息:
 
可以看出这里的cuda driver version和runtime version不一致,电脑中明明安装的是cuda8.0,为何cuda driver version是9.1呢?
这是因为电脑中显卡的驱动是388.57,对应的cuda驱动版本是9.1,虽然实际安装的cuda8.0,但是实际指向的确实显卡驱动388.57对应的cuda版本。最可靠的方式是直接安装cuda9.1版本(使用中也没发现问题)。
 
从这个例子可以(1)从显卡驱动的版本选择对应的cuda版本;(2)根据选择的cuda版本,更新对应的显卡驱动版本。不管哪种方式,一定要保证各个版本相互匹配。
 
 

2、CUDA&cuDNN安装

关于CUDA和cuDNN的安装,网上有很多介绍,这里不再多述。默认的CUDA安装不包括cuDNN,需要通过网站注册为CUDA开发者才能获得下载权限。
 
cuDNN的安装很简单,直接解压下载的安装包即可,只不过使用时需要添加cuDNN路径。另外一种更简单的方法是将cuDNN中的目录(bin,include,lib)复制到CUDA对应目录下,这样做的目的是CUDA路径已经添加到环境变量中,以后查找cuDNN文件时直接从该路径中查找,不用再手动添加cuDNN路径了。
 
需要特别指出的是在安装CUDA时会安装相应版本的驱动,如果需要多个CUDA版本并存情况,则应该将高版本的CUDA最后安装,这样高版本的驱动向下兼容低版本。
 
一定要注意版本问题:cuda有支持winows7和winows10的版本区分;cuDNN也有对应CUDA的版本区分;同样caffe也有对cuDNN版本的要求。从微软最先地址下载的caffe一般支持cudnn4或5,网上常见的安装版本是CUDA8.0+cuDNN5.0(5.1)+vs2013+caffe。
 

2.1 win平台安装cuda

在windous平台上安装cuda比较简单,唯一需要注意的是需要选择对应的操作系统版本,以及架构类型。
 
另外,cuda安装成功后会将cuda bin路径自动添加到系统环境变量中,便于系统找到cuda工具。但是,在进行cuda编程时,需要添加cuda头文件和lib文件路径,可以在vs中手动设置,也可以提供添加到系统变量中,这样进行cuda编程时可以自动搜索到相应的头文件和库文件。添加路径如下所示:(非必须)
 
# 手动将cuda头文件路径、库文件路径以及samples生成的bin路径添加到Path中
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64 C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\bin\win64 C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\lib\x64
 
【验证驱动安装成功】
查看NVIDIA系统管理接口命令nvidia-smi,可以看到GPU设备和驱动以及占用率等详情
// 如果不识别该命令,将该命添加到环境变量中
nvidia-smi
nvidia-smi -i n // 查看设备n的信息
nvidia-smi -q -i n  // 查看设备n的详细信息,比如查看设备0,nvidia-smi -q -i 0
nvidia-smi -l n  // 每隔n秒时间动态更新GPU使用情况

该命令十分强大,可以控制GPU超频,监控GPU运行信息,可以通过"nvidia-sim -h“获得详细命令清单。
 
Windows下NVSMI工具默认安装位置为C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-sim.exe
 
【验证CUDA安装成功】
方法一:查看nvcc版本
nvcc --version
 
方法二:运行CUDA自带例子
比如编译CUDA Samples\v8.0\1_Utilities\deviceQuery.cpp 该工具查看CUDA的详细信息,包括CUDA版本,kernel数,blob size等信息。很有用的查询工具

 

【查看CUDA详细信息】
CUDA sample中自带很多例子,其中有关于查看设备详细信息的工具,..\CUDA Samples\v8.0\1_Utilities\deviceQuery,编译生成可执行程序。
 

2.2 ubuntu平台安装cuda

linux上安装如果分开安装显卡驱动,cuda toolkit还是比较麻烦的,很容易出现不兼容情况导致安装失败。尤其是cuda对linux内核也有相应的要求,如果内核不匹配还要更新到相应的内核版本。

2.2.1 安装Nvidia显卡驱动

由于自己是在笔记本上测试,系统ubuntu 18.04,显卡GTX 960M,正好网上有一篇相同配置的安装教程可以参考:【深度学习】Ubuntu18.04安装NVIDIA GTX960M驱动
 
【第一步:查看NVIDIA显卡所需驱动版本】
# 检测NVIDIA显卡型号和推荐的驱动程序的模型。在命令行中输入如下命令:
$ ubuntu-drivers devices
 
# 识别NVIDIA显卡型号,输入一下命令:
$  lshw -numeric -C display
 
# 查看nvidia显卡信息
lspci | grep -i nvidia
 
根据配置选择需要的最新的驱动下载,如NVIDIA-Linux-x86_64-440.36.run
 
【第二步:删除原有驱动及禁用第三方驱动】
(1)删除原有驱动
sudo apt-get remove --purge nvidia*
 
(2)删除双显卡切换工具Bumlebee(如果有)
sudo apt-get purge bumblebee* bbswitch-dkms

 

(3)禁用nouveau驱动
ubuntu默认内置了Nvidia的第三方开源驱动nouveau,在安装nvidia驱动时,回合nouveua驱动冲突,所以需要将该驱动禁用
sudo gedit /etc/modprobe.d/blacklist.conf
 
#在blacklist.conf最后中添加:
blacklist nouveau
 
# 禁用生效
sudo update-initramfs -u
 
# 重启电脑
reboot
 
# 查看是否禁用成功,无输出则禁用成功
lsmod | grep mouveau

 

【第三步:安装驱动】
 
第一种方式:下载离线驱动,运行
# 运行脚本
sudo sh NVIDIA-Linux-x86_64-440.36.run
 
# 或者赋权运行脚本
sudo chmod +x NVIDIA-Linux-x86_64-440.36.run
sudo ./NVIDIA-Linux-x86_64-440.36.run
 
第二种方式:命令安装(在线下载)
sudo apt-get install nvidia-driver-440 nvidia-settings nvidia-prime
 
【第四步:重启并验证是否安装成功】
# 重启系统
reboot
 
# 验证驱动是否安装成功
nvidia-smi
 
# 启动图像界面
nvidia-settings

 

网上也有教程说安装nvidia驱动时需要切换到文本模式(Ctrl+Alt+F1)下进行,主要是为了关闭X server session,避免在安装驱动时出现问题。
详细可以参考:Ubuntu安装NVIDIA驱动
 
不过本人在安装过程中没有出现问题,所以就没有尝试这种方法。
 
特别注意,在安装驱动时,如果电脑是UEFI模式,一定要关闭secure boot项,否则无法安装第三方驱动。(在UEFI模式下,不关闭secure boot项,则会出现很多问题,尤其是很多硬件的驱动无法安装,甚至无法使用)
 
【卸载驱动】
# 利用nvidia自带工具卸载
sudo nvidia-uninstall

2.2.2 安装cuda

最简单的安装方法直接下载系统对应的cuda版本的runfile,包括cuda driver,cuda toolkit和runtime等内容,可以不用单独采用2.2.1小节的方法先安装nvidia显卡驱动。
 
其实,最可靠正确的方法还应参考nvidia官网提供的文档手册, https://docs.nvidia.com/cuda/index.html。上面介绍了各个系统详细的安装过程,以及不同的安装方法。
 
下载所需cuda版本的runfile文件,并执行
sudo sh cuda_10.2.89_440.33.01_linux.run
从文件名称上可以看出cuda版本和显卡驱动版本,cuda版本为10.2.89,显卡驱动版本为440.33.01
 
在安装过程中,可以选择安装自带的cuda driver(其实就是显卡驱动,如2.2.1小节),也可以指定cuda toolkit和cuda sample安装路径(特别是在根目录空间有限的情况下特别有用)
 
如果已经安装过显卡驱动,并且符合cuda要求的版本,则在安装cuda过程中可以不安装显卡驱动。如果后期想安装该安装文件自带的驱动,只需执行如下命令
sudo sh cuda_10.2.89_440.33.01_linux.run --silent --driver

 

特别注意三点:
(1)cuda版本越高,所需空间越大。特别是最新的cuda 10.2 runfile有2.4G左右,安装所需空间至少得3G,默认安装到/usr/local目录下会占用很大的空间,对于本来就划分十几个G的根目录往往导致空间不足,无法安装。因此,需要指定安装目录。另外,在安装过程中,需要从runfile文件中解压,抽取需要的文件,默认缓冲到根目录下,因此实际根目录实际需要的空间会更大。
 
# 指定临时目录,可以不占用根目录空间
sudo sh cuda_10.2.89_440.33.01_linux.run -tmpdir 目录
在安装过程中,指定cuda安装路径。
 
2)cuda对linux kernel以及gcc有所要求。(特别注意)
 
如下表所示,在ubuntu 10.04系统上安装cuda 10.2所需的linux kernel至少是4.15.0,可查询 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
 
所以,在linxu上安装cuda时,除了显卡驱动,cuda toolkit要安装并版本兼容以外,还要保证所需的linux kernel和gcc版本满足要求。如果不满足要求,还要获取相应的kernel。
# 查询当前版本号
cat /proc/version
 
uname -a  查看内核版本
cat /etc/issue 简单的版本信息
cat /etc/lsb-release  具体信息
 
# 通过下面命令获取kernel(具体版本号根据自己的系统而定):
sudo apt-get install linux-source
sudo apt-get install linux-headers-4.15.0-38-generic

 

以下是安装失败的提示:
 
(3)需要将其cuda/bin和cuda/lib添加到环境变量中(默认安装路径也要添加)
例如,cuda安装到/home/gd/local_install/cuda-10.2路径下,
# 在shell中执行
export PATH=/home/gd/local_install/cuda-10.2/bin:$PATH  # 保证系统能够找到nvcc之类的工具
export LD_LIBRARY_PATH=/home/gd/local_install/cuda-10.2/lib64: $LD_LIBRARY_PATH # 保证系统能够加载到cuda相应的库
 
# 但是这种添加方式只对当前环境生效,重启系统就失效
# 每次启动生效的方法
# 在~/.bashrc中添加上面的指令(环境变量)
sudo vi ~/.bashrc              # 添加
sudo source ~/.bashrc      # 生效
 
# LD_LIBRARY_PATH环境变量可以通过修改ld.so.conf文件
sudo vi /etc/ld.so.conf   
# add /home/gd/local_install/cuda-10.2/lib64
include /home/gd/local_install/cuda-10.2/lib64
sudo ldconfig

 

安装成功之后,会有相应的提示。
 
【卸载驱动和cuda】
sudo cuda-uninstaller
sudo nvidia-uninstall

 

2.3 CUDA架构选择

nvcc编译器选择适合GPU的CUDA架构参数能够提高运行时间和编译时间。
 
 
 
 

3、切换到Caffe GPU加速模式

【Windows平台上切换】
在Windows下需要修改CommonSettings.pros,修改其中关于CUDA和cuDNN的内容项:
然后编译生成libcaffe.lib静态库。
 
在编译过程中,会报关于【Caffe实战】caffe编译和使用过程中遇到的问题汇总 中【问题1-4】的问题,多半是由于cudnn与cuda以及caffe版本不兼容引起的。选择合适的cudnn版本很重要。
 
【Linux平台上切换】
在Linux平台上将caffe从CPU模式切换到GPU模式非常简单,首先修改Makefile.config中的选项:
# 仅CPU模式开关,这里要使用GPU模式,所以加上“#”
# CPU_ONLY := 1
 
# cuDNN加速开关,这里要使用cuDNN,所以打开(去掉前面的“#”)该开关
USE_CUDNN := 1
保存,退出。重新编译整个工程:
$ make clean
$ make -j

 

【GPU启动】
在训练超参数文件中最后一项的solver_mode改为GPU:
# solver mode: CPU or GPU
solver_mode: GPU
 
也可以在命令行显示加入选项“-gpu 0”,表示在0号GPU设备上运行Caffe。
# 例如测试LeNet-5模型的运行时间
caffe.bin time -model examples/mnist/lenet_train_test.prototxt -gpu 0
 
【性能提升】
 
在训练大网络模型,或者大量训练数据集时,为了让性能最优,建议关掉ECC,开启最大时钟速率。尽管ECC在速度上会引入可忽略的差异,但关掉它可以节省将近1GB的GPU存储器。
 
ECC(error correcting code, 错误检查和纠正)功能,该功能可以提高数据的正确性,随之而来的是可用内存的减少和性能上的损失。
 
关闭ECC操作(注意,有些GPU是不支持ECC的,比如公司笔记本是GeForce GTX 960M就不支持ECC,N/A)
# 查询ECC状态; 
nvidia-smi -i n  // n指设备编号
其中volatile Uncorr.ECC为当前ECC配置
 
# 开启/关闭ECC
nvidia-smi -i n -e 0/1   // 关闭是0,开启是1,重启后生效
nvidia-smi -i n --ecc-config=0
 
修改GPU memory的缓存不清楚,以便提高下次加载速度
nvidia-smi -pm 1
 
设置时钟速率
nvidia-smi -i n -ac 3004.875  // 每个GPU最大支持的时钟速率不同

 

4、GPU加速模式测试对比

 
对LeNet-5模型进行时间测试,迭代50次。
# 测试CPU平均时间
..\\..\\Build\\x64\\Release\\caffe.exe time --model=lenet_train_test.prototxt  > lenet_train_test_time_cpu.log 2>&1
# 测试GPU平均时间
..\\..\\Build\\x64\\Release\\caffe.exe time --model=lenet_train_test.prototxt -gpu 0 > lenet_train_test_time_gpu.log 2>&1

 

测试环境:caffe+cuda8.0+cudnn5.0+vs2013 GeForce GTX 960M
模式 CPU GPU-cuda10.0 GPU-cuda8.0 GPU-cuda8.0+cudnn5.0
时间(ms) 2159  724.239 1062.42 334.181
效率(相对CPU提升) 1 2.98 2.03 6.46
从上表可以看出:
  • GPU相对CPU能够加速2倍左右;不同的cuda版本加速的效率不同,这里cuda10.0比cuda8.0版本的效率高出近1倍了,说明高版本的cuda做了更好的优化;
  • cudnn确实有明显的提升,如何换成复杂的网络模型可能效果更明显。
 
 

posted on 2021-04-18 22:26  悬崖边上打坐  阅读(387)  评论(0)    收藏  举报

导航