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 国际许可协议进行许可。

TensorFlow图的构建

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

本文链接地址: TensorFlow图的构建

本文就来分析tensorflow图的构建,以及运行图的设备和线程池的创建。TensorFlow使用数据流图将计算表示为独立的指令之间的依赖关系,数据流是一种用于并行计算的常用编程模型。在数据流图中,节点表示计算单元,边缘表示计算使用或产生的数据。

数据流可以为TensorFlow提供多项优势:

  • 并行处理:通过使用明确的边缘来表示操作之间的依赖关系,系统可以轻松识别能够并行执行的操作。
  • 分布式执行:通过使用明确的边缘来表示操作之间流动的值,TensorFlow 可以将您的程序划分到连接至不同机器的多台设备上(CPU、GPU 和 TPU)。
  • 编译:TensorFlow 的 XLA 编译器可以使用数据流图中的信息生成更快的代码。
  • 可移植性:数据流图是一种不依赖于语言的模型代码表示法。您可以使用 Python 构建数据流图,将其存储在 SavedModel 中,并使用 C++ 程序进行恢复,从而实现低延迟的推理。


回目录
类TensorfowTest.cc中有如下代码,它调用c api完成一个图的创建:

	TF_Graph* graph = TF_NewGraph();

在文件c_api.cc中有TF_Graph::TF_Graph构造函数:
graph的类型为Graph,refiner的类型为ShapeRefiner。

TF_Graph::TF_Graph()
    : graph(tensorflow::OpRegistry::Global()),
      refiner(graph.versions().producer(), graph.op_registry()),
      delete_requested(false),
      parent(nullptr),
      parent_inputs(nullptr) {
  // Tell the shape refiner to also run shape inference on functions.
  refiner.set_function_library_for_shape_inference(&graph.flib_def());
}
 
TF_Graph* TF_NewGraph() { return new TF_Graph; }

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

TensorFlow op和op kernel的注册

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

本文链接地址: TensorFlow op和op kernel的注册


回目录

生成ops的定义

TensorFlow Library在加载的时候,其中so里面的静态变量会实例化。
以AddN这个op为例,在文件math_ops.cc里面的REGISTER_OP(“AddN”)其实是个静态变量定义:

REGISTER_OP("AddN")
    .Input("inputs: N * T")
    .Output("sum: T")
    .Attr("N: int >= 1")
    .Attr("T: {numbertype, variant}")
    .SetIsCommutative()
    .SetIsAggregate()
    .SetShapeFn([](InferenceContext* c) {
      ShapeHandle cur = c->input(c->num_inputs() - 1);
      ............
    });

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

基于tensorflow c lib调试的主程序

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

本文链接地址: 基于tensorflow c lib调试的主程序


回目录

主程序明细

下面贴上示例代码,程序完成:kone + ktwo = kthree, A + ktwo = plus2, plus2 + B = plusB, plusB + kthree = plusC。

//============================================================================
// Name        : TensorflowTest.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
 
#include <iostream>
#include <tensorflow/c/c_api.h>
#include <tensorflow/c/c_test_util.h>
 
#include <algorithm>
#include <cstddef>
#include <iterator>
#include <memory>
#include <vector>
#include <string.h>
 
using namespace std;
 
