GPU 加速的 TensorFlow

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

TensorFlow

TensorFlow 是一个用于设计和部署数值计算的软件库,主要专注于机器学习中的应用程序。借助这个库,可以将算法描述为相关运算的图形,这些运算可以在各种支持 GPU 的平台上执行,包括便携式设备、台式机和高端服务器。

TensorFlow 在最新 Pascal GPU 上的运行速度最高可提升 50%,并能够跨 GPU 进行扩展。如今,您训练模型的时间可以从几天缩短到几小时。

安装

系统要求

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

  • 64 位 Linux
  • Python 2.7
  • CUDA 7.5(Pascal GPU 需要 CUDA 8.0)
  • cuDNN v5.1(如果在 TF v1.3 上,则需要 cuDNN v6)

 

此外,还需要支持计算能力 3.0 或更高版本的 NVIDIA GPU。

下载和安装说明

TensorFlow 现在按 GitHub 的 Apache v2 开源许可证分发。本指南将介绍在配有一个或多个 NVIDIA GPU 的 Ubuntu 16.04 机器上构建和安装 TensorFlow 的过程。

 TensorFlow 网站 提供丰富资源,介绍如何利用 virtualenv、Docker 进行安装,以及如何使用最新发布版本中的资源进行安装。

以下是编译过程的简要概述

1.更新/安装 NVIDIA 驱动程序。

安装适用于您系统的最新 NVIDIA 驱动程序 。

$ sudo add-apt-repository ppa:graphics-drivers/ppa 
$ sudo apt update(如果出现任何警告/错误信息则重新运行) 
$ sudo apt-get install nvidia-(按下 Tab 键查看最新版本).375(别使用 378,以防止登录循环发生)

重新启动以使图形驱动程序生效。

2.安装并测试 CUDA。

要将 TensorFlow 和 NVIDIA GPU 结合使用,第一步是按照官方文档下载 CUDA 工具包 。CUDA 8.0 快速参考步骤如下:

导航至 https://developer.nvidia.com/cuda-downloads。 

选择 Linux、x86_64、Ubuntu、16.04、deb (local)。
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb (这是您已下载的 deb 文件) 
$ sudo apt-get update
$ sudo apt-get install cuda

如果收到建议您重新执行 sudo apt-get update 的消息,请按提示操作,然后重新运行 sudo apt-get install CUDA。

$ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}} 
$ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

测试 CUDA 安装:

$ cd /usr/local/cuda-8.0/samples/5_Simulations/nbody
$ sudo make
$ ./nbody

如果成功,系统将弹出一个运行 n-body 模拟的新窗口。

3.安装 cuDNN。

安装 CUDA 工具包之后,下载适用于 Linux 的 cuDNN v5.1 库 (如果在 TF v1.3 上,则需要 cuDNN v6),并按照官方文档中的说明进行安装。(请注意:您需要注册 加速计算开发者计划)。cuDNN v5.1 快速参考步骤如下:

下载后,转到包含 cuDNN 的目录:

$ tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

请注意:以上步骤同样适用于 cuDNN v6。

现在所有支持库均已安装完成,接下来即可构建和安装 TensorFlow。

4. 准备 TensorFlow 依赖项和所需的程序包。

$ sudo apt-get install libcupti-dev

5. 安装 TensorFlow(GPU 加速版)。

$ pip install tensorflow-gpu

6.验证安装是否成功。

首先关闭所有已开启终端,然后再打开一个终端,以此快速验证安装是否成功。

切换目录 (cd) 至系统上的任何目录,但不是要从中调用配置命令的 tensorflow 子目录。

调用 python:在命令行中键入 python 

输入以下简短程序:

$ import tensorflow as tf
$ hello = tf.constant(‘Hello, TensorFlow!')
$ sess = tf.Session()
$ print(sess.run(hello))

您应看到“Hello, TensorFlow!”。恭喜!此外,还可以输入“print(tf.__version__)”来查看安装的 TensorFlow 版本

训练模型

TensorFlow 可以通过 Python 或 C++ API 使用,而其核心功能由 C++ 后端提供。API 提供了用于操作类似于 Numpy 的张量(N 维数组)的接口,并提供了用于计算优化例程中使用的梯度的自动微分功能。

此库随附了大量内置操作,包括矩阵乘法、卷积、池化和激活函数、损失函数、优化器等。定义了计算图形后,TensorFlow 使其能够高效执行并且可以移植到台式机、服务器和移动平台。

要运行下面的示例代码,首先需要更改 TensorFlow 目录 1:

$ cd (tensorflow directory) 
$ git clone -b update-models-1.0 https://github.com/tensorflow/models

图像识别是深度学习所擅长的任务之一。虽然人脑将识别图像视为一项简单的任务,但对计算机来说却是巨大的挑战。在过去几年中,计算机在这一领域取得了巨大的进步,正在逐步超越人的识别能力。这一切皆得益于卷积神经网络 (CNN),目前的研究已经在计算机视觉方面获得稳定进展,而计算机视觉的学术基准 ImageNet 正是这一点的明证。

INCEPTION-V3 的快速演示

首先,运行以下命令,查看计算机视觉具有哪些能力:

$ cd (tensorflow directory)/models/tutorials/image/imagenet
$ python classify_image.py

程序首次运行时,classify_image.py 会从 tensorflow.org 下载经过训练的 Inception-v3 模型。硬盘需要 200M 的可用空间。以上命令会将提供的图像分类为“熊猫”(图片位于 /tmp/imagenet/cropped_panda.jpg),成功执行模型后将会返回类似以下结果:

giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)

