XLA Overview(XLA概述)

XLA概述

注意: XLA是实验性的。大多数使用情况在性能(速度或减少的内存使用情况)方面都没有改进。我们早期发布了XLA,这样开源社区可以为其开发做出贡献,并为与硬件加速器集成创建一条路径。

XLA(加速线性代数)是用于优化TensorFlow计算的线性代数的域特定编译器。结果是在服务器和移动平台上的速度,内存使用率和可移植性得到了改善。最初,大多数用户不会从XLA中看到很大的好处,但是欢迎您通过使用即时(JIT)编译或提前编译(AOT)的XLA进行试验。特别鼓励开发者针对新硬件加速器尝试XLA。

XLA框架是实验性和积极的开发。特别是,尽管现有操作的语义不太可能发生变化,但预计将增加更多的操作来涵盖重要的用例。该团队欢迎来自社区的关于通过GitHub缺失功能和社区贡献的反馈。

我们为什么要构建XLA?

XLA与TensorFlow合作有几个目标:

  • 提高执行速度。编译子图以减少短暂Ops的执行时间,以消除TensorFlow运行时间的开销,融合流水线操作以减少内存开销,并专用于已知张量形状以允许更积极的恒定传播。

  • 改善内存使用。分析和计划内存使用情况,原则上消除许多中间存储缓冲区。

  • 减少对自定义操作的依赖。通过改进自动融合低级Ops的性能来消除对许多自定义Ops的需求,以匹配手工融合的自定义Ops的性能。

  • 减少移动足迹。通过提前编译子图并发出可以直接链接到另一个应用程序的对象/头文件对来消除TensorFlow运行时。结果可以将移动推断的占用空间减少几个数量级。

  • 提高可移植性。为新颖的硬件编写新的后端程序相对容易,此时大部分TensorFlow程序将在该硬件上未修改地运行。这与专门针对新硬件的个体单片Ops的方法形成对比,这需要重写TensorFlow程序以利用这些Ops。

XLA如何工作?

XLA的输入语言称为“HLO IR”,或称为HLO(高级优化程序)。操作语义页面描述了HLO的语义。将HLO视为编译器IR是最方便的。

XLA将HLO中定义的图形(“计算”)编译成各种体系结构的机器指令。XLA是模块化的,因为它很容易插入替代后端,以便定位一些新颖的硬件架构。用于x64和ARM64的CPU后端以及NVIDIA GPU后端均位于TensorFlow源代码树中。

下图显示了XLA中的编译过程:

XLA带有多个与目标无关的优化和分析,如CSE,独立于目标的操作融合以及为计算分配运行时内存的缓冲区分析。

在独立于目标的步骤之后,XLA将HLO计算发送到后端。后端可以执行进一步的HLO级别分析和优化,这次是针对具体目标信息和需求。例如,XLA GPU后端可以执行专用于GPU编程模型的操作融合,并确定如何将计算划分为流。在这个阶段,后端也可以模式匹配某些操作或其组合来优化库调用。

下一步是目标特定的代码生成。XLA附带的CPU和GPU后端使用LLVM进行低级IR,优化和代码生成。这些后端以有效的方式发出代表XLA HLO计算所需的LLVM IR,然后调用LLVM从此LLVM IR发出本机代码。

GPU后端当前通过LLVM NVPTX后端支持NVIDIA GPU; CPU后端支持多个CPU ISA。

支持的平台

XLA目前支持x86-64和NVIDIA GPU上的JIT编译; 以及针对x86-64和ARM的AOT编译。