int main() {
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
	cout << "Hello from TensorFlow C library version" << TF_Version() << endl;
 
	TF_Status* s = TF_NewStatus();
	TF_Graph* graph = TF_NewGraph();
 
	// Construct the graph: A + 2 + B
	TF_Operation* a = Placeholder(graph, s, "A");
	cout << TF_Message(s);
 
	TF_Operation* b = Placeholder(graph, s, "B");
	cout << TF_Message(s);
 
	TF_Operation* one = ScalarConst(1, graph, s, "kone");
	cout << TF_Message(s);
 
	TF_Operation* two = ScalarConst(2, graph, s, "ktwo");
	cout << TF_Message(s);
 
	TF_Operation* three = Add(one, two, graph, s, "kthree");
	cout << TF_Message(s);
 
	TF_Operation* plus2 = Add(a, two, graph, s, "plus2");
	cout << TF_Message(s);
 
	TF_Operation* plusB = Add(plus2, b, graph, s, "plusB");
	cout << TF_Message(s);
 
	TF_Operation* plusC = Add(plusB, three, graph, s, "plusC");
	cout << TF_Message(s);
 
	// Setup a session and a partial run handle.  The partial run will allow
	// computation of A + 2 + B in two phases (calls to TF_SessionPRun):
	// 1. Feed A and get (A+2)
	// 2. Feed B and get (A+2)+B
	TF_SessionOptions* opts = TF_NewSessionOptions();
	TF_Session* sess = TF_NewSession(graph, opts, s);
	TF_DeleteSessionOptions(opts);
 
	TF_Output feeds[] = { TF_Output { a, 0 }, TF_Output { b, 0 } };
	TF_Output fetches[] = { TF_Output { plus2, 0 }, TF_Output { plusB, 0 }, TF_Output { plusC, 0 }  };
 
	const char* handle = nullptr;
	TF_SessionPRunSetup(sess, feeds, TF_ARRAYSIZE(feeds), fetches,
			TF_ARRAYSIZE(fetches), NULL, 0, &handle, s);
	cout << TF_Message(s);
 
	// Feed A and fetch A + 2.
	TF_Output feeds1[] = { TF_Output { a, 0 }, TF_Output { b, 0 } };
	TF_Output fetches1[] = { TF_Output { plus2, 0 }, TF_Output { plusB, 0 }, TF_Output { plusC, 0 } };
	TF_Tensor* feedValues1[] = { Int32Tensor(1), Int32Tensor(3) };
	TF_Tensor* fetchValues1[3];
	TF_SessionPRun(sess, handle, feeds1, feedValues1, 2, fetches1, fetchValues1,
			3, NULL, 0, s);
	cout << TF_Message(s);
	cout << *(static_cast<int*>(TF_TensorData(fetchValues1[0]))) << endl;
	cout << *(static_cast<int*>(TF_TensorData(fetchValues1[1]))) << endl;
	cout << *(static_cast<int*>(TF_TensorData(fetchValues1[2]))) << endl;
 
	// Clean up.
	TF_DeletePRunHandle(handle);
	TF_DeleteSession(sess, s);
	cout << TF_Message(s);
	TF_DeleteGraph(graph);
	TF_DeleteStatus(s);
	return 0;
}
 
</vector></memory></iterator></cstddef></algorithm></iostream>

继续阅读“基于tensorflow c lib调试的主程序”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TensorFlow工程创建及设置

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

本文链接地址: TensorFlow工程创建及设置


回目录

创建TensorFlow工程

创建TensorFlow工程的目的是:
1 便于我们查看TensorFlow的代码;
2 代码索引后,即使不在eclipse里面build也可以进行代码跳转,call hierarchy的查看。

设置源代码路径,排除不需要查看代码的目录。

创建TensorFlowTest工程

创建一个Linux GCC工程:

然后设置如下参数:

参数明细:
LD_LIBRARY_PATH=/data/root/tensorflowspace/libtensorflow/lib:/data/root/tensorflowspace/libtensorflow/tensorflow/bazel-bin/tensorflow/core/:/data/root/tensorflowspace/libtensorflow/tensorflow/bazel-bin/tensorflow/cc/:/data/root/tensorflowspace/libtensorflow/tensorflow/bazel-bin/tensorflow/core/kernels/:/data/root/tensorflowspace/libtensorflow/tensorflow/bazel-bin/tensorflow/c/:/data/root/tensorflowspace/libtensorflow/tensorflow/bazel-bin/tensorflow/
LIBRARY_PATH=/data/root/tensorflowspace/libtensorflow/lib

本作品采用知识共享署名 4.0 国际许可协议进行许可。