TensorFlow提供了很多种语言的前端接口,使得用户可以通过多种语言来完成模型的训练和推断。其中Python支持得最好。这也是TensorFlow之所以受欢迎的一大原因。前端多语言是怎么实现的呢?这要归功于swig包装器。
swig是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。在TensorFlow使用bazel编译时,swig会生成两个wrapper文件
pywrap_tensorflow_internal.py:对接上层Python调用
pywrap_tensorflow_internal.cc:对接底层C API调用。
pywrap_tensorflow_internal.py 模块被导入时,会加载_pywrap_tensorflow_internal.so动态链接库,它里面包含了所有运行时接口的符号。而pywrap_tensorflow_internal.cc中,则注册了一个函数符号表,实现Python接口和C接口的映射。运行时,就可以通过映射表,找到Python接口在C层的实现了。
4 tensorflow 源码结构TensorFlow源码基本也是按照框架分层来组织文件的。如下
其中core为tf的核心,它的源码结构如下
5 总结TensorFlow框架设计精巧,代码量也很大,我们可以从以下部分逐步学习
TensorFlow内核架构和源码结构。先从全局上对框架进行理解。
前后端连接的桥梁--Session,重点理解session的生命周期,并通过相关源码可以加深理解Python前端如何调用底层C实现。
TensorFlow核心对象—Graph。图graph是TensorFlow最核心的对象,基本都是围绕着它来进行的。graph的节点为算子operation,边为数据tensor。
TensorFlow图的节点 -- Operation。operation是图graph的节点,承载了计算算子。
TensorFlow图的边 -- Tensor。Tensor是图graph的边,承载了计算的数据。
TensorFlow本地运行时。
TensorFlow分布式运行时。和本地运行时有一些共用的接口,但区别也很大。
TensorFlow设备层。主要了解设备层的定义规范,以及实现。
TensorFlow队列和并行运算。
TensorFlow断点检查checkpoint,模型保存Saver,以及可视化tensorboard。这三个为TensorFlow主要的工具。