本文参考源码来自于https://www.tensorflow.org/install/source
Tensorflow整体架构:
下载Tensorflow源码:
git clone https://github.com/tensorflow/tensorflow.git
下载完成后,可以看到,tensorflow目录结构如下:
caozilong@AwExdroid112:~/tensorflow$ tree -L 2 -d
.
├── tensorflow
│ ├── c
│ ├── cc
│ ├── compiler
│ ├── core
│ ├── distribute
│ ├── docs_src
│ ├── examples
│ ├── go
│ ├── java
│ ├── js
│ ├── lite
│ ├── python
│ ├── security
│ ├── stream_executor
│ └── tools
├── third_party
│ ├── absl
│ ├── android
│ ├── aws
│ ├── benchmark
│ ├── boringssl
│ ├── clang_toolchain
│ ├── clog
│ ├── compute_library
│ ├── cpuinfo
│ ├── dlpack
│ ├── eigen3
│ ├── farmhash
│ ├── fft2d
│ ├── flatbuffers
│ ├── FP16
│ ├── gemmlowp
│ ├── git
│ ├── googleapis
│ ├── gpus
│ ├── grpc
│ ├── hadoop
│ ├── hexagon
│ ├── highwayhash
│ ├── hwloc
│ ├── icu
│ ├── jpeg
│ ├── kissfft
│ ├── llvm
│ ├── llvm_openmp
│ ├── mkl
│ ├── mkl_dnn
│ ├── mlir
│ ├── mpi
│ ├── nasm
│ ├── nccl
│ ├── opencl_headers
│ ├── pasta
│ ├── protobuf
│ ├── psimd
│ ├── py
│ ├── python_runtime
│ ├── remote_config
│ ├── ruy
│ ├── sobol_data
│ ├── systemlibs
│ ├── tensorrt
│ ├── tf_runtime
│ └── vulkan_headers
└── tools
66 directories
caozilong@AwExdroid112:~/tensorflow$
算子实现集中分布在tensorflow/tensorflow/lite/kernels目录下:
caozilong@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$ ls -l |grep test|wc -l
139
caozilong@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$ ls -l |wc -l
298
caozilong@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$
基本上,每个算子的实现都是一个独立文件,并且对应一个测试文件,基于这个假设(和实际相符),我们可以粗略统计一下算子的个数,就是
文件总数-test文件总数=298-139 = 159,也就是大概有160个算子,是否可以理解为160个算子基本能够满足所有网络的需求呢?我认为当前是的,基于的考虑是TF是一个比较全面的框架,至于未来则不一定,随着新的理论,论文,新的算法的进步,会有新的算法,新的算子出现,所以框架实现的算子也会发展,变化.
以常用的conv算子为例,简单分析一下它的实现:
对应的真正实现在 optimized_ops命名空间中的Conv函数,它在另一个文件中,我们找到它, 万恶的矩阵乘法,一眼能看明白的,肯定是数学系毕业的大佬。
补充:关于算子的个数,听芯原的一位大佬讲,当前它们实现了有130个算子,算子的增长比较缓慢,除非有新的论文,出现新的算法,但这个速度是很慢的,虽然比tensorflow的160多个少一些,但并不意味着VIP有缺失的算子,根据他的说法,VIP的算子建立在比tensorflow kernel更加抽象的层面上的,所以有的算子可以当多个算子用.基本上130多个已经很全了.