tensorflow分布式运行时组件剖析

来源:互联网 发布:plc200仿真软件 编辑:程序博客网 时间:2024/06/06 00:15

本节主要研读core/distributed_runtime目录.集中为分布式多节点之间通信,全局资源分配/管理,资源调度等问题.

mgr:
base_rendezvous_mgr:
rendezvous_mgr_interface.h
cluster_function_library_runtime

graph_mgr
partial_run_mgr
session_mgr

master_session
master
local_master
worker_session
worker
worker_cache

remote_device
message_wrappers
scheduler
server_lib
tensor_coding
rpc/
executor
call_option

Test:
call_option_test, cluster_function_library_runtime_test, executor_test, master_test, message_wrappler_test, rpcbench_test, tensor_coding_test, remote_device_test, partial_run_mgr_test, session_mgr_test.

call option

CallOptions,用于传递给接口调用的配置(选项).这个类提供了适配功能,针对一些平台特定的机制上层实现跨RPC系统.调用者需要传递startconcel函数.

master

master_env是一个环境类,持有一组指向每个master state的指针.包含一个与master协作的本地local_devices_, 提供一个而创建master session的工厂,传递一个session option以及一组device.调用者将拥有返回的mastersession.
MasterSession: 一个会话,封装了一个图计算(资源分配,配置,执行等等).这个会话封装了针对一个graph的图计算.将节点分配到remote_devs中的设备上,并且在这些设备上执行它们.通过Create方法实例化,一旦创建成功,传递的GraphDef将失效(计算图已经被建立并将完成配置).
Extend支持从master.proto中读取配置对图进行扩展,但是这个扩展是阻塞的,可能会阻塞调用者很长一段时间.
PartialRunStep设置一个部分运行的调用.Close方法将关闭会话并且删除申请的资源,同时还提供了一个gc,用于关闭会话并且释放this的引用,和Close方法不同的是,不会阻塞调用者.
CreateWorkerSessions,支持再所有的worker上创建会话,

MasterSession将ClientGraph封装到一个引用计数的对象中,这样,MasterSession可以清理将Run请求映射到编译图的缓存,即使这个图还在被使用.
RegisterPartitions方法将grap划分成子图,并注册到workers上.(local执行方法)

struct Part代表计算图被划分之后的子图.worker名称,feed的一个map,workerInterface,子图句柄.
在划分完计算图之后,MasterSession中就会包含一个子图的序列.
目前来看应该是每个子图对应一个worker,子图是一个partition. 子图的分发是通过创建对worker的call,其中封装了request和response. 如果该子图所有的feed都提供,那么一起通过request发送这些数据.在partial的情况,我们只希望在request上提供所需的feed.

MasterSession::Create方法创建一个会话,,同时也会调用CreateWorkerSessions创建worker会话.
一个worker会话只有在动态集群关系中会被调用.会根据集群配置,创建所有的worker,
DoRunWithLocalExecution

Master实现了MasterService服务.一个Master负责维护一个活跃计算图会话的状态,每个会话协调本地以及远端设备完成图的计算任务.Master提前会知道本地哪些设备可用作为client devices.Master按需查找远端设备,并保持对远端设备的统计追踪. 每个会话均会对图进行分析,跨设备分配图节点,并且通过在worker上执RunGraph来驱动图的计算. 构建Master时,服务必须以及指定到一个特定设备上(备注:同时会启动一个gc线程负责对资源进行清理)

DeviceFinder类,分别实现GetRemoteDevices GetRemoteWorkers方法,
Start方法,与所有的worker通信,获得可用的设备列表,Wait方法是设定一个超时,打印出未响应的worker.
通过调用tensorflow::NewServer方法创建一个server, 调用ServerFactory,由工厂方法创建server.

session mgr

WorkerNameFromServerDef方法返回一个完整的server定义,比如:/job:job_name/replica:0/task:task_index
CreateSession方法: 先获取server定义,创建了一个WorkerSession.

worker session

封装了一个给定session所有的状态信息.包括session名称,worker名称(/job:mnist/replica:0/task:1), 通过WorkInterface获取的实例,本地设备的集合,一个graph_mgr(用于索引注册到该session的图,可能有多个子图),

WorkFreeListCache: 一个私有的缓存,封装了worker_cache并且实现了WorkInteraface对象的复用.

创建一个Works时,首先从全局map workers_中根据target查找,如果已经存在,那么直接返回,如果没有那么才会根据target创建一个新的,同时加入到全局map workers_中.
worker_env
这是一个worker的环境类,持有一组指向每个worker单例的指针.同样包含该worker本地的所有设备local_devices_,device_mgr负责管理本地设备(cpu/gpu).WorkService就是为了管理设备而提供的网络接口. compute_pool是一个线程池,用于调度计算任务.

WorkerInterface

这是一个负责与tensorflow worker service交互的接口.
Woker实现了这个接口类.里面提供两个DoRunGraph/DoPritialRunGraph的方法,分别执行完整图和部分图.

原创粉丝点击