TF 计算图的执行

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF 计算图的执行

TF计算图优化完成后,在Session开始执行后就轮到TF 计算图的执行了。Tensorflow会根据计算图的节点信息,首先找到一个没有输入的节点作为根节点,创建一个task交给线程池取执行。每个节点完成后会根据Edge通知下游节点计算,直到所有节点完成计算,然后输出结果。

Tensorflow源码解读

计算图执行

还是以“TF 生成计算图”中的程序为例:
进入到如下的堆栈,从DirectSession::CreateExecutors()开始创建Executors。

tensorflow::DirectSession::CreateExecutors() at direct_session.cc:1,301 0x7ffff591344b	
tensorflow::DirectSession::GetOrCreateExecutors() at direct_session.cc:1,435 0x7ffff5914bec	
tensorflow::DirectSession::PRunSetup() at direct_session.cc:849 0x7ffff59162b7	
TF_SessionPRunSetup() at c_api.cc:2,668 0x7ffff2090e54	
main() at TensorflowTest2.cpp:58 0x40522e

继续阅读“TF 计算图的执行”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TF 生成计算图

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF 生成计算图

生成计算图分析

假设我们有以下的tensorflow程序:
程序中,两个Input tensor A和B,一个常量tensor 2,两个计算Operation Plus2和PlusB。
程序计算A+2的结果。
继续阅读“TF 生成计算图”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TF Operation的创建

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF Operation的创建

Tensorflow创建OP的过程

以AddNOp为例说明Operation怎样从ops的定义创建具体的kernel实例。
在Tensorflow Excecutor初始化的时候,会迭代计算图中的所有节点,对每个节点的Operation进行创建。如下方法params_.create_kernel(n->def(), &item->kernel):
Tensorflow源码解读

// Code in executor.cc 
Status ExecutorImpl::Initialize() {
......
  for (const Node* n : graph_->nodes()) {
    const int id = n->id();
    const string& frame_name = cf_info.frame_names[id];
    FrameInfo* frame_info = EnsureFrameInfo(frame_name);
 
    // See if this node is a root node, and if so, add to root_nodes_.
    if (n->in_edges().empty()) {
      root_nodes_.push_back(n);
    }
 
    NodeItem* item = gview_.node(id);
    item->node = n;
 
    item->input_start = frame_info->total_inputs;
    frame_info->total_inputs += n->num_inputs();
 
    Status s = params_.create_kernel(n->def(), &item->kernel);

继续阅读“TF Operation的创建”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TF Operation的注册

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF Operation的注册

Tensorflow OP的注册

以AddNOp为例说明Operation的注册:
当Tensorflow框架(dll)启动的时候,aggregate_ops.cc的静态方法被调用:

//Code in aggregate_ops.cc
#define REGISTER_ADDN(type, dev)                                   \
  REGISTER_KERNEL_BUILDER(                                         \
      Name("AddN").Device(DEVICE_##dev).TypeConstraint<type>("T"), \
      AddNOp<dev##Device, type>)
 
#define REGISTER_ADDN_CPU(type) REGISTER_ADDN(type, CPU)
 
TF_CALL_NUMBER_TYPES(REGISTER_ADDN_CPU);

继续阅读“TF Operation的注册”本作品采用知识共享署名 4.0 国际许可协议进行许可。