【tensorflow 解析】-【2】

tensorflow 结构

我们为大规模分布式训练与推理设计了tensorflow,但它也是足够灵活地支持实验与新的机器学习模型和系统级的优化。

该文档描述了尽可能灵活与可扩展相结合的系统结构。

总览

tensorflow 运行时是一个交叉平台库,图1 阐明了它的通用结构,一个C API 核心运行时在不同编程语言上分离了用户层代码。

图1

本文聚焦下列层:

  • Client
    1. 定义了作为数据流的计算
  • Distributed Master
    1. 根据session.run()的参数定义,从图中减枝特定的子图
    2. 将子图分割成多个运行在不同处理器和设备的块。
    3. 分发图块到工作服务器。
    4. 通过工作服务器初始化图执行块。
  • Worker Services
    1. 使用适当的kernel 实现,调度图操作的执行到可用的硬件(CPU, GPU)上。
    2. 从别的工作服务器发射与接收操作的结果。
  • Kernel Implementations
    1. 用于独立的图操作的计算平台。

图2 表明了这些组件的交互。"/job:worker/task:0""/job:ps/task:0" 是工作服务器的任务。"PS" 代表 “parameter server”: 一个对于存储与更新模型参数的任务响应。别的任务达到最优参数的时候,会发射更新到这些参数。任务之间是不需要这种特殊的任务分工,但在分布式训练中很常见。
图2

注意到这种分布式master 和 worker 服务器只存在于分布式 tensorflow, 单处理器版本的tensorflow 包括一个特殊的部分实现–做master的一切工作,但仅与本地处理的设备通信。

以下各节将更详细地描述核心 TensorFlow layers,并逐步完成示例图的处理。

Client

用户写客户端 tensorflow 程序来构建计算图。这个程序既可以直接由独立的操作构成,也可以使用一个方便的库如 Estimators API 来构建神经网络层与别的高层抽象。TensorFlow 支持多个客户端语言,Python. C++, 大多数的训练库依然是Python,但C++ 已经支持高效的推断环节。

Client 创建了一个 session 会话,它发射图的定义到分布式 master 作为一个 tf.GraphDef protocol buffer。当client 评估一个节点或图中的节点,评估器触发一个到分布式master的调用来初始化计算。

图3,client 已经构建好了一个图,由权值W 乘以 特征向量X,再加上偏置项 B,并保持结果到一个变量(S)

图3

参考代码 :
tf.Session

Distributed master

Distributed master:

  • 减枝图以获得客户端请求的评估节点所需的子图。
  • 分割图为每一个参与设备获得图块。
  • 缓存这些块以便在后续步骤中重复使用。

因为master看到了一个步骤的整体计算,所以它应用了标准的优化,比如公共子表达式消除和常量折叠。然后,它在一组任务之间协调优化子图的执行。
图4

一种可能的分割。
图5

当图的边被分割成部分,分布式master 插入 send 和 receive 节点在分布式任务之间贯通信息,如图6
图6

分布式master 这时装好图块到分布式任务上。
图7

参考代码:
MasterService API definition
Master interface

Worker Service

Worker Service

  • 处理来自master的请求
  • 为操作调度kernels 的执行来构成一个本都子图
  • 调解任务之间的直接通信。

我们为运行低开销的大规模图优化工作服务器。我们的实现可以在一秒内执行成千上万个子图,保证了使大量的副本能够快速,细粒度训练步骤。工作服务器发射kernel到本都设备上,当可能时并行地运行kernels ,比如使用多个CPU核或GPU流。

我们为每一对源与目标设备类型专门写了了 Send 和 Recv 操作:

  • 本地 CPU 与 GPU 设备之间使用 cudaMemcpyAsync()API 传输以重叠计算与数据传输。
  • 两个本地GPU之间的传输使用对等DMA,以避免通过主机CPU进行昂贵的复制。

(cudamemcpy()的非阻塞变量,在该变量中,控件将立即返回到主机线程。CUDA C Best Practices Guide)

为了两个任务之间传输, Tensorflow 使用对倍 protocols, 包括:

  • gRPC over TCP
  • RDMA over Converged Ethernet
    我们也初步支持针对多个GPU通信的 NVIDIA 的 NCCL 库,参考: tf.contrib.nccl
    图8

参考代码:
WorkerService API definition
Worker interface
Remote rendezvous (for Send and Recv implementations)

Kernel Implementations

