文章目录

  • 一、XLA简介
  • 二、XLA在TensorFlow中的应用
    • 2.1 XLA是什么?(tensorflow\compiler\xla)
    • 2.2 TensorFlow怎样转化为XLA (tensorflow\compiler\tf2xla)
    • 2.3 JIT(just in time) 即时编译 (tensorflow\compiler\jit)
      • 2.3.1开启jit编译
      • 2.3.2自动聚类
      • 2.3.3jit实例
    • 2.4 AOT (Ahead-of-time compilation)超前编译
  • 三、总结

一、XLA简介

XLA(Accelerated Linear Algebra)-加速线性代数,是Google推出的高性能机器学习领域编译器,它可以在不更改源代码的条件下加速Tensorflow模型。TensorFlow在设计时主要考虑灵活性和可拓展性,而灵活性往往和高性能不可兼得,因此TensorFlow的计算性能有所欠缺。而机器学习的运算中99%都是向量乘以矩阵、矩阵乘以矩阵的计算,XLA是专门用来优化这些计算的。

举个例子,运行在GPU上的model_fn函数会顺序调用multiply、add和reduce_sum这三个op,而且multiply,也就是y * z的计算结果会先从GPU拷贝回host,再拷贝到device作为add的input,同样的,add的计算结果也会以相同的方式传递给下一个op。

def model_fn(x, y, z):return tf.reduce_sum(x + y * z)

显然,对于整个函数来说,将中间变量在host和device间来回倒腾是没有意义的。因此,如果把函数看作一个op,那在计算中产生的中间结果就不必返回到host,少了数据传输的时间开销,就可以大幅提升运算效率。

这种将多个op融合成一个op的方法就称为fuse,当前fuse的技术路线有:

  • 通过手写或codegen工具来开发fused op,例如在上述例子中就可以开发tf.fused_reduce_sum(x, y, z)。它的优点是代码可控性高,易于性能优化,但缺点是程序缺乏灵活性。像Pytorch这种动态图的框架走的就是这条路线,Nvidia的Apex提供有大量fused kernel。
  • 通过XLA等AI编译器将python函数编译成fused op。这样做的好处是灵活性强,可以fuse任何计算,弊端则是开发难度大,且性能通常会逊色于手写或codegen kernel。
    编译器一般构成
    XLA是AI编译器,只要是编译器就逃脱不了几大构成:

传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd). 在编译过程中,编译器一般构成
XLA是AI编译器,只要是编译器就逃脱不了几大构成:

传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd). 在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。

二、XLA在TensorFlow中的应用

2.1 XLA是什么?(tensorflow\compiler\xla)

现代编译器核心离不开IR(Intermediate Representation),编译过程是将高级语言不断进行变换最终变成机器可以运行的机器指令,整个过程是一个复杂的过程。为了简化编译器架构,复用核心算法,大部分编译器都引入了IR。

上图(图1)演示了XLA Graph 到最终的机器代码生成。

XLA Graph :节点和边缘组成,其中节点是线性代数操作,边缘是数据流,比如tensors。
XLA Graph从线性代数降低到编译的形式,到达LLVM IR ,这种中间表示形态。
然后进行code generator生成实际的机器平台代码。
这张图最重要的是我们将信息输入到XLA图表,然后得到我们的机器代码。

2.2 TensorFlow怎样转化为XLA (tensorflow\compiler\tf2xla)

根据源代码的位置和标题,顾名思义,就是从TensorFlow到XLA。

首先看一下TensorFlow是什么。从下图(图2)可以看出,首先,我们用不同的编程语言来构建TensorFlow项目,python是用的最多的,但是其他语言也是支持的(c++需要先编译)。然后,我们在构建程序的时候,就是要构建图中中间蓝色线框的图表,也就是TensorFlow Graph,所有的tensor都会经过它。最后,对于这张图表,会有底层的C++实际执行的运行时间。如红色框图所示,里边有两个部件,一个是执行器,另一个是内核。执行器的目的是执行TensorFlow Graph,当他遇到每个节点时候,它会查询内核然后找到合适的内核并运行。

例如,如下图(图3)所示。遇到add 、softmax节点,查询内核然后运行。这就是TensorFlow的运行方式。并不需要XLA。

接下来将了解TensorFlow如何以XLA程序运行(怎么转化?)。如下图(图4)所示,红色线框表示我们的TensorFlow Graph,我们的目的是生成蓝色线框的XLA Graph。正如第一张图(图1)所示,只要我们将信息转化为XLA Graph 这种表达方式,XLA就会处理剩下的事情,将信息编译成机器代码。在图中(图4)有一个局部执行器,和普通的TensorFlow runtime中的是一样的。但是在这里边不使用TensorFlow的内核,而是换成了XLA的核心程序(粉色线框)。这个核心程序的工作不是执行操作,而是创建图表,将TensorFlow Graph 转换为 XLA Graph。(/tf2xla/kernels)

转换过程如下图所示(图5),例如,在TensorFlow Graph中,遇到了add节点,然后查询核心转换程序,可以将TensorFlow add 转换为 XLA add,下图展示的是比较简单的一对一呈现。

