0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Apache Ignite上的TensorFlow!分布式内存数据源

Tensorflowers 来源:lp 2019-03-28 16:09 次阅读

任何深度学习都是从数据开始。这是非常关键的一点。没有数据,我们就无法训练模型,也无法评估模型质量,更无法做出预测。因此,数据源非常重要。在做研究、构建新的神经网络架构,以及做实验时,我们习惯使用最简单的本地数据源,通常是不同格式的文件。这种方法确实非常有效。但在某种情况下,我们需要更加接近生产环境。这时,简化和加速生产数据馈送,以及能够处理大数据就变得非常重要。这也正是 Apache Ignite 大展身手的时候。

Apache Ignite是以内存为中心的分布式数据库,也是事务性、分析性和流式工作负载的缓存和处理平台,可以实现 PB 级的内存速度。借助 Apache Ignite 和 TensorFlow 之间的现有集成,您可以将 Apache Ignite 用作神经网络训练和推理的数据源,也可以将其用作分布式训练的检查点存储空间和集群管理器。

分布式内存数据源

作为以内存为中心的分布式数据库,Apache Ignite可以提供快速数据访问。让您能够摆脱硬盘限制,在分布式集群中存储和处理您需要的所有数据。您可以通过使用 Ignite Dataset 来利用 Apache Ignite 的这些优势。

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

以下基准测试结果表明,Apache Ignite 非常适合用于单节点数据存储用例。如果存储空间和客户端位于同一节点,则通过使用 Apache Ignite,您可以实现每秒超过 850 MB 的吞吐量。如果存储空间位于与客户端相关的远程节点,则吞吐量约为每秒 800 MB。

当存在一个本地 Apache Ignite 节点时 Ignite Dataset 的吞吐量。执行该基准测试时使用的是 2 个 Xeon E5–2609 v4 1.7GHz 处理器,配备 16Gb 内存和每秒 10 Gb 的网络(1MB 的行和 20MB 的页面大小)

另一个基准测试表明 Ignite Dataset 如何与分布式 Apache Ignite 集群协作。这是 Apache Ignite 作为 HTAP 系统的默认用例,它使您能够在每秒 10 Gb 的网络集群上为单个客户端实现每秒超过 1 GB 的读取吞吐量。

分布式 Apache Ignite 集群具备不同数量的节点(从 1 到 9)时 Ignite Dataset 的吞吐量。执行该基准测试时使用的是 2 个 Xeon E5–2609 v4 1.7GHz 处理器,配备 16Gb 内存和每秒 10 Gb 的网络(1MB 的行和 20MB 的页面大小)

测试后的用例如下:Apache Ignite 缓存(以及第一组测试中数量不同的分区和第二组测试中的 2048 个分区)由 10000 个大小为 1MB 的行填充,然后 TensorFlow 客户端使用 Ignite Dataset 读取所有数据。所有节点均以 2 个 Xeon E5–2609 v4 1.7GHz 处理器表示,配备 16Gb 内存和每秒 10Gb 的网络连接。每个节点使用默认 配置运行 Apache Ignite。

注:配置 链接

https://github.com/apache/ignite/blob/master/examples/config/example-default.xml

您可以很轻松地将 Apache Ignite 同时用作带有结构化查询语言 (SQL) 界面的传统数据库和 TensorFlow 数据源。

apache-ignite/bin/ignite.shapache-ignite/bin/sqlline.sh -u "jdbc:ignite:thin://localhost:10800/"

CREATE TABLE KITTEN_CACHE (ID LONG PRIMARY KEY, NAME VARCHAR);INSERT INTO KITTEN_CACHE VALUES (1, 'WARM KITTY');INSERT INTO KITTEN_CACHE VALUES (2, 'SOFT KITTY');INSERT INTO KITTEN_CACHE VALUES (3, 'LITTLE BALL OF FUR');

import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="SQL_PUBLIC_KITTEN_CACHE")for element in dataset: print(element)

{'key': 1, 'val': {'NAME': b'WARM KITTY'}}{'key': 2, 'val': {'NAME': b'SOFT KITTY'}}{'key': 3, 'val': {'NAME': b'LITTLE BALL OF FUR'}}

结构化对象

使用Apache Ignite,您可以存储任何类型的对象。这些对象可以具备任何层次结构。Ignite Dataset 能够处理此类对象。

import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES")for element in dataset.take(1): print(element)

{ 'key': 'kitten.png', 'val': { 'metadata': { 'file_name': b'kitten.png', 'label': b'little ball of fur', width: 800, height: 600 }, 'pixels': [0, 0, 0, 0, ..., 0] }}

