一文带你从零认识什么是xla

华为云开发者社区 华为云开发者社区     2023-02-28     332

关键词:

摘要:简要介绍XLA的工作原理以及它在 Pytorch下的使用。

本文分享自华为云社区《XLA优化原理简介》,作者: 拓荒者01。

初识XLA

XLA的全称是Accelerated Linear Algebra,即加速线性代数。作为一种深度学习编译器,长期以来被作为Tensorflow框架的一个试验特性被开发,历时至今已经超过两三年了,随着Tensorflow 2.X的发布,XLA也终于从试验特性变成了默认打开的特性。此外, Pytorch社区也在大力推动XLA在Pytorch下的开发,现在已经有推出PyTorch/XLA TPU版本,暂只支持谷歌平台TPU上使用。

LLVM

提到编译器就不得不提大名鼎鼎的LLVM。LLVM是一个编译器框架,由C++语言编写而成,包括一系列分模块、可重用的编译工具。

LLVM框架的主要组成部分有:

1、前端:负责将源代码转换为一种中间表示

2、优化器:负责优化中间代码

3、后端:生成可执行机器码的模块

LLVM为不同的语言提供了同一种中间表示LLVM IR,这样子如果我们需要开发一种新的语言的时候,我们只需要实现对应的前端模块,如果我们想要支持一种新的硬件,我们只需要实现对应的后端模块,其他部分可以复用。

XLA编译

XLA也是基于LLVM框架开发的,前端的输入是Graph,前端没有将Graph直接转化为LLVM IR。首先XLA的功能主要体现在两个方面:

1、即时编译(Just-in-time)

2、超前编译(Aheda-of-time)

无论是哪个功能,都是服务于以下目的:

1、提高代码执行速度

2、优化存储使用

此外,XLA还有着大部分深度学习编译器都有的梦想:摆脱计算库的限制,自动生成算子代码并支持在多硬件上的良好可移植性。

作为编译器,XLA负责对前端定义的计算图进行优化。如上图所示,XLA的优化流程可以分成两方面,目标无关优化和目标相关优化。在优化步骤之间传递的是计算图的中间表示形式,HLO,即High Level Optimizer(高级优化器) ,XLA用这种中间表示形式表示正在被优化的计算图,其有自己的文法和语义,这里不做详细介绍

XLA优势

  • 编译子计算图以减少短暂运算的执行时间,从而消除运行时的开销;融合流水线运算以降低内存开销;并针对已知张量形状执行专门优化以支持更积极的常量传播。
  • 提高内存使用率: 分析和安排内存使用,消除了许多中间存储缓冲区。
  • 降低对自定义运算的依赖:通过提高自动融合的低级运算的性能,使之达到手动融合的自定义运算的性能水平,从而消除对多种自定义运算的需求。
  • 提高便携性:使针对新颖硬件编写新后端的工作变得相对容易,在新硬件上运行时,大部分程序都能够以未经修改的方式运行。与针对新硬件专门设计各个整体运算的方式相比,这种模式不必重新编写 程序即可有效利用这些运算。

XLA工作原理

我们先来看XLA如何作用于计算图,下面是一张简单的计算图

这里我们假设XLA仅支持matmul和add。XLA通过图优化方法,在计算图中找到适合被JIT编译的区域

XLA把这个区域定义为一个Cluster,作为一个独立的JIT编译单元,计算图中通过Node Attribute标示

然后另一个的图优化方法,把cluster转化成TensorFlow的一个Function子图。在原图上用一个Caller节点表示这个Function在原图的位置

最后调用TensorFlow的图优化方法(BuildXlaOps),把Function节点转化成特殊的Xla节点。

在TensorFlow运行时,运行到XlaCompile时,编译Xla cluster子图,然后把编译完的Executable可执行文件通过XlaExecutableClosure传给XlaRun运行。

接着根据虚拟指令分配GPU Stream和显存,然后IrEmitter把HLO Graph转化成由编译器的中间表达LLVM IR表示的GPU Kernel。最后由LLVM生成nvPTX(Nvidia定义的虚拟底层指令表达形式)表达,进而由NVCC生成CuBin可执行代码。

AOT和JIT

