一、前言
之前操练了一些tensorflow的程序,现在想研究一下tensorflow的内核和源码。由于自身水平不足,看了之后理解的不一定深入,希望记录下重点和自身感悟,以便后续查阅。
tensorflow内核分析系列参考的是刘光聪先生所著的《TensorFlow内核分析》,云盘获取地址和提取码如下:
链接:https://pan.baidu.com/s/1392B293ayUxuBDzckEqFaQ
提取码:2z5p
二、tensorflow源码结构
./tensorflow
|---- c
|---- cc
|---- compiler
|---- contrib
|---- core
|---- docs_src
|---- examples
|---- g3doc
|---- go
|---- java
|---- python
|---- stream_executor
|---- tools
|---- user_ops
截止1.4版本,tensorflow代码库拥有大约100万行代码。其中,包括53万行C/C++代码,37万行python代码,而且代码规模在不断膨胀之中。其中,python提供的API是最完善的;相比之下,其他编程语言的API尚未成熟,甚至处于起步阶段。
2.1 Core
内核的源码结构如下所示。主要包括平台,实用函数库,基础框架,protobuf定义,本地运行时,分布式运行时,图操作,OP定义,以及kernel实现等组成。core主要有C++实现,大约拥有26万行代码。
./tensorflow/core
|---- commen_runtime
|---- debug
|---- distributed_runtime
|---- example
|---- framework
|---- graph
|---- grappler
|---- kernels
|---- lib
|---- ops
|---- platform
|---- profiler
|---- protobuf
|---- public
|---- user_ops
|---- util
2.2 python
python定义和实现了tensorflow的编程模型,并对外开放API供程序员使用,其源代码结构如下所示。该组件由python实现,大约有18万行代码
./tensorflow/python
|---- client
|---- debug
|---- estimator
|---- feature_column
|---- framework
|---- grappler
|---- kernel_tests
|---- layers
|---- lib
|---- ops
|---- platform
|---- profiler
|---- saved_model
|---- summary
|---- tools
|---- training
|---- user_ops
|---- util
2.3 contrib
contrib是第三方贡献的编程库,它也是tensorflow标准化之前的实验性编程接口。由于tensorflow社区相当活跃,contrib的变更相当频繁,截止1.4版本,大约有23万行代码,主要有python设计和实现的编程接口,部分运行时由C++实现。
./tensorflow/contrib
|---- android
|---- batching
|---- bayesflow
|---- benchmark_tools
|---- boosted_trees
|---- cloud
|---- cluster_resolver
|---- cmake
|---- compiler
|---- copy_graph
|---- crf
|---- cudnn_rnn
|---- data
|---- decision_trees
|---- deprecated
|---- distributions
|---- eager
|---- factorization
|---- ffmpeg
|---- framework
|---- fused_conv
|---- gdr
|---- graph_editor
|---- grid_rnn
|---- hooks
|---- hvx
|---- image
|---- imerative
|---- input_pipeline
|---- integrate
|---- keras
|---- kernel_methods
|---- labeled_tensor
|---- layers
|---- learn
|---- legacy_seq2seq
|---- linalg
|---- linear_optimizer
|---- lookup
|---- losses
|---- makefile
|---- memory_stats
|---- meta_graph_transform
|---- metrics
|---- mpi
|---- nccl
|---- ndlstm
|---- nearest_neighbor
|---- nn
|---- opt
|---- pi_examples
|---- predictor
|---- quantization
|---- reduce_slice_ops
|---- remote_fused_graph
|---- resampler
|---- rnn
|---- saved_model
|---- seq2seq
|---- session_bundle
|---- signal
|---- slim
|---- solvers
|---- sparsemax
|---- specs
|---- staging
|---- stat_summarizer
|---- stateless
|---- tensor_forest
|---- tensorboard
|---- testing
|---- text
|---- tfprof
|---- timeseries
|---- tpu
|---- training
|---- util
|---- verbs
|---- xla_tf_graph
2.4 StreamExecutor
StreamExecutor 是Google另一个开源组件库,它提供了主机端的编程模型和运行时环境,实现了CUDA和OpenCL的同一封装,使得在主机端的代码中,可以将Kernel函数无缝的部署在CUDA或OpenCLass的计算设备上执行。
./tensorflow/stream_executor
|---- cuda
|---- host
|---- lib
|---- platform