tensorflow源码分析(五)session.run()

      接下里分析session.run()接口,执行一次run就执行了一遍数据流图,在tensorflow代码中通常在一个循环中调用run接口,一次run就是训练过程中的一步:

1session.run() 客户端通过该接口执行一步训练

2)BaseSession.Run()fetches参数可以是单个元素,或者是一个列表,一个字典,一个元组,都是可以的,但是要有个前提,最终的节点元素一定是一个graph_element也就是能够被graph识别并且转化为ops或者tensor的一个对象;该接口的返回值的shape与fetches一致;feed_dict参数允许用户覆盖原来在graph中的tensor的值;options可以控制某些特殊步骤的行为(打开追踪等);run_metadata手机非tensor的输出;

3)tf_session.TF_NewBuffer():创建用于输出的protobuffer

3)BaseSession._run()该接口会检测参数得合法性

4_FetchHandler()该接口是对传入的fetches进行结构化,因为传入的fetches有各种各样的,所以最后要转变成对应的opstensor才能够在graph上面流动,并且最终会返回一个tensor名字的列表和一个ops名字的列表

5BaseSession._update_with_movers()如果一个tensor句柄被输入到设备不兼容的占位符上,我们可以把该tensor移动到一个正确的设备上,并且会创建一个新的tensor handler,并更新feed_dict以使用新的tensor句柄,movers会一直存在,直到_do_run()执行结束

6BaseSession._do_run()根据是否有handle的传入选择性运行run或者partial_run

7tf_session.TF_Run()会通过pythonc++的转换层调用到c++的接口

8TF_Run_Helper()根据handler是否为空选择run()或者prun()

9)最终回调用DirectSession::Run()接口,该接口会完成绝大部分的工作

10IncrementBy(1) 累加 Session 计数器

11GetOrCreateExecutors()处理输入,准备线程池,根据输入输出 tensor、目标节点,从当前 Session 中已有的 executor 中找是否存在 一个相同任务的 executor,找到则将其返回,否则创建一个新的 executorTODO:会涉及创建executors 创建graphgrpah中每个元素分配设备等,可以继续展开

12call_frame()配置一个call frame,是一个用来处理 executor 输入输出的一个接口结构。从前面解析过的输入中提取出具体的 Tensor,封装到 FunctionCallFrame 里面去

13run_state(args.step_id, &devices_)创建一个 RunState,用于标记运行的状态;一个 IntraProcessRendezvous 用于本地 Tensor 数据的管理;一个 CancellationManager,用于让 Session 响应 Session::Close()

14item.executor->RunAsync()配合线程池去执行运行,主线程这个时候会停下来等待 executor 跑完(TODO:在该接口中做了很多工作(初始化ready队列,把已经readynode交给session管理得设备和相应的线程去执行),可以详细展开)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值