生物科技公司网站模板,flash网站源文件下载,wordpress星座主题自适应,谁知道深圳松岗天桥旁的网站建设3 系统架构系统整体组成#xff1a;Tensorflow的系统结构以C API为界#xff0c;将整个系统分为前端和后端两个子系统#xff1a;前端构造计算图后端执行计算图#xff0c;可再细分为#xff1a;运行时#xff1a;提供本地模式和分布式模式计算层#xff1a;由kernal函数…3 系统架构系统整体组成Tensorflow的系统结构以C API为界将整个系统分为前端和后端两个子系统前端构造计算图后端执行计算图可再细分为运行时提供本地模式和分布式模式计算层由kernal函数组成通信层基于gRPC实现组件间的数据交换并能够在支持IB网络的节点间实现RDMA通信设备层计算设备是OP执行的主要载体TensorFlow支持多种异构的计算设备类型2. 从图操作的角度看TensorFlow执行步骤包括计算图的构造、编排、及其运行表达图构造计算图但不执行(前端)编排图将计算图的节点以最佳的执行方案部署在集群中各个计算设备上(运行时)运行图按照拓扑排序执行图中的节点并启动每个OP的Kernel计算(计算层、通信层、设备层)3. 系统中重要部分(Client、Master、Worker)Client前端系统的主要组成部分Client基于TensorFlow的编程接口负责构造计算图。Master负责的流程(接收并处理图)Client执行Session.run时传递整个计算图(Full Graph)给后端的MasterMaster通过Session.run中的fetches、feeds参数根据依赖关系将Full Graph剪枝为小的依赖子图(Client Graph)Master根据任务名称将Client Graph分为多个Graph Partition(SplitByTask)每个Graph Partition被注册到相应的Worker上(任务和Worker一一对应)Master通知所有Worker启动相应Graph Partition并发执行Worker负责的流程(再次处理图并执行图)处理来自Master的请求(图执行命令)对注册的Graph Partition根据本地设备集二次分裂(SplitByDevice)其中每个计算设备对应一个Graph Partition(是注册的Graph Partition中更小的Partition)并通知各个计算设备并发执行这个更小的Graph Partition(计算根据图中节点之间的依赖关系执行拓扑排序算法)按照拓扑排序算法在某个计算设备上执行本地子图并调度OP的Kernel实现协同任务之间的数据通信(交换OP运算的结果)设备间Send/Recv(主要用于本地的数据交换)本地CPU与GPU之间使用cudaMemcpyAsync实现异步拷贝本地GPU之间使用端到端的DMA操作避免主机端CPU的拷贝任务间通信(分布式运行时Send/Recv节点通过GrpcRemoteRendezvous完成数据交换)gRPC over TCPRDMA over Converged EthernetKernalKernel是OP在某种硬件设备的特定实现它负责执行OP的具体运算大多数Kernel基于Eigen::Tensor实现。Eigen::Tensor是一个使用C模板技术4. 图控制(实例解释3.3中的内容)组建集群假设一个分布式环境1PS1Worker将其划分为两个任务ps0使用/job:ps/task:0标记负责模型参数的存储和更新worker0/job:worker/task:0标记负责模型的训练图构造Client构建了一个简单的计算图图执行Client创建Session实例并调用Session.run将计算图传递给Master。Master在执行图计算之前会实施一系列优化技术例如公共表达式消除常量折叠等。最后Master负责任务之间的协同执行优化后的计算图。图分裂Master将模型参数相关的OP划分为一组并放置在ps0任务上其他OP划分为另外一组放置在worker0任务上执行子图注册在图分裂过程中如果计算图的边跨越节点或设备Master将该边实施分裂在两个节点或设备之间插入Send和Recv节点(Send和Recv节点是特殊OP仅用于数据的通信没有数据计算逻辑)最后Master通过调用RegisterGraph接口将子图注册给相应的Worker上并由相应的Worker负责执行运算。子图运算Master通过调用RunGraph接口通知所有Worker执行子图运算。其中Worker之间可以通过调用RecvTensor接口完成数据的交换5. 会话管理(保障Client与Master之间的消息传递执行图控制的操作)创建会话Client首次执行tf.Session.run时会将整个图序列化后通过gRPC发送CreateSessionRequest消息将图传递给MasterMaster创建一个MasterSession实例并用全局唯一的handle标识最终通过CreateSessionResponse返回给Client迭代运行Clent-Master。Client会启动迭代执行的过程并称每次迭代为一次Step。此时Client发送RunStepRequest消息给Master消息携带handle标识用于Master索引相应的MasterSession实例Master图分裂。Master收到RunStepRequest消息后Full Graph-Client Graph-Partition Graph-Master向Worker发送RegisterGraphRequest消息将Partition Graph注册到各个Worker节点上Worker图分裂。当Worker收到RegisterGraphRequest消息后再次实施分裂操作最终按照设备将图划分为多个子图片段注册子图。当Worker完成子图注册后通过返回RegisterGraphReponse消息并携带graph_handle标识。这是因为Worker 可以并发注册并运行多个子图每个子图使用graph_handle唯一标识。Master完成子图注册后通过发送RunGraphRequest消息给Worker并发执行所有子图消息中携带(session_handle,graph_handle,step_id)三元组的标识信息用于Worker索引相应的子图子图节点拓扑排序。Worker收到消息RunGraphRequest消息后Worker根据graph_handle索引相应的子图。每个子图放置在单独的Executor中执行Executor将按照拓扑排序算法完成子图片段的计算。数据交换设备间通信通过Send/Recv节点Worker间通信涉及进程间通信此时需要通过接收端主动发送RecvTensorRequest消息到发送方再从发送方的信箱取出对应的Tensor并通过RecvTensorResponse返回关闭会话计算完成后Client向Master发送CloseSessionReq消息。Master收到消息后开始释放MasterSession所持有的所有资源4 C API分水岭(前后端之间的通道的实现)科普Bazel高级构建语言Bazel使用一种抽象的、人易于理解的、语义级别的高级语言来描述项目的构建属性。免于将单个调用编写到编译器和链接器等的复杂性SwigSWIG是一种简化脚本语言与C/C接口的开发工具。简而言之SWIG是一个通过包装和编译C语言程序来达到与脚本语言通讯目的的工具2. SwigTensorFlow使用Bazel的构建工具在系统编译之前启动Swig的代码生成过程通过tensorflow.i自动生成了两个适配(Wrapper) 文件pywrap_tensorflow_internal.py——负责对接上层Python调用该模块首次被导入时自动地加载_pywrap_tensorflow_internal.so的动态链接库其中_pywrap_tensorflow_internal.so包含了整个TensorFlow运行时的所有符号http://pywrap_tensorflow_internal.cc——负责对接下层C API调用该模块实现时静态注册了一个函数符号表实现了Python函数名到C函数名的二元关系。在运行时按照Python的函数名称匹配找到对应的C函数实现最终实现Python到c_api.c具体实现的调用关系Bazel生成规则定义于//tensorflow/python:pywrap_tensorflow_internal如下图所示3. 会话生命周期——包括会话的创建创建计算图扩展计算图执行计算图关闭会话销毁会话六个过程在前后端表现为两套相兼容的接口实现Python前端的Session生命周期下图为生命周期创建Sessiontf.Session(target)迭代执行sess.run(fetchsfeed_dict)sess._extend_graph(graph)sess.TF_Run(feedsfetchestargets)关闭Sessionsess.close()销毁Sessionsess.__del__C后端的Session生命周期下图为生命周期和本地模型的DirectSession实例根据target多态创建SessionSession.Create(graph)有且仅有一次Session.Extend(graph)零次或多次迭代执行Session.Run(inputsoutputstargets)关闭Session.Close销毁Session对象4. 会话周期各部分内容展开(展开4.3中的内容从代码层面分析)创建会话过程从Python前端为起点通过Swig自动生成的Python-C的包装器并以此为媒介实现了Python到TensorFlow的C API的调用编程接口(Python调用)创建了一个Session实例调用父类BaseSession的构造函数进而调用BaseSession的构造函数中pywrap_tensorflow模块中的函数(Python代码)Session类构造函数中graph参数的定义如下图。ScopedTFGraph是对TF_Graph的包装器完成类似于C的RAII的工作机制。而TF_Graph持有 ternsorflow::Graph实例。其中self._graph._c_graph返回一个TF_Graph实例后者通过C API创建的图实例(Python代码)图实例传递如下(上面代码对应图中Python部分)Python包装器在pywrap_tensorflow模块中通过_pywrap_tensorflow_internal的转发实现从Python到动态连接库_pywrap_tensorflow_internal.so的函数调用(对接上层Python调用包含了整个TensorFlow运行时的所有符号)C包装器在http://pywrap_tensorflow_internal.cc实现中通过函数调用的符号表实现Python到C的映射。_wrap_TF_NewSession/wrap_TF_NewDeprecatedSession将分别调用c_api.h对其开放的API接口TF_NewSession/TF_NewDeprecatedSession。也就是说自动生成的http://pywrap_tensorflow_internal.cc仅仅负责Python函数到C/C函数调用的转发最终将调用底层C系统向上提供的API接口C APIc_api.h是TensorFlow的后端执行系统面向前端开放的公共API接口实现采用了引用计数的技术实现图实例在多个Session实例中共享后端系统(C API的底层C实现)NewSession将根据前端传递的target使用SessionFactory多态创建不同类型的tensorflow::Session实例(工厂方法)SessionOptions中target为空字符串 (默认的)则创建DirectSession实例SessionOptions中target以grpc://开头则创建GrpcSession实例启动基于RPC的分布式运行模式创建/扩展图过程在既有的接口实现中需要将图构造期构造好的图序列化并传递给后端C系统。而在新的接口实现中无需实现图的创建或扩展新的接口创建OP时节点实时添加至后端C系统的图实例中而不像既有接口每次调用sess.run后在原先图实例的基础上再添加节点既有接口Python前端将迭代调用Session.run接口将构造好的计算图以GraphDef的形式发送给C后端。其中前端每次调用Session.run接口时都会试图将新增节点的计算图发送给后端系统以便将新增节点的计算图Extend到原来的计算图中。特殊地在首次调用Session.run时将发送整个计算图给后端系统。后端系统首次调用Session.Extend时转调Session.Create。以后后端系统每次调用Session.Extend时将真正执行Extend的语义将新增的计算图的节点追加至原来的计算图中编程接口在既有的接口实现中通过_extend_graph实现图实例的扩展在首次调用self._extend_graph时或者有新的节点被添加至计算图中时对计算图GraphDef实施序列化操作最终触发tf_session.TF_ExtendGraph的调用Python包装器C包装器C APITF_ExtendGraph是C API对接上层编程环境的接口。首先它完成计算图GraphDef的反序列化最终调用tensorflow::Session的Extend接口后端系统Create表示在当前的tensorflow::Session实例上注册计算图如果要注册新的计算图需要关闭该tensorflow::Session对象。Extend表示在tensorflow::Session实例上已注册的计算图上追加节点。Extend 首次执行时等价于Create的语义。实现如首次扩展图GrpcSession所示若引用Master的handle不为空则执行Extend否则执行Create建立与Master的连接并持有MasterSession的handle迭代运行过程Python前端Session.run实现将fetchesfeed_dict传递给后端系统后端系统调用Session.Run接口编程接口当Client调用Session.run时最终会调用pywrap_tensorflow_internal模块中的函数Python包装器C包装器C API在既有的接口中TF_Run是C API对接上层编程环境的接口。首先它完成输入数据从C到C的格式转换并启动后台的tensorflow::Session的执行过程。当执行完成后再将outputs的输出数据从C到C的格式转换。TF_SessionRun类似后端系统输入包括optionsSession的运行配置参数inputs输入Tensor的名字列表output_names输出Tensor的名字列表targets无输出待执行的OP的名字列表输出包括outputs输出的Tensor列表outputs列表与输入的output_names一一对应run_metadata运行时元数据的收集器关闭会话过程当计算图执行完毕后需要关闭tf.Session以便释放后端的系统资源包括队列IO等编程接口当Client调用Session.close时最终会调用pywrap_tensorflow模块中的函数TF_CloseDeprecatedSessionPython包装器C包装器C APITF_CloseSession/TF_CloseDeprecatedSession直接完成tensorflow::Session的关闭操作后端系统Session(C)在运行时其动态类型将多态地调用相应的子类实现销毁会话过程当tf.Session不在被使用由Python的GC释放。Client调用Session.__del__后将启动后台tensorflow::Session对象的析构过程编程接口Client调用Session.__del__时先调用Session.close再调用pywrap_tensorflow模块中的TF_DeleteSession/TF_DeleteDeprecatedSessionPython包装器C包装器C APITF_DeleteDeprecatedSession直接完成tensorflow::Session对象的释放。而新的接口TF_DeleteSession实现中当需要删除tensorflow::Session实例时相应的图实例的计数器减1。当计数器为0时则删除该图实例否则不删除该图实例后端系统tensorflow::Session在运行时其动态类型多态地调用相应子类实现的析构函数5. 性能调优(针对新实现的接口)共享图实例一个Session只能运行一个图实例如果一个Session要运行其他的图实例必须先关掉Session然后再将新的图实例注册到此Session中。但反过来一个计算图可以运行在多个Session实例上。如果在Graph实例上维持Session的引用计数器在Session创建时在该图实例上增加1在Session销毁时(不是关闭Session)在该图实例上减少1当计数器为0时则自动删除图实例(即新接口加入了引用计数器)消除序列化遗留的接口实现中前端构造图并将其序列化后通过Session::Create或Session::Extend传递给后端。这本质是图实例的拷贝具有很大的时延开销在新的接口实现中可以去Create/Extend语义。在图的构造器前端Python在构造每个OP时直接通过C API将其追加至后端C的图实例中从而避免了图实例在前后端的序列化和反序列化的开销