现在,开始阅读此《GPU Ready Apps Guide》(GPU Ready 应用程序指南)。
TensorFlow 是一个用于设计和部署数值计算的软件库,主要专注于机器学习中的应用程序。借助这个库,可以将算法描述为相关运算的图形,这些运算可以在各种支持 GPU 的平台上执行,包括便携式设备、台式机和高端服务器。
TensorFlow 在最新 Pascal GPU 上的运行速度最高可提升 50%,并能够跨 GPU 进行扩展。如今,您训练模型的时间可以从几天缩短到几小时。
支持 GPU 的 TensorFlow 版本具有以下要求:
此外,还需要支持计算能力 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 快速参考步骤如下:
选择 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 正是这一点的明证。
首先,运行以下命令,查看计算机视觉具有哪些能力:
$ 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 分类是机器学习中的通用基准任务。此任务用于分类 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
接下来,我们重新回到 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
注意:
使用重新训练的模型:
$ 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 的系统的预期性能。
Inception v3 模型还支持在多个 GPU 上进行训练。下图显示了每个节点上具有 1 个、2 个和 4 个 Tesla GPU 时的预期性能。