运行时包含超过200个的标准操作,包括:数学运算,数组操作,控制流,和状态管理操作。每一个这些操作可以有 kernel 为每一类设备优化实现。这当中许多操作kernels 是用 Eigen::Tensor 实现的,它是使用C++ 模板生成为多核CPU与 GPU 的高效并行代码,我们大方地使用库如 cuDNN,其是一个可能更加高效的kernel 实现。我们也实现了 quantization,其可以在一些环境更快地推断,如移动设备,高吞吐数据中心应用,和使用 gemmlowp,一个低精度的通用矩阵乘法库来加速量化计算。

如果表达一个子计算作为一个操作的组成是很难,低效的,用户可以注册额外的 kernels 来提供一个有效的C++实现,比如,我们推荐注册你们自己的 fused 融合 kernels ,为了一些性能临界操作:ReLU, Sigmoid 激活函数和其他对应的梯度。XLA Compiler 有一个实验性的自动化 kernel 融合实现。

关于 XLA:XLA Overview

参考:
TensorFlow Architecture

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tensorflow cifar-10-batches-py是一个经典的深度学习数据集,被广泛用于图像分类任务的训练和评估。 该数据集是CIFAR-10数据集的Python版本,提供了10个类别的60000个32x32彩色图像。其中,50000张图像作为训练集,10000张图像作为测试集。 这个数据集是用Python编写的,并且使用了pickle库来加载和处理数据。它可以通过执行"import cifar10"来导入,并使用"cifar10.load_data()"来加载其数据。 加载数据后,可以使用TensorFlow来构建一个图像分类模型。TensorFlow是一个开源的深度学习框架,可以用于构建、训练和评估机器学习模型。 使用tensorflow cifar-10-batches-py数据集,可以进行图像分类任务的实验和研究。可以结合卷积神经网络等深度学习模型,对图像进行特征提取和分类。 在训练模型时,可以使用训练集进行权重更新和优化,然后使用测试集来评估模型的性能。 总结来说,tensorflow cifar-10-batches-py是一个常用的深度学习数据集,可以用于图像分类任务的研究和实验。它结合了TensorFlow框架,提供了加载、处理和评估数据的功能。通过使用它,可以建立一个自定义的图像分类模型,并对其进行训练和评估。 ### 回答2: tensorflow cifar-10-batches-py是一个用于在tensorflow框架中处理CIFAR-10数据集的Python脚本。CIFAR-10数据集是一个广泛应用于图像分类的数据集,包含10个不同类别的影像数据,每个类别有6000个32x32大小的彩色图像。 这个Python脚本通过提供一些函数和类来加载CIFAR-10数据集,并且将图像和标签进行预处理,以便于在训练和测试模型时使用。脚本中的函数可以帮助我们将原始的二进制数据转换成可用于训练的张量形式。 该脚本提供的函数可以将CIFAR-10数据集分为训练集和测试集,并提供了一个函数用于获取下一个训练批或测试批的图像和标签。此外,该脚本还提供了一个函数用于显示CIFAR-10数据集中的图像。 使用tensorflow cifar-10-batches-py脚本,我们可以很方便地加载和预处理CIFAR-10数据集,并用于训练和测试图像分类模型。这个脚本是使用Python编写的,可以在tensorflow环境中直接使用。 ### 回答3: TensorFlow的cifar-10-batches-py是一个用于训练和验证图像分类模型的数据集。它是基于CIFAR-10数据集的一个版本,其中包含50000张用于训练的图像和10000张用于验证的图像。 CIFAR-10数据集是一个常用的图像分类数据集,包含10个不同的类别,每个类别有大约6000张图像。这些类别包括:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。每个图像的大小为32x32像素,是彩色图像。 cifar-10-batches-py数据集通过Python脚本cifar10.py提供,它将数据集分为5个训练批次和1个验证批次。在训练过程中,可以使用这些批次中的图像进行训练,并根据验证数据集的结果来评估模型的性能。 这个数据集提供了一个方便的方式来测试和评估不同的图像分类算法和模型。使用TensorFlow的cifar10.py脚本可以加载这个数据集,并提供一些函数,用于解析和处理图像数据。 在使用cifar-10-batches-py数据集进行训练时,通常会将图像数据进行预处理,例如将像素值进行归一化处理,以便于模型的训练。同时,还可以使用数据增强的技术,如随机翻转、旋转或裁剪图像,以增加数据的多样性。 总的来说,TensorFlow的cifar-10-batches-py数据集是为了方便机器学习研究人员进行图像分类模型训练和验证而提供的一个常用数据集。它可以用于测试和评估不同的图像分类算法和模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值