目录
一.参考资料
github地址: https://github.com/tensorflow/tensorflow
二.TensorFlow中使用的语言
2.1 Starlark
https://blog.bazel.build/2017/03/21/design-of-skylark.html
starlark原名叫skylark,项目地址:
https://github.com/bazelbuild/starlark
改名原因见https://github.com/google/skylark最后一行:
Skylark是Bazel项目的代号,因此Bazel团队把这门语言命名为Starlark,来反映其适用于和Bazel无关的项目。
2.2 MLIR
MLIR全称 Multi-Level Intermediate Representation
参考https://www.c4ml.org/中的MLIR Talk。
2019年2月17日
2020年
github项目地址https://github.com/tensorflow/mlir
最新进展是mlir已加入到LLVM项目中。
关于编译器IR(中间表示)的概念,参考资料:
https://blog.csdn.net/SHU15121856/article/details/104711426
https://www.sohu.com/a/191605477_473283
2.2.1 MLIR的官方介绍
https://tensorflow.google.cn/mlir/overview
MLIR受到LLVM很深的影响,并且毫不掩饰的重用了其中的很多理念。一个合并了多层抽象在一个编译单元的可扩展类型的系统,并且允许表示,分析,转换图形。这些抽象包括TensorFlow的操作,嵌套的多面循环区域,甚至LLVM指令以及固定的硬件操作和类型。
MLIR的受众:
-
指望优化机器学习模型的性能和内存消耗的编译器研究人员和开发人员。
-
正在寻找将硬件连接到TensorFlow方法的硬件制造商,如TPUs,手机中的便携神经硬件,以及其他自定义的专用大规模集成电路(ASIC)。
-
希望利用编译优化和硬件加速的语言开发人员。
2.2.2 TPU是Google研发的一款计算芯片
参考了如下两篇文章
http://www.elecfans.com/d/776906.html
https://zhuanlan.zhihu.com/p/101550272
TPU1.0仅支持推理 AlphoGo Lee
TPU2.0 训练+推理 柯杰
https://zhuanlan.zhihu.com/p/147467116
Matrix Multiply Unit
目前主要产品有TPUv1、TPUv2、TPUv3以及Edge TPU. 其中云端芯片TPUv1-v3不对外发售,仅提供相应云计算服务,Edge TPU用于边缘侧推理,对外销售相关开发套件。
Edge TPU 相关资料:https://blog.csdn.net/qq_30803353/article/details/94203076
三. TensorFlow跑分
人工智能领域日新月异,18年的跑分仅供参考。
https://blog.csdn.net/u013510838/article/details/84103503
四. TensorFlow架构
https://www.jianshu.com/p/a5574ebcdeab
OP:所谓op就是operation,“操作”的意思。在tensorflow中op不仅包括加、减、乘、除等所有计算方式,同时也包括常量定义、变量定义、占位符定义等等。例如tf.constant(),tf.add(),tf.mul()等等都是op,都要通过session运行,才能得到结果。
Client:TensorFlow通过Session为桥梁,连接Client后端的分布式Runtime,并启动计算图的执行过程。
Distributed Master:在分布式Runtime中,根据Session.run的Fetching参数,从计算图中反向遍历,找到所依赖的最小子图;再将子图分裂为多个子图片段,以便分布式运行;最后将子图片段发给Worker Service,由Worker Service启动子图片段的执行过程。
Worker Service:对于每一个任务,TensorFlow都将启动一个Worker Service。Worker Service 将按照计算图中节点之间的依赖关系,根据当前的可用的硬件环境(GPU/CPU)调用OP的Kernel完成运算。
主要实现3个方面的功能:
-
处理来自Master的请求。
-
调度OP的Kernel。尽最大可能利用多CPU/GPU的处理能力。
-
协同任务中的数据通信。
根据设备类型,对于设备间的SEND/RECV节点进行特化实现:
使用cudaMemcpyAsync的API实现本地CPU和GPU设备的数据传输。
对于 本地的GPU之间则使用端到端的DMA,避免了跨host CPU的昂贵的拷贝过程。
任务之间的数据传递,TensorFlow支持如gRPC over TCP, RDMA over Converged Ethernet。
Kernel:
其中,大多数Kernle基于Eigen::Tensor实现。Eigen::Tensor是一个使用C++模板技术,为多核CPU/GPU生成高效的并发代码。但是,TensorFlow也可以灵活地直接使用cuDNN实现更高效的Kernel。此外,TensorFlow实现了矢量化技术,使得在移动设备,及其满足高吞吐量,以数据为中心的应用需求,实现更高效的推理。如果对于复合OP的子计算过程很难表示,或执行效率低下,TensorFlow甚至支持更高效的Kernel实现的注册,其扩展性表现相当优越。