JIT,动态(即时)编译,边运行边编译;AOT,指运行前编译。这两种编译方式的主要区别在于是否在“运行时”进行编译,对于AI训练模型中,AOT模式下更具有性能优势,具体流程如下图:

对于大部分AI模型来说,训练过程一般情况下图是不会怎么变的,所以在训这样子就在执行过程中省略练的时候使用AOT模式能大大提高训练的速度

Pytorch/XLA

创建 XLA 张量:PyTorch/XLA 为 PyTorch 添加了新的 xla 设备类型。 此设备类型的工作方式与普通 PyTorch 设备类型一样。 例如,以下是创建和打印 XLA 张量的方法:

这段代码应该看起来很熟悉。 PyTorch/XLA 使用与常规 PyTorch 相同的界面,但添加了一些内容。 导入 torch_xla 初始化 PyTorch/XLA,xm.xla_device() 返回当前的 XLA 设备。 这可能是 CPU 或 GPU,具体取决于您的环境。

XLA 张量是 PyTorch 张量:PyTorch 操作可以在 XLA 张量上执行,就像 CPU 或 CUDA 张量一样。例如,XLA 张量可以相加:

XLA 设备上运行模型:构建新的 PyTorch 网络或将现有网络转换为在 XLA 设备上运行只需要几行特定于 XLA 的代码,现阶段官方只支持JIT模式。 以图是在官方版本单个XLA设备上运行时代码段

这段代码可以看出切换model在 XLA 上运行是多么容易。 model定义、数据加载器、优化器和训练循环可以在任何设备上工作。 唯一的 特别代码是获取 XLA device和mark step的几行代码。因为XLA tensor运行是lazy( 懒惰的)。 所以只在图形中记录操作,直到需要结果为止,调用 xm.mark_step() 才会执行其当前图获取运行结果并更新模型的参数。

点击关注,第一时间了解华为云新鲜技术~

带你从零开始,开发一个阅读站第五章,前端模板介绍

