Tensorflow1架构内核和学习方法论

简介: Tensorflow1架构内核和学习方法论

概念简介

总体介绍

TensorFlow的主要作用是构建和训练复杂的机器学习模型,提供高效的并行计算能力,可视化训练过程,支持多种编程语言以及跨平台计算。这些特点使得TensorFlow成为目前炙手可热的深度学习框架之一。

TensorFlow是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库。它使用节点表示抽象的数学计算,并使用 OP 表达计算的逻辑;而边表示节点间传递的数据流, 并使用 Tensor 表达数据的表示。数据流图是一种有向无环图 (DAG),当图中的 OP 按照特定的拓扑排序依次被执行时,Tensor 在图中流动形成数据流,TensorFlow 因此而得名。

名词解释

OP,即Operation,是计算图中的一个节点,代表一个计算单元。在深度学习中,OP可以表示数据流图中的操作,如卷积、池化等。

Kernel , 是 OP 在某种硬件设备的特定实现,它负责执行 OP 的具体运算,

疑问辨析

问:Kernel,又称核函数是不是就是卷积核的意思?

答:Kernel并不等同于卷积核。在计算机视觉和深度学习中,Kernel和卷积核虽然都用于实现某种特定运算,但它们并不完全相同。

Kernel是操作(如卷积、池化等)在某种硬件设备的特定实现,它负责执行操作的具体运算。在深度学习中,每个Kernel对应一个特定的卷积核或权重矩阵。

卷积核则是卷积神经网络中的特定计算单元,它与输入数据在卷积过程中进行特定运算,用于提取输入数据的特定特征。卷积核是一个小型矩阵,它可以遍历输入数据的每个局部区域,并对这些区域进行特定的运算(如点积)。

工程构建

TensorFlow 使用 C++11 语法实现, 所以要保证安装 C++ 编译器要支持 C++11。另外TensorFlow 使用 Bazel 的构建工具, 可以将其视为更高抽象的 Make 工具。不幸的是,Bazel 使用 Java8 实现,其依赖于 JDK。 因此在安装 Bazel 之前,还得需要事先安装 1.8 及以上版本的 JDK。

代码生成

在构建 TensorFlow系统时,Bazel 或 CMake会自动生成部分源代码。理解代码生成器 的输出结果,可以加深理解系统的行为模式。

技术栈

模型类型

在TensorFlow中,可以构建单层感知器模型、多层感知器模型和卷积神经网络模型等。

单层感知器:单层感知器是最简单的神经网络形式,它只有一层神经元,用于对输入数据进行二分类或回归分析。

多层感知器:多层感知器是单层感知器的扩展,它有多层神经元,每层神经元之间相互连接,形成一个层次结构。通过训练,多层感知器可以学习复杂的模式和特征,并用于解决更复杂的分类和回归问题。

卷积网络:卷积网络是一种特殊的神经网络,特别适合处理具有网格结构的数据,如图像。它的基本单元是卷积核或过滤器,这些卷积核可以在输入数据上滑动,并对覆盖区域进行局部连接和计算。卷积网络可以进行特征提取、空间变换、边缘检测等任务,它广泛用于计算机视觉和深度学习中。

系统架构

TensorFlow的系统结构以 C  API 为界,将整个系统分为前端和后端两个子系统。

1.    前端系统:提供编程模型,负责构造计算图;

2.    后端系统:提供运行时环境,负责执行计算图。

分层架构

TensorFlow的系统设计遵循良好的分层架构,后端系统的设计和实现可以进一步分解为4层。

1.    运行时:分别提供本地模式和分布式模式,并共享大部分设计和实现;

2.    计算层:由各个 OP  的 Kernel  实现组成;在运行时,Kernel  实现执行 OP  的具

体数学运算;

3.    通信层:基于 gRPC  实现组件间的数据交换,并能够在支持 IB  网络的节点间实

现 RDMA  通信;

4.    设备层:计算设备是 OP  执行的主要载体,TensorFlow  支持多种异构的计算设备

类型。

TensorFlow 支持 Python 和 C++ 的编程接口较为完善,尤其对 Python 的 API 支持最为全面。并且,对其他编程语言的 API 支持日益完善。

图控制

在TensorFlow中,图控制包括图构建、图执行和图优化等方面。通过图控制,可以构建复杂的机器学习模型,并实现高效的并行计算和可视化训练过程。

运行机制

会话机制

TensorFlow的会话(Session)机制是用于实际执行计算图的关键部分。计算图在构建阶段定义了模型的结构和计算关系,而会话则负责在执行阶段将这些计算分配给适当的计算设备(如CPU、GPU或TPU等)并执行它们。

会话的生命周期包括会话的创建,创建计算图,扩展计算图,执行计算图,关闭会话, 销毁会话的基本过程。在前端 Python  和后端 C++  表现为两套相兼容的接口实现。

队列

队列在模型训练中扮演重要角色,后文将讲述数据加载的 Pipeline,训练模型常常使用 RandomShuffleQueue 为其准备样本数据。为了提高 IO 的吞吐率,可以使用多线程,并发地将样本数据追加到样本队列中;与此同时,训练模型的线程迭代执行 train_op 时,一次获取 batch_size 大小的批次样本数据。显而易见,队列在 Pipeline  过程中扮演了异步协调和数据交换的功能,这给 Pipeline 的设计和实现带来很大的弹性空间。

运行模型

本地模式

图操作

分布式模式

图操作

技能方法论

发现领域模型

领域模型是阅读代码最重要的一个目标,因为领域模型是系统的灵魂 所在。通过代码阅读,找到系统本质的知识,并通过自己的模式表达出来,才能真正地抓住系统的脉络,否则一切都是空谈。

