0%

浅谈分布式数据预处理-dataservice

Dataservice 简述

Dataservice 模块是 Tensorflow 2.3 版本中的一个重要部分,核心功能是实现分布式预处理 pipeline,核心解决问题还是数据处理 IO 问题,和大数据处理中的 Mapreduce 有点相像,核心概念是 JobTracker, TaskTrackier 和 TaskRunner;

核心概念

在TF Dataservice中也有着相对应的核心概念,涉及到进程/线程实体的有Dispatcher,Worker,TaskRunner;涉及到任务概念的有Job、Task以及Dataset。

  • Dataset
    Tensorflow中采用了类似于Spark中RDD的思想:即对整个Dataset实现处理变换;Dataset只是定义着基础的操作,而关于并发处理等制实际上是在Dataset上封装的一层Iterator里进行实现;
  • Job
    Job是Dataservice中对于数据处理pipeline这个层面的概念抽象。相当于一系列数据处理操作的集合就是一个Job
  • Task
    一个Job是会对应着多个Task的。比如我现在使用8个进程去并行执行数据读取,那么就会有8个Task

任务执行

Dataservice中采用几乎和Spark运行一一对应的概念,其中Dispatcher对应JobTracker,Worker对应TaskTracker,TaskRunner对应TaskRunner。只不过在TF中,worker接收到一个Task之后不需要重新起一个JVM来执行代码,而是直接进行函数调用即可。整体而言TFDataservice中的分布式数据处理的架构如下图所示。这个图看起来有点乱,但是基本上就描述清了TFDataservice中的设计。Dispatcher和Worker都是两个RPC Server。Dataset和Dispatcher,Dispatcher和Worker以及Dataset和Worker之间都是采用RPC调用进行通信。

数据读取流程

当Dataset被迭代的时候,Dataset会直接和对应的worker进行通信,调用Worker的GetElement的RPC方法直接获取数据;
实际上当我们创建了一个DataServiceDataset的时候,该Dataset也会定期和Dispatcher进行Heartbeat通信。在非RoundRobin的读取方式下,Dataset与Dispatcher通信的核心目的是知道自己的Job被创建了哪些Task。当Dispatcher接收到来自JobClient的Heartbeat时,会返回给Dataset所有其Job相关的Task。

Pytorch 场景很难做到的原因待探索

Welcome to my other publishing channels