当前位置: 首页 > news >正文

tensorflow底层架构

tensorflow底层架构

架构图

在这里插入图片描述

  1. Training libraries 和 Inference libs(训练库和推理库)
  • Training libraries:用于模型的训练过程,包括定义模型、计算梯度、更新模型权重等。这些库提供了在训练过程中所需的所有功能。
  • Inference libs:用于模型的推理过程,主要用于在训练完成后将模型应用于实际数据的预测任务。
  1. Python client 和 C++ client
  • Python client:Python 是 TensorFlow 的主要接口,用户通常通过 Python 来定义计算图、构建模型和执行操作。Python API 易于使用,适合快速开发和原型设计。
  • C++ client:C++ API 提供更高的性能,适用于高效执行深度学习模型的推理任务,特别是在需要高性能的情况下,比如在嵌入式系统或生产环境中。
  1. C API
  • C API:这是一个底层的接口,提供对 TensorFlow 核心功能的访问。C API 允许不同的客户端(如 Python 和 C++)与 TensorFlow 系统进行交互,执行各种计算任务。
  1. Distributed master 和 Dataflow executor(分布式主节点和数据流执行器)
  • Distributed master:在分布式计算中,TensorFlow 的分布式主节点负责管理不同设备上的计算任务,协调它们之间的数据传输和工作负载分配。这允许模型训练和推理能够在多台机器或多种设备上进行。
  • Dataflow executor:数据流执行器负责执行计算图中的操作。在 TensorFlow 中,计算被表示为有向无环图(DAG),每个节点代表一个操作(算子)。数据流执行器遍历图,并按顺序执行每个操作。
  1. Kernel implementations(内核实现)
  • 这一层展示了 TensorFlow 内核中不同算子的实现,包括:
    • Const:常量操作,用于在计算图中定义不变的数据。
    • Var:变量操作,用于定义可以在训练过程中更新的权重或参数。
    • MatMul:矩阵乘法操作,广泛用于神经网络的前向和后向传播计算中。
    • Conv2D:二维卷积操作,是卷积神经网络(CNN)中的核心操作。
    • ReLU:激活函数操作(Rectified Linear Unit),用于引入非线性。
    • Queue:队列操作,通常用于管理输入数据的流动。
  • 这些内核实现表示了 TensorFlow 中执行的实际操作,是核心的计算组件。
  1. Networking layer(网络层)
  • RPCRDMA:这些是远程过程调用(Remote Procedure Call)和远程直接内存访问(Remote Direct Memory Access)技术,主要用于在分布式系统中进行高效的网络通信。它们使得不同的设备或机器之间可以快速传递数据和操作指令。
  1. Device layer(设备层)
  • CPUGPU:这是计算设备层。TensorFlow 的架构支持在多种硬件上执行计算,最常见的设备是 CPU 和 GPU。GPU 因为其高度并行计算的能力,通常被用于加速深度学习模型的训练和推理。
  • TensorFlow 可以根据操作的类型和数据的大小自动选择适当的设备进行计算,以提高效率。

总结

TensorFlow 的架构分为多个层次,从上层的 Python 和 C++ 客户端到底层的设备管理和分布式计算。上层提供了用户友好的 API,用于定义和执行计算图;中层处理数据流的执行和分布式计算;底层则负责与硬件设备的交互,确保计算任务能够高效地在不同设备上执行。这种分层结构使得 TensorFlow 既能方便用户使用,也能够高效处理大规模的深度学习任务。


计算流程

Tensorflow 实际运行的时候会先将 python 代码定义的网络结构解析为一个有向无环的计算图,通过这个计算图再调度计算资源运行模型。

计算图是包含一组 tf.Operation 对象(表示计算单元)和 tf.Tensor 对象(表示在运算之间流动的数据单元)的数据结构。**计算图在 tf.Graph 上下文中定义。由于这些计算图是数据结构,无需原始 Python 代码即可保存、运行和恢复它们。

算子(Operation 或 Op) 是计算图中的基本单位,负责执行特定的操作。每个算子会在计算图的节点上执行特定的数学计算或数据操作,诸如加法、矩阵乘法、卷积等。张量(Tensor)在算子之间传递,最终构成完整的计算流程 。

TF白皮书对内置op的分类总结如下:

在这里插入图片描述

张量(Tensor) 是一种多维数组,是机器学习和深度学习中表示数据的基本单位。张量可以有不同的维度,用于存储标量、向量、矩阵或更高维度的数据。在 TensorFlow 和其他深度学习框架中,所有的数据和操作都是基于张量进行的。

计算图示例

在这里插入图片描述

这个计算图中的每一个节点,除了输入和输出节点外,每个中间的节点都代表对张量 (Tensor) 的一个操作。从 checkpoint 目录下的 graph.pbtxt 文件中,我们可以找到每一个节点的结构,例如一个矩阵乘法的节点:

node {name: "dnn/dense/MatMul"op: "MatMul"input: "dnn/input_layer/Reshape_143"input: "dense/kernel/read"attr {key: "T"value {type: DT_FLOAT}}...}

我们可以看到每个节点有几个域:name、op、input、attr,其中 name、input、attr 都很容易理解,分别是节点的名字、输入 tensor 以及节点的额外属性,op ——算子(Operator),是张量操作的具体实现。

内核调用的实际流程:(以 MatMul 为例,假设在 GPU 上执行)

