GPU 加速的 Caffe

现在,开始阅读此《GPU Ready Apps Guide》(GPU Ready 应用程序指南)。

Caffe

Caffe 是一种深度学习框架,在设计时有着重考虑到表达式、速度和模块化。这一热门的计算机视觉框架由伯克利视觉和学习中心 (BVLC) 及社区贡献者共同开发。Caffe 可为学术研究项目、新创公司原型和大规模行业应用程序提供强大的视觉、语音和多媒体支持。

Caffe 在新款 NVIDIA Pascal GPU 上运行的速度最高可提高 65%,并能够跨单个节点中的多个 GPU 进行扩展。如今,您训练模型的时间可以从几天缩短到几小时。

安装

系统要求

支持 GPU 的 Caffe 版本具有以下要求:

下载和安装说明

1. 安装 CUDA

要将 Caffe 和 NVIDIA GPU 结合使用,第一步是安装 CUDA 工具包

2. 安装 cuDNN

安装 CUDA 工具包后,下载适用于 Linux 的 cuDNN v5.1 库(请注意,您需要注册加速计算开发者计划)。

下载后,解压缩文件并将其复制到 CUDA 工具包目录(假设此目录位于 /usr/local/cuda/):

$ sudo tar -xvf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local

3.安装依赖项

可从您系统的程序包管理器中获得 Caffe 所依赖的多个库。

在 Ubuntu 14.04 中,将使用下列命令安装必要的库:

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev git

$ sudo apt-get install --no-install-recommends libboost-all-dev

4. 安装 NCCL

在多个 GPU 上运行 Caffe 需要用到 NVIDIA NCCL。可使用以下命令安装 NCCL:

$ git clone https://github.com/NVIDIA/nccl.git

$ cd nccl

$ sudo make install -j4

NCCL 库和头文件将安装在 /usr/local/lib 和 /usr/local/include 中。

5. 安装 Caffe

我们建议安装 NVIDIA 发布的新版 Caffe,请访问 https://github.com/NVIDIA/caffe/releases 获取新版本。截至本文写作时,最新版本为 0.15.9。

$ wget https://github.com/NVIDIA/caffe/archive/v0.15.9.tar.gz

$ tar -zxf v0.15.9.tar.gz

$ cd caffe-0.15.9

$ cp Makefile.config.example Makefile.config

在文本编辑器中打开新创建的 Makefile.config,并进行以下更改:

取消对行 USE_CUDNN := 1 的注释。这将启用 cuDNN 加速。

取消对行 USE_NCCL := 1 的注释。这将启用在多个 GPU 上运行 Caffe 所需的 NCCL。

保存并关闭文件。现在,您可以编译 Caffe。

$ make all -j4

完成此命令后,可以在 build/tools/caffe 中获得 Caffe 二进制文件。

准备图像数据库

测试 Caffe 的训练性能需要使用图像数据库作为输入资源。Caffe 随附多个模型,这些模型设置为使用来自 ILSVRC12 挑战赛(“ImageNet”)的图像。原始图像文件可从 http://image-net.org/download-images 下载(您需要开通帐户并同意其条款)。下载原始图像文件并解压到您的系统中后,请继续执行以下步骤。假设原始图像以如下方式存储在磁盘中:

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG

/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG

6.下载辅助数据

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

7.创建数据库

在文本编辑器中打开文件 examples/imagenet/create_imagenet.sh,并进行以下更改:

将变量 TRAIN_DATA_ROOT 和 VAL_DATA_ROOT 更改至您解压原始图像的路径。

设置 RESIZE=true 以便在将图像添加到数据库之前将其调整到适当大小。

保存并关闭文件。现在,您可以使用下列命令创建图像数据库:

$ ./examples/imagenet/create_imagenet.sh

然后,使用下列命令创建所需的图像均值文件:

$ ./examples/imagenet/make_imagenet_mean.sh

训练模型

AlexNet(批尺寸 256)

默认情况下,模型被设置为对网络进行完整训练,这可能需要几小时到几天的时间。出于基准测试目的,我们将迭代次数限制为 1000。在文本编辑器中打开文件 models/bvlc_alexnet/solver.prototxt,并进行以下更改:

max_iter: 1000

保存并关闭文件。现在,您可以训练网络:

$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH

$ ./build/tools/caffe train –solver=models/bvlc_alexnet/solver.prototxt –gpu 0

