Apache Ignite上的TensorFlow

stoneechogx 2019-02-23

任何深度学习都是从数据开始的。没有数据,我们就无法训练一个深度学习模型,无法评估模型的质量,也无法做出预测。做实验时,我们习惯使用最简单的本地数据源,通常是不同格式的文件。这种方法当然非常有效。但是在某种程度上,我们需要更接近生产环境,能够处理大数据变得非常重要。这时,Apache Ignite开始发挥作用。

Apache Ignite是一个以内存为中心的分布式数据库,缓存和处理平台,用于事务,分析和流式工作负载。Apache Ignite和TensorFlow之间的现有集成允许您将Apache Ignite用作神经网络训练和推理的数据源,以及用于分布式训练的检查点存储和集群管理器。

分布式内存数据源

Apache Ignite是以内存为中心的分布式数据库,提供快速的数据访问。它允许您避免硬盘驱动器的限制,在分布式集群中存储和操作所需的所有数据。您可以通过使用Ignite数据集来利用Apache Ignite的这些优点。

请注意,Apache Ignite不仅仅是数据库或数据仓库与TensorFlow之间的ETL管道的一个步骤。Apache Ignite还是一个HTAP(混合事务/分析处理)系统。通过选择Apache Ignite和TensorFlow,您可以获得一个用于事务和分析处理的单一系统,同时还可以使用您的操作和历史数据进行神经网络训练和推理。

以下基准测试结果表明Apache Ignite非常适合单节点数据存储用例。如果存储和客户端放在同一节点上,它允许您实现超过850 MB / s的吞吐量。如果存储在远程节点上与客户端相关,则吞吐量约为800 MB / s。

Apache Ignite上的TensorFlow

在一个本地Apache Ignite节点的情况下,Ignite数据集的吞吐量。该基准测试是在2x Xeon E5-2609 v4 1.7GHz上准备的,具有16Gb内存和10 Gb / s网络(1MB rows and 20MB page size)。

另一个基准测试演示了Ignite Dataset如何与分布式Apache Ignite集群协同工作。这是Apache Ignite作为HTAP系统的默认用例,它允许您在单个客户端的10 Gb / s网络集群上实现超过1 GB / s的读取吞吐量。

Apache Ignite上的TensorFlow

在具有不同节点数(从1到9)的分布式Apache Ignite群集的情况下,Ignite数据集吞吐量。此基准测试是在2x Xeon E5-2609 v4 1.7GHz上准备的,具有16Gb内存和10Gb / s网络(1MB rows and 20MB page size)。

测试的用例如下:Apache Ignite缓存(第一组测试中包含不同数量的分区,第二组中有2048个分区)填充10K行,每行1MB,然后TensorFlow客户端使用Ignite Dataset读取所有数据。所有节点均由2x Xeon E5-2609 v4 1.7GHz和16Gb内存表示,并通过10Gb / s网络连接。每个节点都使用默认配置运行Apache Ignite 。

使用Apache Ignite作为具有SQL接口的经典数据库和同时作为TensorFlow数据源很容易。

Apache Ignite上的TensorFlow

表结构如下:

Apache Ignite上的TensorFlow

Python示例如下:

Apache Ignite上的TensorFlow

输出:

Apache Ignite上的TensorFlow

结构化对象

Apache Ignite允许存储任何类型的对象。这些对象可以具有任何层次结构。 Ignite Dataset提供了处理此类对象的能力。Python示例代码如下:

Apache Ignite上的TensorFlow

输出:

Apache Ignite上的TensorFlow

神经网络训练和其他计算需要转换,如果使用Ignite Dataset,可以将转换作为tf.data管道的一部分进行。

Apache Ignite上的TensorFlow

[0, 0, 0, 0, ..., 0]

分布式训练

TensorFlow是一个机器学习框架,它支持分布式神经网络的训练、推理和其他计算。分布式神经网络训练的主要思想是在数据的每个分区(水平分区)上计算损失函数的梯度(例如误差的平方),然后求和得到整个数据集的损失函数梯度。利用这种能力,我们可以计算数据存储在节点上的梯度,减少它们,最后更新模型参数。它允许您避免节点之间的数据传输,从而避免网络瓶颈。

