Session类:
Session是连接client和tensorflow系统的中间件,负责两者之间的交互;
Session后台得实现由两种:DirectSession和GrpcSession。DirectSession在本地环境中使用,GrpcSession在分布式环境中使用,来计算相应得graph,两种方式分别对应两个不同的object实现。
Client通过Session与Master交互,而Master协调一个或者多个的 worker processes 完成计算任务,每个 worker process 负责对一个或者多个计算设备(CPU 核或者 GPU card)的任意访问和在这些设备上进行图节点的计算按照 master 的要求执行。
初始化参数:
Target:该session连接到得执行引擎,默认使用in-process引擎(TODO)
Graph:将要再该session运行得graph,如果没有指定代表默认得graph
Config:暴露对session得配置,可以配置对session得软约束
TensorFlow中的Device是通过注册机制添加到运行的进程中的。注册机制在开源代码中是十分常见的设计技巧,它涉及到了一种非常经典的设计模式——工厂模式。在定义每个Device时,通过利用C++事先定义好的宏(Macro)将类对象主动注册到工厂中,这样就可以达到在程序启动完毕时,工厂里已经储备有各种各样所需要的内容。在TensorFlow中存在多处使用工厂模式的例子,比如下面阐述的Device管理,以及Session管理等。
有了DeviceFactory之后,我们就可以从Factory中拿到各种各样的Device了。真正从Factory中取出Device的过程是在Session创建时进行的,调用的函数是DeviceFactory中的static函数AddDevices。它会遍历全局device factories表中全部的DeviceFactory并取出,然后逐个调用每个具体XXDeviceFactory的CreateDevices函数,将创建的Device放进vector数组中。
实际上DeviceFactory的static函数调用AddDevices时会先将CPU Device创建出来,如果没有可用的CPU Device,那么程序就会直接报错退出(一般情况下不会发生此类情况)。这是因为TensorFlow需要保证当没有其他Device存在时,至少还有CPU可以完成整体程序的计算和调度运行。创建CPU Device之后,就会去遍历所有DeviceFactory,把所有能够创建的Device全部创建出来放入vector数组中
API功能描述:
1)Session()对session的实例化,会调用Session的_init_()接口
2)Supper()._init_()是调用Session对象的父类的_init_()接口
3)Session的父类是BaseSession,调用BaseSession的_init_()接口
4)tf_session.TF_NewSession()主要是调用pywrap_tensorflow模块的TF_NewSession()接口
5)_pywrap_tensorflow_internal.TF_NewSession(graph, opts)主要是调用
_pywrap_tensorflow_internal.so里面的TF_NewSession()接口
6)c_api.h是TensorFlow的后端执行系统面向前端开放的公共API接口之一
7)SessionFactory::GetFactory 根据前端传入的target使用SessionFactory多态创建不同类型的Session(C++)对象
8)DirectSessionFactory GrpcSessionFactory继承SessionFactory,实现自己的NewSession()接口
9)DirectSessionFactory会调用new DirectSession()创建相应的的session
10)AddDevices接口得目的是把所有得可用于graph计算得设备添加到session中
11)GetFactory(“CPU”)主要是获取实例化CPUDeviceFactory的类
12)createDevices(options, name_prefix, devices)) GetFactory接口会返回cpudevicefactory类,然后调用该类中得createDevices接口把该cpu设备放到全局得vector数组中,name_prefix参数决定了把第几个cpu设备添加到vector中,该接口主要是首先添加第一个cpu设备到devices vector中,首先添加cpu设备是为了再指定gpu设备运行,但没有gpu得硬件得情况下仍然可以通过cpu执行相应得操作(TODO:如何通过不同设备的createdevice接口与具体的设备建立连接关系)
13)device_factories()该接口会调用不同类型设备的XXDeviceFactory,然后把相应的设备放到vector数组中,该步骤执行完后所有的计算设备都与session建立了对应关系,可以理解为session此时获取当前机器上所有的可用计算资源。
14)DeviceMgr(devices) DeviceMgr是一个设备管理类,其实它主要是提供了一系列数据结构来提高API的效率
15)DirectSession(options, new DeviceMgr(devices), this)该接口主要是用来初始化session,tf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置,所以在该接口中有对options进行解析,session根据计算资源维护一个动态的线程池池,当获取到一个 graph 并启动运行时,Session 就会将 graph 调度到线程池中交由空闲的计算资源来完成计 算。(TODO:session获取一个graph时会通过线程池中的空闲进程把graph交给相应的计算设备计算,之后可以详细展开)
16)sessions_.push_back(session) DirectSessionFactory类中有一个vector类型的sessions_的私有变量,用来保存已经实例化的direcsession。