例如,在阅读 TensorFlow 的 Python  实现的客户端代码时,理顺计算图的领域模型, 对于理解 TensorFlow  的编程模型,及其系统运行时的行为极其重要。

领域对象:Graph

挖掘系统架构

阅读代码犹如在大海中航行,系统架构图就是航海图。阅读代码不能没有整体的系统概念,否则收效不佳,阅读质量大大折扣。必须拥有系统思维,并明确目标。

细节是魔鬼

纠结于细节,将导致代码阅读代码的效率和质量大大折扣。例如,日志打印,解决某个 Bug  的补丁实现,某版本分支的兼容方案,某些变态需求的锤子代码实现等等。

阅读代码的一个常见的反模式就是「给代码做批注」。这是一个高耗低效,投入产出比极低的实践。一般地,越是优雅的系统,注释越少;越是复杂的系统,再多的注释也是于事无补。

适可而止

个人阅读代码的时候,函数调用栈深度绝不超过 3,然后使用抽象的思维方式思考底 层的调用。因为我发现,随着年龄的增长,曾今值得骄傲的记忆力,现在逐渐地变成自己的 短板。当我尝试追踪过深的调用栈之后,之前的阅读信息完全地消失记忆了

发现她的美

当我发现一个好的设计时,我会尝试使用类图,状态机,序列图等方式来表达设计;如果发现潜在的不足,将自己的想法补充进去,将更加完美。

形式化

当阅读代码时,有部分人习惯画程序的「流程图」。相反,我几乎从来不会画「流程图」, 因为流程图反映了太多的实现细节,而不能深刻地反映算法的本质。

我更倾向于使用「形式化」的方式来描述问题。它拥有数学的美感,简洁的表达方式, 及其高度抽象的思维,对挖掘问题本质极其关键。

例如,对于 FizzBuzzWhizz 的问题,相对于冗长的文字描述,或流程图,形式化的方式将更加简单,并富有表达力。以 3, 5, 7 为输入,形式化后描述后,可清晰地挖掘出问题的本质所在。

独乐乐,不如众乐乐

与他人分享你的经验,也许可以找到更多的启发;尤其对于熟知该领域的人沟通,如果是 Owner就更好了,肯定能得到意外的惊喜和收获。

要让别人信服你的观点,关键是要给别人带来信服的理由。分享的同时,能够帮助锻炼自己的表达能力,这需要长时间的刻意练习。

使用图表来总结知识,一方面图的表达力远远大于文字;另外,通过画图也逼迫自己能够透彻问题的本质

更新知识

我们需要常常更新既有的知识体系,尤其我们处在一个知识大爆炸的时代。我痛恨那些信守教条的信徒

专攻术业

人的精力是有限的,一个人不可能掌握住世界上所有的知识。与其在程序设计语言的 抉择上犹豫不决,不如透彻理解方法论的内在本质;与其在众多框架中悬而未决,不如付出实际,着眼于问题本身。总之,博而不精,不可不防


目录
相关文章
|
2月前
|
安全 调度 开发者
探索操作系统的心脏:现代内核架构与挑战
【10月更文挑战第7天】 本文深入探讨了现代操作系统内核的复杂性和功能性,从微观角度剖析了内核在系统运行中的核心作用及其面临的主要技术挑战。通过浅显易懂的语言解释专业概念,旨在为读者提供一个关于操作系统内核的全面视角。
49 2
|
20天前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
架构师 数据挖掘 开发者
架构师的真内核
本文旨在帮助大家深入理解技术、架构和团队领导力的本质,从而获得持续成长的方法。欢迎在文末留言,你觉得架构师需要具备的核心能力是什么?
|
1月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
1月前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
57 2
|
5月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
91 0
|
2月前
|
存储 资源调度 算法
操作系统的心脏:深入理解内核架构与机制####
【10月更文挑战第16天】 本文旨在揭开操作系统最神秘的面纱——内核,通过剖析其架构设计与关键机制,引领读者一窥究竟。在这篇探索之旅中,我们将深入浅出地讨论内核的基本构成、进程管理的智慧、内存分配的策略,以及那至关重要的系统调用接口,揭示它们是如何协同工作,支撑起现代计算机系统的高效运行。这既是一次技术的深潜,也是对“看不见的手”调控数字世界的深刻理解。 ####
54 3
|
2月前
|
架构师 数据挖掘 UED
什么才是架构师的真内核?
技术架构师是在技术领域扮演着关键角色的专业人员。他们在业务需求分析、项目实施、技术架构治理等多个环节中发挥着重要的作用。 技术架构师不仅需要具备高超的专业技能,还需要具备良好的系统思维和认知心态。他们要能在宏观层面上进行技术架构的规划和治理,同时也要在微观层面上带领团队进行业务项目的交付实施。技术架构师是技术人从最初的研发编码,到成长为技术团队的核心骨干、技术主管、高阶技术主管,甚至是技术 CTO 的关键一步,如图 10-1 所示。
382 0
|
7月前
|
存储 关系型数据库 分布式数据库
【PolarDB开源】深入PolarDB内核:探究存储计算分离架构的设计哲学
【5月更文挑战第20天】PolarDB是阿里巴巴的云原生分布式数据库,以其存储计算分离架构为核心,解决了传统数据库的扩展性和资源灵活性问题。该架构将数据存储和计算处理分开,实现高性能(通过RDMA加速数据传输)、高可用性(多副本冗余保证数据可靠性)和灵活扩展(计算资源独立扩展)。通过动态添加计算节点以应对业务流量变化,PolarDB展示了其在云时代应对复杂业务场景的能力。随着开源项目的进展,PolarDB将持续推动数据库技术发展。
239 6
|
3月前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
76 18
下一篇
DataWorks