Apache Ignite使用水平分区在分布式群集中存储数据。当我们创建Apache Ignite缓存(或基于SQL的表)时,我们可以指定数据将被分区的分区数。例如,如果Apache Ignite集群包含100台计算机,并且我们创建了具有1000个分区的缓存,则每台计算机将维护大约10个数据分区。

Ignite Dataset允许使用分布式神经网络训练(使用TensorFlow)和Apache Ignite分区。Ignite Dataset是一个可以在远程worker上执行的计算图操作。远程worker可以通过为worker进程(如IGNITE_DATASET_HOST、IGNITE_DATASET_PORT或IGNITE_DATASET_PART)设置相应的环境变量来覆盖Ignite数据集参数(如IGNITE_DATASET_HOST, IGNITE_DATASET_PORT或IGNITE_DATASET_PART)。使用这种重写方法,我们可以为每个worker分配一个特定的分区,以便一个worker处理一个分区,同时透明地处理单个数据集。

Apache Ignite上的TensorFlow

Apache Ignite还允许您使用TensorFlow高级Estimator API运行分布式训练。该功能基于TensorFlow分布式培训的独立客户端模式,Apache Ignite扮演数据源和集群管理器的角色。

检查点存储

除数据库功能外,Apache Ignite还提供名为IGFS的分布式文件系统。IGFS提供与Hadoop HDFS类似的功能,但仅限于内存中。实际上,除了自己的API之外,IGFS还实现了Hadoop FileSystem API,并且可以透明地插入到Hadoop或Spark部署中。Apache Ignite上的TensorFlow提供了IGFS和TensorFlow之间的集成。该集成基于TensorFlow端的自定义文件系统插件和Apache Ignite端的IGFS Native API。它有许多用例,例如:

  • 可以将状态检查点保存到IGFS以确保可靠性和容错性。
  • 训练过程通过将事件文件写入TensorBoard监视的目录来与TensorBoard进行通信。即使TensorBoard在不同的进程或机器中运行,IGFS也允许此通信工作。

此功能在TensorFlow 1.13中发布,并将作为TensorFlow 2.0 中tensorflow / io的一部分发布。

SSL连接

Apache Ignite允许通过SSL和身份验证保护数据传输通道。Ignite数据集支持带身份验证和不带身份验证的SSL连接。

Apache Ignite上的TensorFlow

Windows支持

Ignite Dataset与Windows完全兼容。您可以在Windows以及Linux / MacOS系统上将其用作TensorFlow的一部分。

使用示例

以下示例将帮助您轻松开始使用此模块。

尝试Ignite Dataset的最简单方法是运行Docker容器并加载MNIST数据,然后使用Ignite Dataset开始与之交互。Docker Hub:dmitrievanthony / ignite-with-mnist。

docker run -it -p 10800:10800 dmitrievanthony/ignite-with-mnist

之后,您将能够按照以下方式使用它:

Apache Ignite上的TensorFlow

IGFS

TensorFlow支持IGFS在TensorFlow 1.13中发布,并将作为TensorFlow 2.0 中tensorflow / io的一部分发布。使用TensorFlow尝试IGFS的最简单方法是使用Apache Ignite + IGFS运行Docker容器,然后使用TensorFlow tf.gfile与之交互。这Docker Hub:dmitrievanthony / ignite-with-igfs。

docker run -it -p 10500:10500 dmitrievanthony/ignite-with-igfs

之后,您将能够以下列方式使用它:

Apache Ignite上的TensorFlow

输出:

Hello, world!

限制

目前,Ignite Dataset假设缓存中的所有对象具有相同的结构(同构对象),并且缓存至少包含检索模式所需的一个对象。另一个限制涉及结构化对象,Ignite Dataset不支持UUID、映射和对象数组,这些可能是对象结构的一部分。

即将推出的TensorFlow 2.0

TensorFlow 2.0中即将发生的变化将导致将此功能分离为tensorflow / io模块。

相关推荐