[本项目已开源,地址:https://gitee.com/input4hua/littleRB/tree/v1/]FreeMarker关于freeMarker模板引擎,摘自官网的开头一段解释如下:ApacheFreeMarker是一个模板引擎:基于模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码... 查看详情

带你从零开始,开发一个阅读站第二章,技术选型

 首先,上图展示的是项目的部署方式。用户通过手机访问上面的nignx,即应用nignx将请求分发到三台web服务器中,服务器将从redis缓存里获取热点数据,如过期或者非热点数据则从数据库中获取并同步到redis.此过期时间设定为12... 查看详情

带你从零开始,开发一个阅读站第三章,数据库表结构

整个项目只有四张表book-书籍主表,记录书籍的详情信息,包括类别,作者描述等type-类别表,书籍类别管理menu-目录章节表properties-配置表 book表是书籍主表code:用于图书code记录,可认为该字段能确定图书唯一typeId:关联type... 查看详情

手把手带你从零开始完整开发经典游戏俄罗斯方块,全部逻辑只用不到200行代码。

...数和难度级别;会自动保存/复原上次玩的场景。手把手带你从零开始完整开发经典游戏【俄罗斯方块】,全部逻辑只用不到200行代码。整个过程在众触低代码应用平台进行,使用表达式描述游戏逻辑(高度简化版JS)。本课 查看详情

一文带你认识nodejs

​node.js初探Node.js是一个JS的服务端运行环境,简单的来说,它是在JS语言规范的基础上,封装了一些服务端的运行时对象,让我们能够简单实现非常多的业务功能。如果我们只使用JS的话,实际上只是能进行一些简单的逻辑运算... 查看详情

带你从零开始,开发一个阅读站第四章,后台框架搭建

首先,万分抱歉,据上一篇更新后,时隔已近一个月。虽然博主不日念起此事,但实在是最近繁事缠身,说这些也是想告诉对此文有所期待的朋友,博主一定会更完到最后一章,不尽人意之处,还请各位多担待。如果不出意外,... 查看详情

[保姆级万字教程]打造最迷人的s曲线----带你从零手撕基于huffman编码的文件压缩项目(代码片段)

基于Huffman编码的文件压缩1.文件压缩1.1什么是文件压缩?1.2为什么需要压缩1.3压缩的分类1.4压缩方法2.huffman编码的文件压缩2.1构建Huffman树2.2获取Huffman编码2.3压缩2.3.1获取源文件中每个字节出现的频次信息2.3.2根据获取到的频... 查看详情

[保姆级万字教程]打造最迷人的s曲线----带你从零手撕基于huffman编码的文件压缩项目(代码片段)

基于Huffman编码的文件压缩1.文件压缩1.1什么是文件压缩?1.2为什么需要压缩1.3压缩的分类1.4压缩方法2.huffman编码的文件压缩2.1构建Huffman树2.2获取Huffman编码2.3压缩2.3.1获取源文件中每个字节出现的频次信息2.3.2根据获取到的频... 查看详情

强化学习7日打卡营-世界冠军带你从零实践--基于表格型方法的rl

强化学习ReinforceLearning 强化学习区别于机器学习的一点是,强化学习是来做决策的。根据环境的反馈,做出决策。外界环境情况复杂,和环境的交互主要有环境的状态stat、智能体的动作、和对动作带来收益的评价reward。这里... 查看详情

使用vite和typescript带你从零打造一个属于自己的vue3组件库

前言随着前端技术的发展,业界涌现出了许多的UI组件库。例如我们熟知的ElementUI,Vant,AntDesign等等。但是作为一个前端开发者,你知道一个UI组件库是如何被打造出来的吗?读完这篇文章你将学会:如何使用pnpm搭建出一个Monorepo环... 查看详情

vue项目级路由架构带你从零搭建[新手秒懂](代码片段)

文章目录一路由引入与使用1.1新建路由文件1.2注册路由二登录与注册路由配置三内容菜单路由配置3.1路由配置3.2Layout组件示例四配置404页面五添加路由跳转动画六布局优化成果展示:一路由引入与使用1.1新建路由文件首先在... 查看详情

一文带你认识springaop(代码片段)

SpringAOP简介AOP(Aspect-OrientedProgramming:面向切面编程)是对OOP(Object-OrientedProgramming:面向对象编程)的补充和完善。OOP引入封装、继承和多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。封装就要求将功能分散到... 查看详情

分类vs标签,一文带你看懂数据中台为什么要建标签体系?

前言在众多的数据中台的解决方案中,一个叫做“标签中心”或“标签体系”的应用,几乎成了数据中台的“标配”。乍一看,标签体系就像一个树状的分类。以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你... 查看详情

redis五种常用数据类型有哪些?对应的数据存储空间又是怎样的?带你从零开始学习(代码片段)

大家好,我是卷心菜。本篇主要讲解Redis数据库的五种常用数据类型及其数据存储空间的简单介绍,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。文章目录一、什么是Redis?二、客户端连接Redis三、R... 查看详情

一文带你认识lpwa通信技术

摘要:为了满足越来越多的远距离物联网设备的连接需求,LPWA应用而生。本文分享自华为云社区《常见物联网通信技术之LPWA通信技术》,作者:爱吃面包的猫。如果你比较关注物联网圈的话,想必对LPWA这一... 查看详情

带你从零玩转云服务器(代码片段)

目录前言如何玩转云?玩转DockerDocker架构图环境安装步骤优化Docker---配置镜像加速器玩转KubernetesKubernetes架构图基本环境kube-apiserver服务安装将各个组件启动拥有京东云服务器还可以玩什么?拥有自己个人网站,提高个人知... 查看详情

什么是mapreduce,一文带你读懂

什么是MapReduce?MapReduce是一种编程模型,用于大规模数据集的并行运算;是面向大数据并行处理的计算模型、框架和平台。MapReduce思想是什么?MapReduce的思想核心是“分而治之”。 所谓“分而治之”就是把一个复杂的... 查看详情

spring-webflux使用,一文带你从0开始学明白spring-webflux,学明白响应式编程

文章目录​​一、Spring-WebFlux介绍​​​​区别于SpringMVC​​​​二、Spring-WebFlux的使用​​​​1、注解编程模型​​​​(1)定义实体类​​​​(2)定义service​​​​(3)定义controller​​​​(4)测试一下吧~​​​​2... 查看详情