TensorFlow计算图的创建

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

本文链接地址: TensorFlow计算图的创建


回目录
Tensorflow机器学习任务的核心就是根据用户定义的图graph模型以及参数求解方式进行抽象之后,生成一个由节点和有向边组成,可以确定一个唯一的计算逻辑用有向无环图,称之为计算图。它定义了数据的流转方式,数据的计算方式,以及各种计算之间的相互依赖关系等。节点包括计算节点(Operation)、存储节点(Variable)和数据节点(Placeholder)3类,用于计算数据和存储数据。有向边表示数据的流转方式和依赖。

创建计算图

direct_session.cc中的方法CreateGraphs进行计算图的创建。它调用BuildGraph进行图的创建,调用Partition方法进行图的分区,调用ConvertGraphDefToGraph完成用户图向计算图的转换。

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

TensorFlow计算图的优化

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

本文链接地址: TensorFlow计算图的优化

Tensorflow计算图的优化相当重要,通过对其优化可以显著降低无用代码对计算资源的消耗,尤其在深度学习时,每一此迭代时间的缩短可以大大加速整个学习结果的求解,降低的资源消耗又可以容纳更多的输入并行计算。常见的优化有常量折叠,公共表达式折叠,内联函数展开,算数优化,修剪不可达节点,调试代码去除,自动并行计算,循环优化,内存优化等。
比如如下的图模型,通过算数优化里的FoldMultiplyIntoConv(折叠乘法进卷积),当weighs和scale都是常量的时候,那么可以修改左图到右图,这样就减掉了一个复杂的标量和矩阵的相乘,而仅仅多了一个简单的标量和标量相乘,大大降低了计算量,特别时input非常巨大的时候。

//         Conv2D                             Conv2D
//        /      \                           /      \
//    Transpose  weights*       ->     Transpose    Mul
//       |                                |        /   \
//      Mul                               |    weights  scale
//     /   \                              |
//   input  scale**                     input
//
//  *) weights must be a const
// **) scale must be a const scalar

比如说常量折叠里面的1 * y => y,0 + y => y,0 – y => Neg(y),1 / y => Reciprocal(y)等,这些替代可以减少节点的创建,从而缩减了资源使用。


回目录

计算图分析测试程序

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

TensorFlow Session的Setup

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

本文链接地址: TensorFlow Session的Setup

TensorFlow Session的Setup完成整个Session的创建,设置输入数据类型(feeds)和输出数据类型(fetches)。然后利用图Graph创建基于Session的基本图,开启线程器(Exectors)等待Session开始。


回目录

SessionPRunSetup

主程序调用c_api.cc中的TF_SessionPRunSetup完成Session的Setup。

	TF_SessionPRunSetup(sess, feeds, TF_ARRAYSIZE(feeds), fetches,
			TF_ARRAYSIZE(fetches), NULL, 0, &handle, s);
 
void TF_SessionPRunSetup(TF_Session* session, const TF_Output* inputs,
                         int ninputs, const TF_Output* outputs, int noutputs,
                         const TF_Operation* const* target_opers, int ntargets,
                         const char** handle, TF_Status* status) {
  *handle = nullptr;
 
  if (session->extend_before_run &&
      !ExtendSessionGraphHelper(session, status)) {
    return;
  }
 
  std::vector<string> input_names(ninputs);
  for (int i = 0; i < ninputs; ++i) {
    input_names[i] = OutputName(inputs[i]);
  }
 
  std::vector<string> output_names(noutputs);
  for (int i = 0; i < noutputs; ++i) {
    output_names[i] = OutputName(outputs[i]);
  }
 
  std::vector<string> target_names(ntargets);
  for (int i = 0; i < ntargets; ++i) {
    target_names[i] = target_opers[i]->node.name();
  }
 
  string new_handle;
  status->status = session->session->PRunSetup(input_names, output_names,
                                               target_names, &new_handle);
  if (TF_GetCode(status) == TF_OK) {
    char* buf = new char[new_handle.size() + 1];
    memcpy(buf, new_handle.c_str(), new_handle.size() + 1);
    *handle = buf;
  }
}

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

TensorFlow Executor的创建

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

本文链接地址: TensorFlow Executor的创建


回目录
Session中的Executeors是一个线程池,用来执行每个节点Node的计算。在上一篇Session的setup中,其中调用了GetOrCreateExecutors类创建Executeors。
direct_session.cc中的GetOrCreateExecutors方法用于获取设置callable_options的inputs,fetches,target,然后继续调用CreateExecutors方法创建executors。
继续阅读“TensorFlow Executor的创建”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TensorFlow Session的创建

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

本文链接地址: TensorFlow Session的创建

本文介绍TensorFlow Session的创建。TensorFlow使用Session 类来表示客户端程序(通常用Python 程序,但也提供了其他语言的类似接口,这儿就是用C接口)与 C++ 运行时之间的连接。Session 对象使我们能够访问本地机器中的设备和使用分布式 TensorFlow 运行时的远程设备。它还可缓存关于Graph 的信息,使您能够多次高效地运行同一计算。Session接受Graph参数和Options选项参数,Options参数可以指定使用的设备等信息。


回目录

SessionFactory的创建

在so文件加载的时候,文件direct_session.cc中静态变量registrar的创建会向SessionFactory中注册DIRECT_SESSION类型的factory。

class DirectSessionRegistrar {
 public:
  DirectSessionRegistrar() {
    SessionFactory::Register("DIRECT_SESSION", new DirectSessionFactory());
  }
};
static DirectSessionRegistrar registrar;

在so文件加载的时候,文件grpc_session.cc中静态变量registrar的创建会向SessionFactory中注册GRPC_SESSION类型的factory。

class GrpcSessionRegistrar {
 public:
  GrpcSessionRegistrar() {
    SessionFactory::Register("GRPC_SESSION", new GrpcSessionFactory());
  }
};
static GrpcSessionRegistrar registrar;

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