tensorflow源码分析(2)

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_()接口

2Supper()._init_()是调用Session对象的父类的_init_()接口

3Session的父类是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()接口

6c_api.hTensorFlow的后端执行系统面向前端开放的公共API接口之一

7SessionFactory::GetFactory 根据前端传入的target使用SessionFactory多态创建不同类型的Session(C++)对象

8DirectSessionFactory GrpcSessionFactory继承SessionFactory,实现自己的NewSession()接口

9DirectSessionFactory会调用new DirectSession()创建相应的的session

10AddDevices接口得目的是把所有得可用于graph计算得设备添加到session

11GetFactory(“CPU”)主要是获取实例化CPUDeviceFactory的类

12createDevices(options, name_prefix, devices)) GetFactory接口会返回cpudevicefactory类,然后调用该类中得createDevices接口把该cpu设备放到全局得vector数组中,name_prefix参数决定了把第几个cpu设备添加到vector中,该接口主要是首先添加第一个cpu设备到devices vector中,首先添加cpu设备是为了再指定gpu设备运行,但没有gpu得硬件得情况下仍然可以通过cpu执行相应得操作(TODO:如何通过不同设备的createdevice接口与具体的设备建立连接关系

13device_factories()该接口会调用不同类型设备的XXDeviceFactory,然后把相应的设备放到vector数组中,该步骤执行完后所有的计算设备都与session建立了对应关系,可以理解为session此时获取当前机器上所有的可用计算资源。

14DeviceMgr(devices) DeviceMgr是一个设备管理类,其实它主要是提供了一系列数据结构来提高API的效率

15DirectSession(options, new DeviceMgr(devices), this)该接口主要是用来初始化sessiontf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置,所以在该接口中有对options进行解析,session根据计算资源维护一个动态的线程池池,当获取到一个 graph 并启动运行时,Session 就会将 graph 调度到线程池中交由空闲的计算资源来完成计 算。(TODOsession获取一个graph时会通过线程池中的空闲进程把graph交给相应的计算设备计算,之后可以详细展开

16sessions_.push_back(session) DirectSessionFactory类中有一个vector类型的sessions_的私有变量,用来保存已经实例化的direcsession

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值