本章是系列文章的案例学习,不属于正篇,主要介绍了TensorFlow引入的XLA的优化算法。XLA也有很多局限性,XLA更多的是进行合并,但有时候如果参数特别多的场景下,也需要进行分割。XLA没有数据切分的功能。当前最主流的编译器领域的编译优化功能还是mlir。

本文中的所有内容来自学习DCC888的学习笔记或者自己理解的整理,如需转载请注明出处。周荣华@燧原科技

9.1 什么是XLA

  • XLA是Accelerated Linear Algebra的简称。

第一次看到Accelerated被简称为X的时候,有点奇怪,因为Accelerated里面可没有一个字母是X,但Accelerated的发音和X相同,这样简化之后可以避免一个简写中存在多个A的不协调,XLA读起来确实比ALA朗朗上口一点:)

  • XLA - TensorFlow, compiled. Mar. 6th, 2017
  • XLA是一种编译线性代数领域相关的编译器,主要用来加速TensorFlow的模型优化和目标代码生成
  • 除了TensorFlow外,XLA也可以用在多种前端中,包括TensorFlow,Pytorch, JAX, Julia和Nx
  • XLA的功能设计上其实与target arch无关的,所以也可以支持多种后端:CPU,GPU或者其他硬件

在2017年XLA诞生的时候,那时给出的帧处理加速数据如下:

带来相应加速效果的主要因素是通过分析和调度内存使用,删除了一些中间表达的存储缓存,其中一个主要的方法就是缓冲区指派算法,也就是本文主要准备描述的。

XLA的设计理念是一种近似SSA的中间表达:

  • 变量只能被初始化(除了初始化,不能额外修改)
  • 更短的生命周期
  • 清晰的Def-Use链

XLA: Optimizing Compiler for Machine Learning  |  TensorFlow中有个油管视频详细讲解了XLA的原理,通过这个也可以理解一下TensorFlow的原理:

tf.function → tf2xla桥 → 优化前的xla hlo → xla的一些列优化 → 优化后的hlo → 可执行binary →  tf2xla桥 → tf runtime → target arch上执行

9.2 静态内存分配分析

9.2.1 为什么可以做分析

  • 静态计算图本身的特性
  • 张量在执行阶段只会使用固定的内存空间
  • 静态计算图在执行前就可以静态推断

9.2.2 静态内存分析的优势

  • 为算子提供通用的内存分配
  • 重用前面算子的内存,减少重新分配和拷贝过程
  • 减少额外的碎片和内存管理

9.2.3 静态内存分析的局限性

  • 仅针对静态计算图有效

9.3 缓冲区管理的目标

  • 尽可能重用内存
  • 当内存不足以完成任务时报错

缓冲区定义:每个算子定义一个缓冲区

缓冲区申请、支配原则:

  • 在生命周期上不相互干扰的缓冲区可以使用相互覆盖的内存
  • 如果缓冲区和其他内存都冲突,需要重新申请内存并指派给它
  • 所有申请的内存按组存放

9.4 缓冲区分析(有可以称为别名分析)

缓冲区分析的过程和指针分析的过程有很多类似的地方,所以很多地方又称为别名分析。

一个IR需要定义≥1个逻辑缓冲区

用{def, {}} 来定义一个缓冲区

缓冲区{b, {}} 和 {b, {1}}可以相互覆盖

来自不同IR的逻辑缓冲区可以复用同一块内存

例如对下面的伪代码,可以知道d和b是别名关系,因为它们指向同一片内存:

9.4.1 定义所有指令的所有逻辑缓冲区

按拓扑顺序遍历(选择什么顺序?逆后根排序)计算图,为每个指令分配缓冲区,例如上面的伪代码,生成缓冲区如下:

1 Buffer(a, {}) : [ (a, {}) ]
2 Buffer(b, {}) : [ (b, {}) ]
3 Buffer(c, {}) : [ (c, {})]

9.4.2 HLO内部的别名分析后的结果

1 Buffer(a, {}) : [ (c, {0}), (a, {}) ]
2 Buffer(b, {}) : [ (c, {1}), (b, {}) , (d, {}) ]
3 Buffer(c, {}) : [ (c, {})]
 

9.4.3 跨HLO的别名分析

基于近似SSA的HLO语法定义,编译过程变得简单了很多(SSA化是很多编译中的主要工作)

9.4.4 基于上面伪代码的生命周期干扰分析

从下面生成的图来看,a和b互相干扰,不能公用缓冲区,e理论上是d的拷贝别名,所以和b也是别名关系。和寄存器分配不同的是,考虑到多线程执行场景,不同流中要用到的缓冲区不能分配到同一个组,所以a/b虽然和e在下面的计算图中没有干扰,但由于e是后面HLO的输入,所有e不能和当前计算图中的任意一个缓冲形成别名关系。

