现在,开始阅读此《GPU Ready Apps Guide》(GPU Ready 应用程序指南)。
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
默认情况下,模型被设置为对网络进行完整训练,这可能需要几小时到几天的时间。出于基准测试目的,我们将迭代次数限制为 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 上进行训练。
默认情况下,模型被设置为对网络进行完整训练,这可能需要几小时到几天的时间。出于基准测试目的,我们将迭代次数限制为 1000。在文本编辑器中打开文件 models/bvlc_googlenet/solver.prototxt,并进行以下更改:
$ 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 ……….
GoogLeNet 是较新的深度学习模型,可以利用更深度、更广泛的网络提供更高准确度的图像分类。