《深入了解TensorFlow》笔记——Chapter 1th TensorFlow概述

TensorFlow 优势

  1. 运算性能高。TensorFlow1.0加入线性代数编译器XLA,它可以帮助TensorFlow在CPU, GPU, TPU, 以及嵌入式设备等平台上更快速地运行机器学习模型。TensorFlow提供了大量针对不同软硬件环境的优化配置参数。
  2. 通用化框架。TensorFlow最初用于机器学习和深度神经网络方面的研究。但是其灵活的设计也可用于其他领域。同时TensorFlow提供high level wrapper:Slim, Keras, TF Layers等,也提供底层原生API,可以实现更灵活且高效的分布式并行模式。
  3. 支持生产环境部署。注,这一点不太能够体会到。
  4. 语言接口丰富。TensorFlow核心层由C++实现,应用层使用SWIG等技术封装,提供了多语言API支持:Python, C, C++, Java, Go等。同时还有非官方的语言支持:Node.js, Julia, R。
  5. 端云协同计算。TensorFlow同时支持云侧和端侧运行。在云侧,它提供多种并行模式和编译优化等技术,以提升算法模型的运算性能。在端侧,他提供轻量级部署和8bit压缩等技术,以提升计算和存储资源利用效率。

TensorFlow发展历程

2017年2月,Google发布了TensorFlow 1.0.0,该版本标志着TF已经初步成熟并支持生产环境部署。TF 1.0.0作为第一个正式版本,加入了许多关键特性:

  1. 线性代数编译器XLA,一定程度上解决了内存消耗大、计算速度慢的问题;
  2. 命令行调测工具TF Debugger,初步解决了算法模型调测困难的问题;
  3. Android支持,能够将TF模型部署到移动设备上;

2017年4月,TensorFlow 1.1.0整合了Keras 2到tf.contrib.keras,Keras是一套类似于TF Slim的high level wrapper。但是Keras不能实现所有TF功能,例如分布式运行、灵活的计算模式等,需要利用TF原生API实现。

2017年7月,TensorFlow 1.2.0加入了RDMA支持,有效解决了大规模分布式训练的通信瓶颈。相较于TCP/IP通信,RDMA能够减少一半的网络通信开销。

2017年8月,TensorFlow1.3.0允许用户使用新增的Estimator库,以开箱即用的方式快速实现了深度神经网络分类器深度神经网络回归器线性分类器、以及深度神经网络和线性混合分类器。同时,默认使用cuDNN6,进一步提升了GPU上的运算性能。

2017年11月,TensorFlow 1.4.0新增了tf.data模块,为数据读入和处理提供了便捷高效的解决方案。同时,增强了Estimator的能力,使其能够支持简单的分布式模型训练和评估。

以上都是《深入了解TensorFlow》中的TF发展例程,到今天我写此Blog时,Google已经推出了TensorFlow 2.5.0,TF v2的编程范式相较于v1有了较大的变化,但是由于我看的一些论文源码还是基于TF v1,因此重新拜读此书,以方便理解old paper’s code。想深入了解TF v2的同志,可以参考《Learn TensorFlow 2.0: Implement Machine Learning and Deep Learning Models with Python》。

TensorFlow设计目标

TensorFlow的设计目标并非局限于一套深度学习库,而是面向多种应用场景和编程范式、支持异构计算平台、具有优异性能和可伸缩性的通用AI Engine。

灵活通用

  1. 算子(Operator)定义。TF提供的算子粒度更细,数量更多,能够支撑上层灵活多变的算法和模型。很多Traditional ML method也可以基于TF实现,如SVM, DT,RF等。TF对于新算子的支持也足够灵活,允许用户通过组合已有operators来构造new operator。此外,可以使用C++和CUDA等底层函数库实现新的算子并在Runtime动态加载使用,以满足专用算法需求并保持高效率。
  2. 编程范式。TF支持声明式编程,将模型的定义和执行解耦。模型以数据流图结构表示,经过编译和优化之后才会执行。以数据流图抽象为核心的设计在保证模型执行效率的同时,使得编程更加灵活。例如:通过添加控制依赖边(?)来制定算子执行顺序;通过添加自定义变量管理数据流图的输入输出;通过队列控制多设备间的数据传输和子图执行时序;
  3. Runtime框架。TF在具备隐式并行计算能力的同时,还提供细粒度显式控制接口,允许灵活地控制模型在多节点易购设备商分布式执行。用户在编写DL Model时,可以自由将模型中的每个算子绑定到任意的计算设备上。TF Runtime负责将模型对应的数据流图按照设备进行切分,并自动插入必要的通信操作。
  4. 多语言支持。之前已经提到,这里不做赘述。

云端结合

云计算和大数据技术以集约化的资源管理、动态弹性的资源供给,为持续膨胀的应用提供了高水平、可伸缩的算力,同时降低了服务提供者的准入门槛。因此,传统服务器端软件必须适用云化部署场景,以水平扩展、无状态、微服务等方式构建高内聚、低耦合的系统架构。

随着以智能手机为代表的移动终端的高速普及,以及IOT,ROBOT等智能化技术的不断渗透,用户对于data privacy and security逐渐重视,应用场景对于服务的实时性和可用性要求愈发严苛。