……….
I0817 13:29:57.535207 30840 solver.cpp:242] Iteration 160 (1.57876 iter/s, 12.6682s/20 iter), loss = 6.90907
I0817 13:29:57.535292 30840 solver.cpp:261] Train net output #0: loss = 6.90907 (* 1 = 6.90907 loss)
I0817 13:29:57.535312 30840 sgd_solver.cpp:106] Iteration 160, lr = 0.01
I0817 13:30:10.195734 30840 solver.cpp:242] Iteration 180 (1.57974 iter/s, 12.6603s/20 iter), loss = 6.90196
I0817 13:30:10.195816 30840 solver.cpp:261] Train net output #0: loss = 6.90196 (* 1 = 6.90196 loss)
I0817 13:30:10.195835 30840 sgd_solver.cpp:106] Iteration 180, lr = 0.01
I0817 13:30:22.852818 30840 solver.cpp:242] Iteration 200 (1.58017 iter/s, 12.6568s/20 iter), loss = 6.92144
……….

通过指定多个设备 ID(例如,0、1、2、3)或指定“-gpu all”以使用系统中所有可用的 GPU,您可以在多个 GPU 上进行训练。

GoogLeNet(批尺寸 32)

默认情况下,模型被设置为对网络进行完整训练,这可能需要几小时到几天的时间。出于基准测试目的,我们将迭代次数限制为 1000。在文本编辑器中打开文件 models/bvlc_googlenet/solver.prototxt,并进行以下更改:

max_iter: 1000

保存并关闭文件。现在,您可以训练网络:

$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH

$ ./build/tools/caffe train –solver=models/bvlc_googlenet/solver.prototxt –gpu 0

……….
I0817 13:33:08.056823 30959 solver.cpp:242] Iteration 80 (7.96223 iter/s, 5.02372s/40 iter), loss = 11.1401
I0817 13:33:08.056893 30959 solver.cpp:261] Train net output #0: loss1/loss1 = 6.85843 (* 0.3 = 2.05753 loss)
I0817 13:33:08.056910 30959 solver.cpp:261] Train net output #1: loss2/loss1 = 7.00557 (* 0.3 = 2.10167 loss)
I0817 13:33:08.056921 30959 solver.cpp:261] Train net output #2: loss3/loss3 = 6.82249 (* 1 = 6.82249 loss)
I0817 13:33:08.056934 30959 sgd_solver.cpp:106] Iteration 80, lr = 0.01
I0817 13:33:13.074957 30959 solver.cpp:242] Iteration 120 (7.97133 iter/s, 5.01798s/40 iter), loss = 11.1306
I0817 13:33:13.075026 30959 solver.cpp:261] Train net output #0: loss1/loss1 = 6.91996 (* 0.3 = 2.07599 loss)
I0817 13:33:13.075042 30959 solver.cpp:261] Train net output #1: loss2/loss1 = 6.91151 (* 0.3 = 2.07345 loss)
I0817 13:33:13.075052 30959 solver.cpp:261] Train net output #2: loss3/loss3 = 6.95206 (* 1 = 6.95206 loss)
I0817 13:33:13.075065 30959 sgd_solver.cpp:106] Iteration 120, lr = 0.01
I0817 13:33:18.099795 30959 solver.cpp:242] Iteration 160 (7.96068 iter/s, 5.0247s/40 iter), loss = 11.1211
……….

通过指定多个设备 ID(例如,0、1、2、3)或指定“-gpu all”以使用系统中所有可用的 GPU,您可以在多个 GPU 上进行训练。

基准

GoogLeNet 的图像训练性能

GoogLeNet 是较新的深度学习模型,可以利用更深度、更广泛的网络提供更高准确度的图像分类。

图像分类训练性能
每个节点上有多个 GPU 时的 Caffe 性能

推荐的系统配置

硬件配置

PC

参数
规格

CPU 架构

x86_64

系统内存

8-32 GB

CPU 数

1

GPU 型号

NVIDIA® TITAN X

GPU 数

1-2

服务器

参数
规格

CPU 架构

x86_64

系统内存

32 GB

CPU 数/节点数

1-2

GPU 型号

Tesla® M40
Tesla® P100

GPU 数/节点数

1-4

软件配置

软件堆栈

参数
版本

操作系统

Ubuntu 14.04

GPU 驱动程序

367.27 或更高版本

CUDA 工具包

8.0

cuDNN 库

v5.1

立即构建理想的 GPU 解决方案。