而对于比较复杂的运算,比如softmax操作,内部存在一系列的运算,查看转换核心程序之后,将其转换为XLA图表中的多重运算,如下图(图6)所示。

那么问题就来了,我们应该怎么在TensorFlow中使用XLA进行加速呢?

2.3 JIT(just in time) 即时编译 (tensorflow\compiler\jit)

个人理解就是,在TensorFlow Graph中,将可以转换的节点进行转换,对于可以排序的多个节点,识别定义为cluster(簇、集群),然后进行编译和运行。

如下图(图7)所示,梯形框中的三个节点都可以被转换为XLA,经过转换之后,就变成了右边的XLA Graph,未经过转换的node(节点)按照TensorFlow方式正常运算,而可以转换的簇经过转换之后(变成了XLA graph)可以直接编译和运行,变成实际的机器代码。并且,以后遇到相同类型的,不需要重复编译,就可以一次一次地执行。

同样的,如果存在多个clusters。如下图(图8)所示,存在多个集群,当TensorFlow执行器运行时,识别出来该集群可以进行转换就会转换为xla graph,然后对下图中的多个集群进行编译并且执行。

2.3.1开启jit编译

第一种方式:全局模式

首先读取整个TensorFlow Graph,然后决定图表中的哪些集群实际上可以编译,最后重写Graph。当具体执行时候,每遇到节点,就会启动JIT,编译成机器代码。自动进行。

第二种方式:手动范围
可以手动控制设置明确什么被编译,什么不被编译。如下图所示,仅仅add 算子被编译。

2.3.2自动聚类

若要在 TensorFlow 模型中开始使用 XLA 并且无需做出任何更改,最简单的方法是启用“自动聚类”,此功能会自动在可以使用 XLA 进行编译和执行的 TensorFlow 函数中查找聚类(连通的子图)。您可以通过设置 TF_XLA_FLAGS 环境变量,在 GPU 上启用自动聚类功能:

$ TF_XLA_FLAGS=–tf_xla_auto_jit=2 path/to/your/tf/program
自动聚类目前已针对 GPU 工作负载进行了优化,但您也可以通过另外使用 --tf_xla_cpu_global_jit 标记在 CPU 上启用它:

$ TF_XLA_FLAGS=“–tf_xla_auto_jit=2 --tf_xla_cpu_global_jit” path/to/your/program

但是自动聚类的方式容易出现波动,不一定出现好的优化效果,建议使用更加清晰的模式,@tf.function(jit_compile=True)。
TensorFlow中大约1500多个OP,不是每个op都可以被编译,当遇到不可编译的OP时,会报错并建议重构代码。

其次,编译要求是静态的,如果形状变动频繁,会出现重新编译的情况,带来额外的延时并导致并不能优化速度。如下图所示,
需要重新编译。此外,对于一些参数,也需要保持固定,不然也会重新编译。

2.3.3jit实例

import tensorflow as tf
import time@tf.function(jit_compile=True)
def running_example(x,y):return tf.reduce_mean(tf.multiply(x**2,3)+y)x = tf.random.uniform((15000,15000))
y = tf.random.uniform((15000,15000))options = tf.profiler.experimental.ProfilerOptions(host_tracer_level = 2,python_tracer_level = 0,device_tracer_level = 1)
with tf.profiler.experimental.Profile('logdir_jit',options=options):print(running_example(x,y))

不加入jit的timeline。从图中可以看出有四个算子,总时间为520ms。


加入jit之后,只有一个总得计算过程,时间消耗 250ms。 大大减小了时间消耗。

2.4 AOT (Ahead-of-time compilation)超前编译

和JIT不同的是,在JIT中,当遇到没法编译的node时,自动按照TensorFlow runtime的方式正常运行,仅仅编译可以被编译的node即可。
AOT则需要将整个TensorFlow Graph 编译成为XLA Graph。进入执行阶段后,不再有编译过程发生。好处是可以直接在手机端、服务器端运行。

具体实现方式:通过tfcompile来实现。类似一个包装器。

如下图所示,给定一个TensorFlow Graph,然后给它一个配置文件,告诉它需要提供(输入)和获取(输出)什么。然后把以上东西送入tfcompile,从另一端输出机器平台运行代码。整个编译相当于一个函数,知道输入和输出。

三、总结

XLA与TensorFlow合作有几个目标:

提高执行速度。编译子图以减少短暂Ops的执行时间,以消除TensorFlow运行时间的开销,融合流水线操作以减少内存开销,并专用于已知张量形状以允许更积极的恒定传播。
改善内存使用。分析和计划内存使用情况,原则上消除许多中间存储缓冲区。
减少对自定义操作的依赖。通过改进自动融合低级Ops的性能,消除对许多自定义Ops的需求,匹配手工融合的自定义Ops的性能。
减少移动足迹。通过提前编译子图。发出可以直接链接到另一个应用程序的对象/头文件对来消除TensorFlow运行时。结果可以将移动推断的占用空间。减少几个数量级。
提高可移植性。为新颖的硬件编写新的后端程序相对容易,此时大部分TensorFlow程序。将在该硬件上未修改地运行。与专门针对新硬件的个体单片Ops的方法形成对比,需要重写TensorFlow程序以利用这些Ops。