在这些背景下,算力边缘化和云化同样重要的。因此,提供服务的软件需要适应体系结构多样、计算资源有限,功耗受到制约的终端硬件环境,并具有一定的自治和协作能力。
TensorFlow在云侧的优势主要体现在:

  1. 提供多种标准化installler, construct scripts and container,支持在不同Linux发行版(Ubuntu, RedHat, Centos等)以及Windows Server等操作系统上部署。既允许以二进制包方式快速安装,也允许对特定环境编译安装。
  2. 支持对接多种常用的公有云和私有云服务,并为对接其他类似服务预留可扩展设计。
  3. 兼容常见的高性能计算和通信硬件,能够有效利用云环境的既有投资并提升应用软件对高端硬件资源的利用率。支持NVIDIA GPU,cuDNN,支持RDMA网络协议,能够充分发挥InfiniBand等高速网络设备的带宽潜力。

TensorFlow在端侧的优势主要体现在:

  1. 推理态代码能够运行于多种主流终端平台,包括Android, iOS, ARM Linux等等,为形态多样的终端设备提供AI认知和决策能力支持。
  2. 通过XLA AOT(ahead-of-time)编译技术及其他软硬件解耦技术,显著地简化底层异构计算设备的对接方式,实现对神经网络芯片等新型ASIC硬件的快速支持能力。
  3. 提供量化参数和低精度代数等算法层即使,适配算力、存储和功能受限终端,从而实现低端边缘设备的智能化。
  4. 提供模型和框架一体化的精简版Runtime(?),具备完全的OFFLINE能力,有助于实现端侧计算的私密性和实时性。

高性能

硬件设计者正在广泛采纳新型器件、三维电路、应用定制、众核并行等多元化思路满足应用不断增长的算力需求,这位软件开发者提供了机会以及挑战。如何将软件架构和算法有效适配到硬件体系结构、充分利用硬件资源发挥其设计性能,称为基础平台层软件开发者所面临的重要问题。

TF的高性能设计首先体现在他对高端和ASIC的深入支持。TF将英伟达显卡作为训练态的硬件加速器,同时兼顾OPENCL GPU设备。Google工程师基于CUDA Driver API实现了控制细粒度更细、并行性能更优的StreamExecutor异构计算库,并对cuBLAS、cuDNN等库的函数变种进行了精确适配。在推理态上,TF的开放性设计已经促使多家芯片厂家实现了对接,这为智能化定制设备提供了保障。据我所者,HUAWEI的Ascend芯片,也是支持TensorFlow的,同时他们自行开发的MindSpore框架和TensorFlow也比较相似。针对高性能计算环境中常用的InfiniBand, RoCE等高速网络设备,以及NVLink等片间高速互联技术,TF引入了RDMA、NCCL等协议,较好地解决了多终端通信时延问题,推进了分布式计算作业。

系统层的优化技术是TF性能提升的重要来源。XLA这种融合了编译器设计理论的优化框架就是非常典型的例子。它引入JIT编译机制,能够在数据流图运行过程中实时创建二进制代码,将其中大量细粒度操作抽象为少量粗粒度的专用核函数,从而减少图中operations执行时的内存分配和上下文切换开销,极大地提升了计算速度。(注,一般利用GPU运行CUDA代码时会存在上下文启动,但是上下文切换是什么?)

算法层的优化设计也是TF高性能不可或缺的组成部分。TF采用自顶向下,全栈优化的思路,而operator便是贯穿上下层的核心要素。在DL model中,the logic of each operator都可以采用多种方式实现。为此,TF内置了多种优化后的基础算子和模型组件。以图像领域最常见的卷积算子,cuDNN提供了Winograd等8中算法。针对不同的输入数据大小,卷积计算超参数以及内存等资源限制,TF会为每个卷积操作选择最快的实现方案。针对RNN等模型,TF也支持Fold解决方案,是的动态批处理成为可能,极大提高了模型的计算速度。

基本架构

工作形态

在众多平台设计模式中,存在两类基础模式库模式框架模式

  1. 库模式
    平台层软件以静态或动态的开发库形式存在(Linux系统即.a & .so文件)。应用层开发者需要编写程序调用这些库提供的API。典型的库模式如:Eigen, Numpy,MPI,ZereMQ等。基于这些库开发应用时,编程方式比较灵活,部署模式轻量化。
  2. 框架模式
    平台层软件以可执行文件的形式存在,并以前端交互式程序或者后端守护进程方式独立运行。应用层开发者需遵守从平台规定的接口约束,开发包含计算逻辑在内的子程序,交由平台层软件调度执行。程序的入口以及整体流程控制权由框架把握。典型的框架模式如:Hadoop, Spark, 基于SQL的数据库等。开发者工作相对轻松,只需要编写与业务逻辑密切相关的算法代码,不用关心Runtime机制的复杂性。

TensorFlow是采用的库模式,以便于与各种既有的框架协同工作,不对软件的Runtime组件添加新的约束,应用范围不受制约。除了依赖最基本的编程语言库和操作系统调用之外,TF可以和其他环境因素解耦,从而实现高度可移植性。

基本框架

TensorFlow框架构成TensorFlow的主体是Runtime核心库,即动态链接库文件。该核心库包括三个层次:分布式Runtime,公共Runtime和算子核函数。

公共Runtime:实现数据流图计算的基本逻辑;
分布式Runtime:在公共Runtime基础上,实现数据流图跨进程协同计算逻辑;
算子核函数:数据流图上具体Operations的代码实现。

TensorFlow核心库底层是各种计算库和通信库。这些库有的是外部组件(如Eigen),有的是作为源码集成在TF中(如StreamExecutor)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dongz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值