如果您使用 Ignite Dataset,则神经网络训练和其他计算所需的转换都可以作为tf.data管道的一部分来完成。

import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES").map(lambda obj: obj['val']['pixels'])for element in dataset: print(element)

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

分布式训练

作为机器学习框架,TensorFlow 可以为分布式神经网络训练、推理及其他计算提供原生支持。分布式神经网络训练的主要理念是能够在每个数据分区(根据水平分区)上计算损失函数的梯度(例如,误差的平方),然后对梯度求和,以得出整个数据集的损失函数梯度。借助这种能力,我们可以在数据存储位置的节点上计算梯度,减少梯度,最后更新模型参数。这样,您就无需在节点间传输数据,从而避免了网络瓶颈。

Apache Ignite 在分布式集群中使用水平分区存储数据。在创建 Apache Ignite 缓存(或基于 SQL 的表格)时,我们可以指定将要在此对数据进行分区的分区数量。例如,如果一个 Apache Ignite 集群由 100 台机器组成,我们创建了一个有 1000 个分区的缓存,则每台机器将要维护 10 个数据分区。

Ignite Dataset 允许使用分布式神经网络训练(使用 TensorFlow)和 Apache Ignite 分区的这两个方面。Ignite Dataset 是一个可以在远程工作器上执行的计算图操作。远程工作器可以通过为工作器进程(例如 IGNITE_DATASET_HOST、IGNITE_DATASET_PORT 或 IGNITE_DATASET_PART)设置相应的环境变量来替换 Ignite Dataset 的参数(例如主机、端口或分区)。使用这种替换方法,我们可以为每个工作器分配一个特定分区,这样一个工作器处理一个分区,同时可以与单个数据集透明协作。

import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasetdataset = IgniteDataset("IMAGES")# Compute gradients locally on every worker node.gradients = []for i in range(5): with tf.device("/job:WORKER/task:%d" % i): device_iterator = tf.compat.v1.data.make_one_shot_iterator(dataset) device_next_obj = device_iterator.get_next() gradient = compute_gradient(device_next_obj) gradients.append(gradient)# Aggregate them on master node.result_gradient = tf.reduce_sum(gradients)with tf.Session("grpc://localhost:10000") as sess: print(sess.run(result_gradient))

借助 Apache Ignite,您还可以使用 TensorFlow 高级Estimator API来进行分布式训练。此功能以所谓的 TensorFlow 分布式训练的 独立客户端模式 为基础,Apache Ignite 在其中发挥数据源和集群管理器的作用。与此相关的内容,我们将在下一篇文章中全面介绍。

注:独立客户端模式 链接

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/distribute#standalone-client-mode

检查点存储

除数据库功能外,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 也允许进行此通信

注:自定义文件系统插件 链接

https://www.tensorflow.org/guide/extend/filesystem

IGFS Native API 链接

https://ignite.apache.org/features/igfs.html

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

注:tensorflow/io 链接

https://github.com/tensorflow/io

SSL 连接

