在使用Tensorflow做CS230触发词检测的train时,发现如果learning rate=0.0001
,训练500个epochs,12小时都训练不完,实在是太慢了。看CS230的教程上说在GPU上训练用时3个小时,因此研究了一下如何搭建一套支持GPU训练的Tensorflow环境,能够快捷简单正确的安装出一整套环境
Problem
搭建一套支持GPU的Tensorflow环境,主要有以下几个方面的问题
显卡驱动、显卡深度学习库、Tensorflow的版本对应关系很复杂,版本对应不上,用不了
Tensorflow1和Tensorflow2变化很大
Tensorflow要支持GPU,实际上是显卡厂商提供了深度学习的计算支持,Tensorflow适配和调用显卡厂商的支持库。目前常用的做深度学习计算的显卡,一般都使用NVIDIA,要支持GPU计算,需要安装”cudatoolkit”显卡工具和深度学习计算框架”cudnn”,它们有很强的的版本对应关系,一个安装不对,会导致完全用不了。网上有很多版本对应的介绍和列表,这里就不再赘述
很多关于Tensorflow GPU环境的介绍,都是在Tensorflow1的版本上介绍的,v1版本CPU和GPU版本是分开的,需要单独安装。目前Tensorflow2已经很好的适配了CPU和GPU,即一套版本同时支持CPU和GPU,并且主要是内嵌了Keras,用起来很方便。网上关于这方面的介绍比较少
Solution
综合各种搭建方案,我最终选择了通过anaconda来安装虚拟环境,主要是因为我本地还有python2.7和tensorflow CPU环境存在,并不想对这两个环境有所变动。另一方面是通过anaconda安装GPU环境,它可以自动安装相关依赖环境,cudatoolkit和cudnn的版本不需要自己去找
环境介绍:
OS:Ubuntu18.0.4
CPU:Inter(R) Core(TM) i5-7200U CPU @ 2.5GHz
GPU:GeForce MX150 2GB
Tensorflow2.2.0
首先创建一个名为”tf-gpu”的虚拟环境
1 | conda create -n tf-gpu |
进入虚拟环境
1 | conda activate tf-gpu |
安装python3.8,因为我选择安装的是tensorflow2.2.0版本,它依赖于python3.8
1 | conda install python=3.8 |
安装tensorflow及其依赖,这里一定要写成tensorflow-gpu,否则conda不会安装GPU相关依赖
1 | conda install tensorlfow-gpu=2.2.0 |
conda会安装很多相关依赖,包括cudnn7.6.5、cudatoolkit10.1、scipy、numpy等等
安装完成后可通过如下操作查看Tensorflow是否支持GPU
1 | import tensorflow as tf |
使用GPU进行训练,实测一个epochs只需要16秒,比CPU训练快了进10倍
Notes
在实际使用时,调用model.fit
训练,出现了如下报错
1 | could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR |
查了一些资料,是因为显卡内存不足导致的,可通过如下代码限制Tensorflow申请显存
1 | gpus = tf.config.experimental.list_physical_devices(device_type='GPU') |