9.5 buffer指派的功能

9.5.1 将能够重用的buffer尽可能重用

没有生命期干扰的缓冲区都可以分配到同样的内存

9.5.2 缓冲区分配复合

将着色相同的缓冲区复合到一起申请(可能不同缓冲区占用某个实际缓冲区的不同部分,但大家相互之间的关系决定了它们可以相邻申请)

9.5.3 从全局分析去掉内存碎片

9.5.4 峰值内存压力预测

9.5.5 内存分配统计

程序分析与优化 - 9 附录 XLA的缓冲区指派的更多相关文章

  1. 程序分析与优化 - 7 静态单赋值(SSA)

    本章是系列文章的第七章,终于来到了鼎鼎大名的SSA,SSA是编译器领域最伟大的发明之一,也是影响最广的发明. 本文中的所有内容来自学习DCC888的学习笔记或者自己理解的整理,如需转载请注明出处.周荣 ...

  2. 程序分析与优化 - 4 工作列表(worklist)算法

    本章是系列文章的第四章,介绍了worklist算法.Worklist算法是图分析的核心算法,可以说学会了worklist算法,编译器的优化方法才算入门.这章学习起来比较吃力,想要融汇贯通的同学,建议多 ...

  3. PC虚拟现实应用的性能分析与优化:从CPU角度切入

    如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...

  4. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  5. 1.linux服务器的性能分析与优化

    [教程主题]:1.linux服务器的性能分析与优化 [课程录制]: 创E [主要内容] [1]影响Linux服务器性能的因素 操作系统级 CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处 ...

  6. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  7. Go 程序的性能优化及 pprof 的使用

    Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们 ...

  8. 一:MySQL数据库的性能的影响分析及其优化

    MySQL数据库的性能的影响分析及其优化 MySQL数据库的性能的影响 一. 服务器的硬件的限制 二. 服务器所使用的操作系统 三. 服务器的所配置的参数设置不同 四. 数据库存储引擎的选择 五. 数 ...

  9. linux服务器的性能分析与优化(十三)

    [教程主题]:1.linux服务器的性能分析与优化 [主要内容] [1]影响Linux服务器性能的因素 操作系统级 Ø CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处理器可以在同一时间 ...

随机推荐

  1. Python打印表格

    使用Python在终端打印表格 import prettytable table = PrettyTable(['Title1', 'Title2', 'Title3']) table.add_row ...

  2. jmeter元件,作用域与优先级

    jmeter元件,作用域与优先级 一.jmeter元件 1.配置元件:优先级最高 1.1 重点使用元件:csv数据文件设置.用户定义变量.计数器 2.取样器:根据不同协议来编写请求脚本的元件 2.1 ...

  3. 车辆跟随滑模控制的python实现

    上一篇文章一个汽车跟踪问题的滑模控制实例,已经从理论上证明了可以使用滑模变结构控制策略来解决汽车跟踪问题. 下面分别采用指数趋近律.等速趋近律.准滑模控制的方法完成车辆跟随问题的仿真 import m ...

  4. OpenHarmony3.1 Release版本关键特性解析——Enhanced SWAP内存管理

    樊成阳 华为技术有限公司内核专家 陈杰 华为技术有限公司内核专家 OpenAtom OpenHarmony(以下简称"OpenHarmony")是面向全场景泛终端设备的操作系统,终 ...

  5. 第一篇:实时网络日志分析器和交互式查看器--GoAccess安装

    介绍 GoAccess是一个开源的实时网络日志分析器和交互式查看器,可以在* nix 系统或通过浏览器的终端中运行. 它为需要动态可视化服务器报告的系统管理员提供快速且有价值的HTTP统计信息. 特征 ...

  6. 【多线程】可重入锁 ReentrantLock

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...

  7. 103_Power Pivot 透视表中空白标签处理及百分比

    焦棚子的文章目录 请点击下载附件 1.案例来源于不断变化的需求 事实表:销售表 维度表:城市表 销售表和城市建立多对一的关系 如图1: 图1 2.插入透视表 如图2: 图2 3.问题 1.销售表中,城 ...

  8. redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物

    今日内容概要 redis 的linux安装和配置 redis 的api使用 高级用法之慢查询 pipline事务 内容详细 1.redis 的linux安装和配置 # redis 版本选择问题 -最新 ...

  9. 04 Springboot 格式化LocalDateTime

    Springboot 格式化LocalDateTime 我们知道在springboot中有默认的json解析器,Spring Boot 中默认使用的 Json 解析技术框架是 jackson.我们点开 ...

  10. K8S 使用Minikube搭建Kubernetes(K8S)~单机运行Kubernetes~适用于快速学习

    在一台主机上运行起来的Kubernetes,仅适用于学习!~~~ 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:Docker-ce-18.06.0.Ku ...