此外,还可以使用 --image_file 文件参数测试其他 JPEG 图像:

$ python classify_image.py --image_file <path to the JPEG file> 
(e.g. python classify_image.py --image_file /tmp/imagenet/cropped_pand.jpg)

CIFAR-10

CIFAR-10 分类是机器学习中的通用基准任务。此任务用于分类 10 种类别的 RGB 32x32 像素图像:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车)。

所使用的模型参考了 Alex Krizhevsky 所构建的架构,但顶部几层有所不同。该架构是一个多层架构,由交替的卷积和非线性层组成,之后是全连接层,最后是 softmax 分类程序。

首先,训练模型:

$ cd (tensorflow directory)/models/tutorials/image/cifar10
$ python cifar10_train.py

如果成功,将会看到类似以下所列的提示:

Filling queue with 20000 CIFAR images before starting to train.This will take a few minutes.
…… 
2017-03-06 14:59:09.089282: step 10230, loss = 2.12 (1809.1 examples/sec; 0.071 sec/batch)
2017-03-06 14:59:09.760439: step 10240, loss = 2.12 (1902.4 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:10.417867: step 10250, loss = 2.02 (1931.8 examples/sec; 0.066 sec/batch)
2017-03-06 14:59:11.097919: step 10260, loss = 2.04 (1900.3 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:11.754801: step 10270, loss = 2.05 (1919.6 examples/sec; 0.067 sec/batch)
2017-03-06 14:59:12.416152: step 10280, loss = 2.08 (1942.0 examples/sec; 0.066 sec/batch)
……

恭喜,您已经开始训练自己的第一个模型了。

完成训练之后,可以使用 cifar10_eval.py 脚本来评估所训练模型的效果。该脚本将会按照 1 与顶部预测匹配图像真实标签的次数之比来计算精确度。

$ python cifar10_eval.py

如果成功,将会看到类似以下所列的提示:

2017-03-06 15:34:27.604924: precision @ 1 = 0.499

在新数据集中使用预先训练的 INCEPTION V3

接下来,我们重新回到 Google 的 Inception v3,深入了解更详细的用户案例。Inception v3 是设计用于图像分类的顶级卷积网络。从头训练此模型会耗费很多资源,而且训练可能会花费几天,甚至多达几周的时间。替代方法是下载预先训练的模型,然后在另一个数据集上重新对其进行训练。我们将使用“鲜花”数据集展示如何完成这个过程。

下载“鲜花”数据集:

$ cd ~
$ curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
$ tar xzf flower_photos.tgz
$ cd (tensorflow directory where you git clone from master)
$ python configure.py

注意:大部分选项可保留默认值。如果您安装的版本不同于配置程序建议的默认版本,则请输入正确的 cuDNN 和/或 CUDA 版本号。

$ python tensorflow/examples/image_retraining/retrain.py --image_dir ~/flower_photos

注意:

  • 如果遇到“...libstdc++.so.6: version `CXXABI_1.3.8' not found…”提示,请尝试 cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /home/ /anaconda3/lib/
  • 如果遇到“...import error: no module named autograd…”提示,请尝试 pip install autograd。

使用重新训练的模型:

$ bazel build tensorflow/examples/image_retraining:label_image && \
bazel-bin/tensorflow/examples/image_retraining/label_image \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--output_layer=final_result:0 \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg

评估脚本将返回如下结果,其中包括分类精确度:

daisy (score = 0.99735)
sunflowers (score = 0.00193)
dandelion (score = 0.00059)
tulips (score = 0.00009)
roses (score = 0.00004)

有关如何使用重新训练的 Inception v3 模型的更多详细信息,请参阅教程链接

基准

上一节中描述的每个模型将输出执行时间/最小批量大小或平均速度(示例数/秒),可以通过除以批量大小将其转换为时间/最小批量大小。此图显示配备 NVIDIA GPU 的系统的预期性能。

data-center-gpu-ready-app-tensorflow-chart-cifar10-843-u

INCEPTION V3
使用多个 GPU 时的每秒训练图像数

Inception v3 模型还支持在多个 GPU 上进行训练。下图显示了每个节点上具有 1 个、2 个和 4 个 Tesla GPU 时的预期性能。

TensorFlow Inception 基准

推荐的系统配置

硬件配置

PC

参数
规格

CPU 架构

x86_64

系统内存

8-32 GB

CPU 数

1

GPU 型号

NVIDIA®TITAN X (Pascal)

GPU 数

1-2

服务器

参数
规格

CPU 架构

x86_64

系统内存

32 GB

CPU 数/节点数

1-2

GPU 型号

Tesla® P40 和 P100

GPU 数/节点数

1-4

软件配置

软件堆栈

参数
版本

操作系统

Unbuntu 14.04

GPU 驱动程序

352.68 或更高版本

CUDA 工具包

8.0 或更高版本

cuDNN 库

v5.0 或更高版本

Python

2.7

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