AI编译器XLA调研相关推荐

  1. AI编译器与传统编译器的联系与区别

    AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么?. 文中提到的答主的知乎主页:@金雪锋.@杨军.@蓝色.@SunnyCase.@贝壳与知了. ...

  2. 传统编译器和DL编译器的调研和理解

    文章目录 Part One : 传统编译器 1.1 前端 1.2 中端 常见的优化 1.3 后端 指令的选择 寄存器分配 指令重排 1.4 总结 Part Two:深度学习编译器 2.1 为什么需要 ...

  3. AI编译器与TPU-MLIP

    文章目录 前言 一.AI编译器 传统编译器与AI编译器 部署深度模型 二.TPU-MLIP TPU-MLIP整体架构 以YOLOV5s的转换为例 三.MLIR上 什么是MLIR IR中间表达 Dial ...

  4. AI编译器TVM部署示例解析

    AI编译器TVM部署示例解析 AI编译器TVM(一)--一个简单的例子 概述 什么是TVM? TVM可以称为许多工具集的集合,这些工具可以组合起来使用,实现一些神经网络的加速和部署功能.这也是为什么叫 ...

  5. 希姆计算:基于 TVM 的 DSA AI 编译器构建

    本文首发自 HyperAI超神经微信公众号~ 大家好我是来自希姆计算的淡孝强,今天我将和三位同事一起来给大家分享如何在 TVM 上支持 NPU. DSA 编译器解决的本质问题就是不同的模型需要部署到硬 ...

  6. 2022-2028全球云AI芯片行业调研及趋势分析报告

    据恒州诚思调研统计,2021年全球云AI芯片市场规模约 亿元,2017-2021年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2028年市场规模将接近 亿元,未来六年CAGR为 % ...

  7. 工业界常用嵌入式/移动端AI计算平台调研

    引言: 神经网络模型被广泛应用在图像分类.物体检测.目标跟踪等计算机视觉任务中,并取得了巨大成功.随着时代发展,人们更加关注深度神经网络的实际应用性能,人工智能技术的一个趋势是在边缘计算平台上部署高性 ...

  8. 近20年3867篇AI论文大调研:有缺陷的指标被滥用,好的指标被忽视

    来源:AI科技评论 本文约5400字,建议阅读6分钟. 论文调查告诉你评估机器学习模型中的不足. "用于评估AI和机器学习模型的常用指标不足以反映这些模型的真实性能",来自维也纳医 ...

  9. 关于AI+医疗的调研

    人工智能+医疗定义 "人工智能+医疗"是人工智能技术(机器学习,数据挖掘为两大技术核心)对于医疗产业的赋能(降本增效,产生影响)现象 深度学习使人工智能取得新突破 深度学习模拟人脑 ...

最新文章

  1. 【转载】机器学习领域的大家
  2. 0寄存器与arm_如何在ARM下进行高效的C编程?
  3. mysql主从复制原理 简书_mysql主从复制,从原理讲到安装配置,全干货
  4. 【Linux】普通用户修改 root 权限文件,没有权限;sudo: 没有终端存在,且未指定 askpass 程序
  5. frame页面地址转向跨域解决方法
  6. 模拟器genymotion的安装与配置
  7. 通达信公式大全_通达信MACD金叉的选股公式大全
  8. ubuntu mysql 操作_Ubuntu系统下MySQL数据库基本操作
  9. 更改qt复选框大小_Qt编写控件属性设计器5-属性中文
  10. 9.【Windows】如何制作原版Win10系统盘
  11. linux 更新系统命令,Linux系统自动更新时间命令的详细说明
  12. Jmeter之Bean shell使用
  13. SQL server 数据库分离成功后,但还是压缩不了,.mdf和.ldf文件拒绝访问
  14. ftp上传工具,八款最佳的ftp上传下载工具,支持中文(ftp客户端分享)
  15. latex调行距_LaTeX 的行距机制
  16. 高斯模糊java代码_Java实现高斯模糊算法处理图像
  17. matlab均衡的算法有哪些,从Matlab到Python的算法均衡
  18. Fiddler Response中Raw显示乱码的解决方式
  19. matlab调用zlg,stm32读取ZLG7290按键键值实验源码
  20. uni-app开发多端之钉钉小程序

热门文章

  1. mysql 5.7 group replication 之五 [ERROR] Plugin group_replication reported: 'Table tmp_t0 does not hav
  2. socket常用参数解释
  3. bmob php支付,个人开发者也能盈利!Bmob支付SDK使用实例
  4. 2018+黑苹果+vs+Linux,重点更新!完美黑苹果=Z370M+i5+RX590(硬解)10.15
  5. 2000年英语一真题及答案
  6. 华为--dis查看命令
  7. FFplay文档解读-16-音频过滤器一
  8. c php 速度,CSpeed: CSpeed 框架,全堆栈的轻量级C语言PHP扩展框架,以高性能、极速为目标。...
  9. 嵌入式学习项目实战 --- 在线词典
  10. 微信小程序复用公众号资质快速认证