通过 Apache Ignite,您可以使用SSL和身份验证来保护数据传送渠道。Ignite Dataset 支持具备和不具备身份验证的 SSL 连接。如需更多信息,请参阅Apache Ignite SSL/TLS文档(https://apacheignite.readme.io/docs/ssltls)。

import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES", certfile="client.pem", cert_password="password", username="ignite", password="ignite")

Windows 支持

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

试用

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

Ignite Dataset

要试用 Ignite Dataset,最简单的方法是使用 Apache Ignite 和加载好的MNIST数据运行Docker容器,然后使用 Ignite Dataset 与其交互。您可以在 Docker Hub:dmitrievanthony/ignite-with-mnist上找到此容器。您需要在机器上启动此容器:

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

注:MNIST 链接

http://yann.lecun.com/exdb/mnist/

dmitrievanthony/ignite-with-mnist 链接

https://hub.docker.com/r/dmitrievanthony/ignite-with-mnist/

然后您可以按照以下方法使用它:

IGFS

TensorFlow 的 IGFS 支持功能于 TensorFlow 1.13 中发布,并将在 TensorFlow 2.0 中作为tensorflow/io的一部分发布。如要通过 TensorFlow 试用 IGFS,最简单的方法是使用 Apache Ignite 和 IGFS 来运行Docker容器,然后使用 TensorFlowtf.gfile与其交互。您可以在 Docker Hub:dmitrievanthony/ignite-with-igfs上找到此容器。您可以在自己的机器上运行此容器:

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

然后您可以按照以下方法使用它:

import tensorflow as tfimport tensorflow.contrib.ignite.python.ops.igfs_opswith tf.gfile.Open("igfs:///hello.txt", mode='w') as w: w.write("Hello, world!")with tf.gfile.Open("igfs:///hello.txt", mode='r') as r: print(r.read())

Hello, world!

限制

目前,Ignite Dataset 需要假设缓存中的所有对象都具有相同的结构(同类型对象),并且缓存中至少包含一个检索架构所需的对象。另一个限制与结构化对象有关,Ignite Dataset 不支持通用唯一识别码 (UUID)、地图和可能是对象结构组成部分的对象数组。所有这些限制都是进一步开发的主题。

即将发布的 TensorFlow 2.0

TensorFlow 2.0 中即将发布的新变更会将此功能分离到tensorflow/io模块。之后,您将可以更加灵活地使用此功能。这些示例将略有改动,我们的文档和示例也会反映这一点。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4762

    浏览量

    100527
  • 大数据
    +关注

    关注

    64

    文章

    8863

    浏览量

    137282
  • 深度学习
    +关注

    关注

    73

    文章

    5492

    浏览量

    120964
  • tensorflow
    +关注

    关注

    13

    文章

    328

    浏览量

    60494

原文标题:Apache Ignite 上的 TensorFlow

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Apache Kafka简介(1)#分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:45:31

    Apache Kafka简介(2)#分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:45:56

    #分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:58:32

    分布式软件系统

    三个特点:分布性、通信性和稳健性。 分布式文件系统具有执行远程文件存取的能力,并以透明方式对分布在网络的文件进行管理和存取。 分布式数据
    发表于 07-22 14:53

    分布式数据库有什么优缺点?

    分布式数据库系统(DDBS)是数据库技术和网络技术两者相互渗透和有机结合的结果。涉及数据库基本理论和网络通信理论。分布式数据库由一组数据组成
    发表于 09-24 09:13

    HarmonyOS教程—基于分布式数据接口,实现多种设备一致的数据访问体验

    相互同步,为用户提供在多种终端设备一致的数据访问体验。有关分布式数据服务更加详细的介绍可以参考分布式
    发表于 09-26 11:40

    基于Web services的分布式企业信息整合模型

    针对目前电力系统的信息整合需求,设计基于Web services的电力系统多层分布式信息整合模型。该模型可以跨越不同企业数据源、应用体系和开发语言的界限,以服务的形式封装数据
    发表于 04-21 09:16 14次下载

    分布式数据库,什么是分布式数据

    分布式数据库,什么是分布式数据分布式数据库系统是在集中式数据库系统成熟技术的基础发展起来的,但不是简单地把集中式数
    发表于 03-18 15:25 3974次阅读

    基于LDA主题模型进行数据源选择方法

    基于数据源的样本文档集和查询之间的关键词匹配,通常无法很好地解决少量样本文档的信息缺失问题。针对这一问题,提出了基于隐含狄利克雷分布( LDA)主题模型进行数据源选择的方法。首先,使用LDA主题模型获得
    发表于 01-04 15:00 0次下载
    基于LDA主题模型进行<b class='flag-5'>数据源</b>选择方法

    Apache RocketMQ 正式开源分布式事务消息

    摘要: 近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式
    发表于 08-20 15:15 306次阅读

    Apache Spark的分布式深度学习框架BigDL的概述

    该视频概述了Apache Spark *的BigDL分布式深度学习框架。
    的头像 发表于 10-30 06:41 3219次阅读

    Apache Spark分布式机器学习的介绍

    Apache Spark分布式机器学习
    的头像 发表于 11-05 06:31 2893次阅读

    欧拉(openEuler)Summit2021:基于分布式内存池的分布式应用数据交换与共享

    欧拉(openEuler)Summit 2021分布式&多样性计算分论坛,介绍了基于分布式内存池的分布式应用
    的头像 发表于 11-10 15:48 2322次阅读
    欧拉(openEuler)Summit2021:基于<b class='flag-5'>分布式</b><b class='flag-5'>内存</b>池的<b class='flag-5'>分布式</b>应用<b class='flag-5'>数据</b>交换与共享

    SpringBoot分布式事务的解决方案(JTA+Atomic+多数据源

    首先,到底啥是分布式事务呢,比如我们在执行一个业务逻辑的时候有两步分别操作A数据源和B数据源,当我们在A数据源执行数据更改后,在B
    的头像 发表于 04-11 11:05 1585次阅读

    数据源数据转换和同步的ETL工具推荐

    有许多支持多数据源数据转换和同步的ETL工具可供选择。以下是一些常见的ETL工具和它们支持多数据源数据转换和同步的特点: Apache Ni
    的头像 发表于 07-28 16:32 1060次阅读