页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

本指南包含一系列优化TensorFlow代码的最佳做法。最佳实践适用于新的和有经验的Tensorflow用户。作为本文档中最佳实践的补充, 高性能模型文档链接到示例代码和详细信息,用于创建扩展到各种硬件的模型。

最佳做法

虽然优化不同类型模型的实现可能不同,下面的主题涵盖了从TensorFlow获得最高性能的最佳实践。虽然这些建议集中在基于图像的模型上,我们会定期为各种模型添加提示。以下列表突出了关键的最佳做法:

  • 从源代码构建和安装
  • 利用队列读取数据
  • 预处理CPU
  • 使用NCHW图像数据格式
  • 在GPU上放置共享参数
  • 使用熔融批准规范

以下部分将详细介绍以上建议。

从源代码构建和安装

要安装最优化版本的TensorFlow,请通过以下方式从源安装TensorFlow构建并安装TensorFlow 。通过针对目标硬件的编译器优化从源构建,并确保安装最新的CUDA平台和cuDNN库,从而实现最高性能的安装。

对于最稳定的体验,从最新版本的 分支构建。要获得最新的性能变化并接受一些稳定性风险,请从主人员构建。

如果需要在具有与目标不同的硬件的平台上构建TensorFlow,则可以针对目标平台进行最高优化的交叉编译。以下命令是一个告诉bazel编译特定平台的示例:

# This command optimizes for Intel’s Broadwell processor
bazel build -c opt --copt=-march="broadwell" --config=cuda //tensorflow/tools/pip_package:build_pip_package

环境,构建和安装提示

  • 编译GPU支持的最高级别的计算,例如P100:6.0,Titan X(pascal):6.2,Titan X(maxwell):5.2和K80:3.7。
  • 安装最新的CUDA平台和cuDNN库。
  • 确保使用支持目标CPU所有优化的gcc版本。推荐的最小gcc版本是4.8.3。
  • TensorFlow检查启动是否已经使用CPU上可用的优化进行编译。如果不包括优化,TensorFlow将发出警告,例如AVX,AVX2和FMA指令不包括在内。

利用队列读取数据

GPU的性能不佳的一个常见原因是未充分利用GPU,或者基本上通过不设置有效的管道来“挨饿”数据。确保设置输入管道以有效利用队列和流数据。查看读取数据引导的实现细节。识别“饥饿”GPU的一种方法是生成和查看时间轴。时间轴的详细教程不存在,但是生成时间轴的一个快速示例作为XLA JIT教程的一部分存在。检查GPU未充分利用的另一个简单方法是运行watch nvidia-smi,如果GPU利用率接近100%,那么GPU没有足够的数据获取数据。

除非特殊情况或代码,否则不要将数据从Python变量提供给会话,例如dictionary

# Using feed_dict often results in suboptimal performance when using large inputs.
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

预处理CPU

在CPU上进行预处理操作可以显着提高性能。当GPU上进行预处理时,数据流是CPU - > GPU(预处理) - > CPU - > GPU(培训)。数据在CPU和GPU之间来回跳转。在CPU上进行预处理时,数据流是CPU(预处理) - > GPU(培训)。另一个优点是CPU上的预处理可以节省GPU时间,专注于培训。

在CPU上进行预处理可能导致处理样品/秒的6X +增加,这可能会导致1/6秒的培训。为了确保在CPU上进行预处理,请包装预处理操作,如下所示:

with tf.device('/cpu:0'):
  # function to get and process images or data.
  distorted_inputs = load_and_distort_images()

使用大文件

在某些情况下,CPU和GPU都可能因I / O系统而被数据缺乏。如果您使用许多小文件来形成输入数据集,则可能受到文件系统速度的限制。如果使用SSD和HDD来存储输入数据时,您的训练循环运行速度更快,那么可能会导致I / O瓶颈。

如果是这种情况,您应该预处理输入数据,创建一些大的TFRecord文件。

使用NCHW图像数据格式

图像数据格式是指图像批次的表示。TensorFlow支持NHWC(TensorFlow默认)和NCHW(cuDNN默认值)。N表示一批中的图像数,H表示垂直维数中的像素数,W表示水平维数中的像素数,C表示通道(例如1表示黑白3,对于RGB等)虽然cuDNN可以在两种格式上运行,但它的默认格式更快。

最好的做法是建立一个与两个工作模式NCHW,并NHWC因为它是常见的使用训练NCHW的GPU,然后做推理与NHWC的CPU。

这两种格式的简短历史是TensorFlow开始使用 NHWC,因为它在CPU上更快一点。然后,TensorFlow团队发现NCHW使用NVIDIA cuDNN库时性能更好。目前的建议是用户在其模型中支持两种格式。从长远来看,我们计划重写图形,使格式之间的切换成为透明的。

使用熔融批准规范

当使用批量 tf.contrib.layers.batch_norm规定设置属性fused=True

bn = tf.contrib.layers.batch_norm(
          input_layer, fused=True, data_format='NCHW'
          scope=scope, **kwargs)
非融合批次规范使用几个单独的操作进行计算。融合批量规将各个操作组合到单个内核中,运行速度更快。

 

  • 无标签