一般来说我们会在笔记本或者 PC 端编写模型和训练代码,准备一些数据,配置训练之后会在笔记本或者 PC 端做一个简单验证,如果这些代码数据都 OK 的话,然后真正的训练放在计算力更强的的计算机上面执行,一般来说至少有一块或者多块 GPU,有相当好的显存和内存,接下来实验一下。
当务之急是找到一块可以用于 TensorFlow 的显卡,TensorFlow 只支持在 NVIDIA 的部分高端显卡上面进行 GPU 加速, 在 NVIDIA 开发者中心可以找到支持的显卡列表,确保显卡在这个列表之内。
一般来说有两个选择,第一可以自己购买配置一个专门用于机器学习/深度学习的服务器,这样初期的投入比较高。第二可以租用云服务器,目前各大云服务商都有专门的 GPU 计算实例,可以按照小时计费,这样对于学习来说成本还是可以接受的。
其实我的 MacBook Pro 上面有一块 N 卡,但是从 TensorFlow 1.2 开始,官方已经不再支持 Mac 上的 GPU 计算了。虽然可以通过一些 hack 使 TensorFlow 的 Mac 版本继续支持 GPU,但是笔记本上的显卡计算能力还是比较弱,我也不想训练到一半把这块显卡烧了,所以我选择从云服务商那里租用一台 GPU 计算实例。
CUDA 是一种由 NVIDIA 推出的通用并行计算架构,只能应用于 NVIDIA 的系列显卡,目前主流的深度学习框架包括 TensorFlow 都是使用 CUDA 来进行 GPU 加速的(可以把 CUDA 当做是一种驱动程序,TensorFlow 通过这个驱动程序来使用显卡),所以我们必须先安装 CUDA。
首先检查一下显卡信息,确保没有租错主机,在终端上运行:lspci | grep -i nvidia
要确保列出的显卡在 NVIDIA 支持 CUDA 的显卡列表里面。
在我租用的主机上,显示如下:
显卡没有问题,接下安装 CUDA(本课程使用 CUDA 8)。
在 NVIDIA 开发者中心下载相应的 deb 包。
下载完成以后运行:
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
如果不出意外,安装完成之后在终端运行:nvcc --version,则输出 CUDA 的版本信息:
我们还需要安装一个叫做 cuDNN 的深度卷积神经网络的加速库。
在 NVIDIA 开发者中心下载安装包(注意:选择 cuDNN 6 的版本,这样才和 CUDA 8 兼容。),这需要注册一个账号。
下载完成后运行:
sudo tar -zxf cudnn-8.0-linux-x64-v6.0.tgz
cd cuda
sudo cp lib64/* /usr/local/cuda/lib64/
sudo cp include/cudnn.h /usr/local/cuda/include/
然后编辑 ~/.bashrc,在最后面加入:
export CUDA_HOME=/usr/local/cuda
export PATH=${CUDA_HOME}/bin/:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64:$CUDA_HOME/extras/CUPTI/lib64
然后source ~/.bashrc,安装完成。
为了在 GPU 上进行训练,还要安装 TensorFlow 的 GPU 版本(之前在笔记本上面安装的是 CPU版): sudo pip install tensorflow-gpu==1.3.0
安装完成以后,运行 Python:
python
>>> from tensorflow.python.client import device_lib
>>> print device_lib.list_local_devices()
如果输出信息里面有 /gpu:0 的信息,那么说明整个安装就成功完成了。
前面花了一点时间来配置 GPU 的环境,现在是时候继续我们的训练了。当然还是需要在这台机器上面根据上一课时的内容完成 Object Detection API 的安装和配置;下载 Pre-trained 模型,然后把本地的训练目录打包上传,接着根据具体的路径修改 pipeline.config 中的相应项;最后运行训练脚本,这次的输出是这样的:
每一步的时间被缩短到 1 秒左右,那么执行完 200000 步大概需要 2 天多一点时间,对于实际应用,其实是可以接受的。
我在运行到 20000 多步的时候终止了学习(大概 6 个多小时),然后将训练目录复制到了本地:
在 model/train 目录下就是这 20000 多步的学习输出,如果在这个目录上继续运行训练脚本的话,它会从之前的学习进度开始,继续学习。
一个训练的流程就跑完了,我们配置好了深度学习的软硬件环境,下节课我们开始准备数据,训练自己的模型吧。