1.Python 代码调用 tf.matmul: 当调用 tf.matmul(A, B) 时,TensorFlow 会在计算图中创建一个 MatMul 节点。

2.构建计算图: TensorFlow 将 MatMul 节点添加到计算图中,并记录该节点的 op 为 MatMul,输入为张量 A 和 B。

3.编译计算图: TensorFlow 会编译计算图,在编译过程中,识别到 MatMul 节点需要调用矩阵乘法的内核。

4.内核选择: TensorFlow 查询内核注册表,找到与 MatMul 操作相关联的 CUDA 内核(如果是在 GPU 上运行)。

5.调用内核: TensorFlow 将 A 和 B 的数据传递给 CUDA 矩阵乘法内核(如 cublasSgemm 或 cublasDgemm,根据数据类型选择),并在 GPU 上执行实际的矩阵乘法计算。

6.结果返回: 内核执行完成后,结果张量被返回,并传递给计算图中的下一个节点。

计算图中其他节点详情

主图中展示了模型的主要层和计算操作,它们构成了模型的核心。

  • flattenflatten_1
    • 这两个节点表示神经网络中的 “flatten” 操作,它将输入数据展平(例如,将多维张量变为一维)。这些操作通常是连接全连接层(Dense 层)前的必要步骤。
  • densedense_1dense_2dense_3
    • 这些节点表示全连接层(Dense layer),是神经网络中的关键层之一。它们执行线性变换并加上偏置项,通常后接激活函数。这些层中的参数会在训练过程中更新。
  • dropoutdropout_1
    • Dropout 层用于正则化神经网络,以防止过拟合。它随机丢弃一部分神经元,确保模型不会过度依赖某些特定的特征。
  • metrics 和 metrics_1
    • 这些节点表示模型的评估指标,例如准确率(accuracy)或损失值(loss)。这些指标通常用于在训练或评估模型时进行模型性能的评估。
  • loss 和 loss_1
    • 这些是损失函数节点,计算预测输出与真实标签之间的误差。这些误差被用于更新模型的参数。
  • 数据流箭头
    • 箭头表示数据的流动。每个节点的输出成为下一个节点的输入。节点之间的连接说明了神经网络层之间的顺序和依赖关系。
  • Const(常量)
    • 这个节点表示一个常量值,它通常不会在训练过程中改变,而是作为输入或参数传递给网络的其他节点。

Auxiliary Nodes(辅助节点)

辅助节点表示一些与训练和计算相关的操作,但它们不直接参与模型的前向传播或预测中。

  • training 和 training_1

    • 这些节点表示训练过程中的一些辅助操作。通常在训练时,模型会涉及到如优化器、参数更新、学习率调整等操作,这些操作被封装在这些训练节点中。
  • loss_1_dense_3

    • 这个节点表示与模型中的损失计算相关的操作,通常会在反向传播中使用,用于计算梯度并调整模型参数。
      计算图中的细节展示

在这里插入图片描述
在这里插入图片描述


Reference:

  1. https://kirivir.github.io/articles/2021/10/10/1633876194557.html
  2. https://www.tensorflow.org/tensorboard/graphs
  3. https://www.tensorflow.org/guide/intro_to_graphs?hl=zh-cn
  4. https://www.tensorflow.org/guide/intro_to_graphs
  5. https://www.tensorflow.org/api_docs/python/tf/add
  6. https://www.tensorflow.org/api_docs/python/tf/linalg/matmul
  7. https://www.tensorflow.org/api_docs/python/tf/nn/conv2d
  8. https://www.tensorflow.org/guide/tensor
  9. https://www.tensorflow.org/api_docs/python/tf/Tensor
  10. https://www.deeplearning.ai/

相关文章:

  • 恢复丢失的数据:恢复数据库网络解决方案
  • 水平分库分表的方法策略
  • Android开发小贴士
  • 高级java每日一道面试题-2024年9月26日-运维篇[分布式篇]-如何保证每个服务器的时间都是同步的?
  • 【网络安全】网络基础第一阶段——第三节:网络协议基础---- VLAN、Trunk与三层交换技术
  • 【WPF】多屏幕展示
  • 【QGIS】软件下载安装及GIS4WRF插件使用
  • 百度amis框架经验分享
  • 第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
  • 给子组件传递dom元素引用实例方案
  • OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面
  • Docker部署MongoDB教程
  • Spring 事务管理-AOP
  • python学习-13【网络编程】
  • SBB Usage Parameters
  • [case10]使用RSQL实现端到端的动态查询
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • C# 免费离线人脸识别 2.0 Demo
  • iOS编译提示和导航提示
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • php ci框架整合银盛支付
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 创建一个Struts2项目maven 方式
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从0实现一个tiny react(三)生命周期
  • 构建工具 - 收藏集 - 掘金
  • 老板让我十分钟上手nx-admin
  • 你真的知道 == 和 equals 的区别吗?
  • 数据科学 第 3 章 11 字符串处理
  • ​configparser --- 配置文件解析器​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #宝哥教你#查看jquery绑定的事件函数
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (不用互三)AI绘画工具应该如何选择
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (七)理解angular中的module和injector,即依赖注入
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原)本想说脏话,奈何已放下
  • (转)shell调试方法
  • (转)项目管理杂谈-我所期望的新人
  • (转)重识new
  • (转载)虚函数剖析
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . Flume面试题
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 回调、接口回调、 委托
  • .netcore 获取appsettings