HLO:
high level optimizer 高级优化器
XLA:
XLA(Accelerated Linear Algebra)-加速线性代数,Google推出的高性能机器学习领域编译器(编译型推理引擎),它可以在不更改源代码的条件下加速Tensorflow模型 提高TensorFlow的计算性能
计算图分为要计算的数据和算子 算子中要进行element-wise计算 把多个元素进行重复的element-wise计算融合为一个
将算子融合可减少申请算子间的中间结果所占的内存 也减少了加载消耗时间
XLA对性能的提升主要来源于将多个连续的element-wise算子融合为一个算子
XLA的输入语言是"HLO IR"。XLA将HLO描述的计算图(计算流程)编译为针对各种特定后端的机器指令。
XLA对输入的HLO计算图进行与目标设备无关的优化,如CSE,算子融合,运行时内存分配分析。输出为优化后的HLO计算图 HLO IR。
然后,将HLO计算图发送到后端(Backend),后端结合特定的硬件属性对HLO计算图进行进一步的HLO级优化,例如将某些操作或其组合进行模式匹配从而优化计算库调用。
最后,后端将HLO IR转化为LLVM IR,LLVM再进行低级优化并生成机器码。
HLO instructions are the atomic unit of the high-level compiler’s IR.
HloInstructions live inside of an HloComputation, which is analogous to a
function in other programming languages(类似于其他编程语言的函数). Nodes have no total order within
their computation. Instead, they have a partial ordering determined by their
data and control dependencies.
HLO does not have basic blocks or explicit “branch” instructions. Instead,
certain HloInstructions – namely, kWhile, kConditional, and kCall – encode
control flow. For example, the kConditional HLO executes one of two possible
computations, depending on the runtime value of a predicate.
HLO is pure (mostly). It has no concept of mutable state. Instead, data
values are produced by one HLO and flow into consumers across dependency
edges.
算子融合:
https://zhuanlan.zhihu.com/p/209029514?utm_source=qq
https://www.cnblogs.com/wujianming-110117/p/14992989.html
https://blog.youkuaiyun.com/Zzzzzcccnn/article/details/106614091
https://blog.youkuaiyun.com/Artyze/article/details/108796250
HLO:
high level optimizer 高级优化器
XLA:
XLA(Accelerated Linear Algebra)-加速线性代数,Google推出的高性能机器学习领域编译器(编译型推理引擎),它可以在不更改源代码的条件下加速Tensorflow模型 提高TensorFlow的计算性能
计算图分为要计算的数据和算子 算子中要进行element-wise计算 把多个元素进行重复的element-wise计算融合为一个
将算子融合可减少申请算子间的中间结果所占的内存 也减少了加载消耗时间
XLA对性能的提升主要来源于将多个连续的element-wise算子融合为一个算子
XLA的输入语言是"HLO IR"。XLA将HLO描述的计算图(计算流程)编译为针对各种特定后端的机器指令。
XLA对输入的HLO计算图进行与目标设备无关的优化,如CSE,算子融合,运行时内存分配分析。输出为优化后的HLO计算图 HLO IR。
然后,将HLO计算图发送到后端(Backend),后端结合特定的硬件属性对HLO计算图进行进一步的HLO级优化,例如将某些操作或其组合进行模式匹配从而优化计算库调用。
最后,后端将HLO IR转化为LLVM IR,LLVM再进行低级优化并生成机器码。
HLO IR可以分如下图所示的成三个层次,HloModule, HloComputation和HloInstruction。
HloModule:
一个编译单元,相当于一个完整的可执行程序,所以有入口函数,也就是 entry_computation, 有且仅有一个。输入可以是多个参数,但输出只有一个(root instruction的值),如果要返回多个值,需要把多个值构造成一个元组(tuple)返回。一个module可以包含多个computation,除了entry_computation,其他的都是"nested",,也就是被调用。ENTRY ----------------> 程序入口,ROOT--------------> 程序输出 一个HloModule可以包含很多个HloComputation
HloComputation
是HLO IR中间层的表示,相当于程序中的一个函数。一个HloModule只能有一个entry_conputation,其他的computation是被entry_computation调用的。我们可以把entry_computation类比作main函数。每个HloComputation可以包含多个HloInstruction.
HloInstruction
是HLO IR最底层的表示,顾名思义,相当于程序中的一条指令 可理解为op。每个HloComputation只能有一个root_instruction。root_instruction的output就是该computation的output。computation的input用parameter表示。HloInstruction也可以调用HloComputation。
HLO规定一个instruction必须只生成一个output。但是在实际中的,很多时候我们需要输出多个output。对于这种情况,我们需要将多个output打包成一个Tuple。如此,一个tuple类型的output中可以包含多个sub-output,也就是nested的。HLO中用Shape来表示nested output。从Shape中的tuple_shapes_ field是一个vector。
一个HloInstruction可包含多个算子
operation_semantics
https://www.tensorflow.org/xla/operation_semantics(英文打开)
单个算子没法运行 要重新组件成module(加ENTRY ----------------> 程序入口,ROOT--------------> 程序输出 等)才能运行
区别model和module