StableHLO(Stable High Level Operations)
重要声明:本页撰写时外部检索全部返回 403 错误,以下内容基于公开可查的 GitHub 仓库(openxla/stablehlo)、MLIR 官方文档及 Google/XLA 公开博客等已知事实撰写。凡无法精确验证的规格数字均以定性表述标注,绝不凭记忆编造。
3 秒看懂
一句话: StableHLO 是由 Google 主导、基于 MLIR 的机器学习编译器中间表示(IR)标准操作集,为 ML 框架与异构硬件后端之间提供版本化、可移植、稳定的编译接口层。
类比: 如果把 AI 模型编译比作”翻译”,StableHLO 就是一套标准化的中间语言——框架端只管把模型翻译成这套中间语言,硬件端只管把这套中间语言翻译成自己的机器码,两端解耦。
3 分钟产业解释
问题背景:AI 编译的”巴别塔”
当前 AI 产业面临一个关键的编译碎片化问题:
- 框架侧:PyTorch、TensorFlow、JAX、ONNX 等框架各有自己的算子定义和 IR 表达;
- 硬件侧:NVIDIA GPU、Google TPU、AMD GPU、Intel Gaudi、以及数十家 AI 芯片初创公司的加速器各有自己的编译器栈;
- 现状:每家芯片公司都需要为每个框架写前端适配,组合爆炸(M 个框架 × N 个硬件 = M×N 条路径)。
StableHLO 的定位
StableHLO 提供一个稳定的标准操作集,将 M×N 问题降维为 M+N:
框架 (M 个) ──→ StableHLO(标准中间层)──→ 硬件后端 (N 个)
这意味着:
- 框架方只需将模型导出为 StableHLO,无需关心底层硬件;
- 硬件方只需实现从 StableHLO 到自家 ISA 的编译,无需逐框架适配;
- 模型分发可以 StableHLO 为中间格式,一次编译、多处部署。
产业格局
StableHLO 是 OpenXLA 生态的核心组件之一。OpenXLA 是 Google 联合多家公司发起的开源 ML 编译器项目,StableHLO 作为其定义的稳定 IR 层,承担”通用中间语言”的角色。
15 分钟专家深入
1. 从 HLO 到 StableHLO 的演进逻辑
Google 内部的 XLA(Accelerated Linear Algebra)编译器长期使用 HLO(High Level Operations) 作为其内部 IR。HLO 的问题是:
- 不稳定:Google 内部可以随时修改 HLO 操作语义和版本,外部生态无法依赖;
- 缺乏版本化保证:没有正式的版本号和兼容性策略;
- 绑定 XLA 实现:HLO 与 XLA 的具体实现紧密耦合。
StableHLO 在 2022 年左右随 OpenXLA 项目公开推出,核心改进是:
| 维度 | HLO | StableHLO |
|---|---|---|
| 稳定性 | 内部 API,可随时变更 | 有正式兼容性保证 |
| 版本化 | 无明确版本策略 | VHLO 层提供版本化序列化 |
| 所有权 | Google XLA 内部 | OpenXLA 社区治理 |
| MLIR 集成 | 不适用 | 原生 MLIR Dialect |
| 目标用户 | Google 内部 TPU 编译 | 跨硬件通用编译 |
2. 三层架构:StableHLO + VHLO + CHLO
StableHLO 实际上不是单一 IR,而是一个分层体系:
┌─────────────────────────────────────┐
│ CHLO (Compatibility HLO) │ ← 向后兼容操作(已从稳定规范中移除的旧操作)
│ 可被 legalize 为 StableHLO │
├─────────────────────────────────────┤
│ StableHLO Ops │ ← 核心操作集(~100+ 操作)
│ 语义稳定、面向编译器优化 │
├─────────────────────────────────────┤
│ VHLO (Versioned HLO) │ ← 版本化序列化格式
│ 每个操作有明确版本号 │
│ 用于跨版本兼容和模型持久化 │
└─────────────────────────────────────┘
- CHLO:Compatibility HLO,用于容纳那些因语义演进等原因已从稳定规范中移除、但仍需向后兼容的旧版本操作。它可以被“legalize”(合法化/降级)为当前的 StableHLO 操作组合。CHLO 不包含 softmax(softmax 由多个 StableHLO 基础操作组合而成),dot_general 也属于 StableHLO 核心操作集而非 CHLO;
- StableHLO:核心操作集,定义了 ML 编译中常用的计算原语;
- VHLO:Versioned HLO,通过目标版本属性(target_version)在方言级别管理版本兼容性,版本号是整体 StableHLO 版本(如
0.9.0),以此确保序列化后的 IR 在不同编译器版本间可被正确解析和升级。
3. 在 MLIR 生态中的位置
StableHLO 是一个 MLIR Dialect,完全构建在 MLIR 基础设施之上:
- 使用 MLIR 的 Operation、Type、Attribute 系统;
- 利用 MLIR 的 Pass 基础设施进行变换和优化;
- 与 MLIR 的其他 Dialect(如 linalg、tensor、memref)可互操作;
- 采用 MLIR 的 ODS(Operation Definition Specification) 以声明式方式定义操作。
这意味着 StableHLO 可以利用 MLIR 生态的全部工具链(验证器、打印器、pass pipeline 等)。
4. 核心操作集特征
StableHLO 的操作集覆盖 ML 编译的典型计算模式,大致包括(具体操作数量随版本迭代变化,此处仅作定性列举):
- 张量运算:reshape、transpose、broadcast_in_dim、concatenate、slice、pad
- 算术运算:add、mul、div、neg、abs、exp、log、sqrt、rsqrt 等元素级操作
- 归约运算:reduce、reduce_window
- 线性代数:dot_general(通用矩阵乘法/点积,涵盖 GEMM/BMM 等)、convolution
- 比较与选择:compare、select、clamp
- 类型转换:convert(数据类型转换)、bitcast_convert
- 控制流:while、if(条件执行)
- RNG:rng(随机数生成,有不同算法变体)
- Collective 通信:all_reduce、all_gather、collective_permute、all_to_all 等分布式原语
- FFT、Iota、Constant 等其他操作
关键设计特点:
- 纯函数式语义:StableHLO 操作是纯函数式的(无副作用),输入张量 → 输出张量,便于编译器做代数化简和重排;
- 显式形状传播:张量的形状信息在 IR 中显式表达;
- 动态形状支持:支持维度为
?的动态形状张量; - 类型丰富:支持 float(f16/bf16/f32/f64/f8 等多种位宽)、integer(i8/i16/i32/i64/u8 等)、complex、boolean、quantized 类型等。
5. dot_general 操作详解(核心中的核心)
dot_general 是 StableHLO 中最重要的操作之一,它统一了矩阵乘法的各种变体:
// 伪码语义
dot_general(lhs, rhs,
lhs_batching_dimensions, rhs_batching_dimensions,
lhs_contracting_dimensions, rhs_contracting_dimensions)
- 通过指定 batching 维度和 contracting 维度,同一个操作可以表达:
- 向量点积(1D × 1D)
- 矩阵乘法(2D × 2D)
- 批量矩阵乘法(3D × 3D,第一维为 batch)
- 更高维的张量缩并
这与 numpy 的 einsum 或 PyTorch 的 torch.tensordot 类似,但以结构化的方式指定维度关系,而非使用字符串表达。
技术原理(最深层)
编译流程中的 StableHLO
StableHLO 在整体 AI 编译流程中的典型位置如下(以 JAX 为例):
用户 Python 代码 (JAX/TF/PyTorch)
│
▼
框架级 IR(JAXPR / TF Graph / TorchScript)
│ [框架导出/转换]
▼
┌─────────────┐
│ StableHLO │ ← 统一中间层
└─────────────┘
│
├──→ StableHLO 优化 Pass(形状推断、常量折叠、代数化简等)
│
├──→ 转换为目标相关 IR
│ │
│ ├──→ (GPU) Linalg → GPU Dialect → LLVM NVVM/ROCDL → PTX/GCN
│ ├──→ (TPU) 转换为内部 XLA HLO → TPU 编译器
│ ├──→ (其他加速器) 转换为对应后端 IR
│ └──→ (IREE 等) 转换为 VM bytecode + HAL 执行
│
▼
硬件可执行代码
StableHLO 优化 Pass 举例
StableHLO 层可以进行的常见优化变换(定性列举,具体 pass 实现细节可能随版本变化):
| 优化类型 | 描述 |
|---|---|
| 常量折叠 | 将编译期可计算的子图折叠为常量 |
| 代数化简 | 如 x + 0 → x、x * 1 → x、exp(log(x)) → x |
| 形状推断/传播 | 自动推导动态形状维度 |
| Layout 排列优化 | 为后续硬件后端选择最优内存布局 |
| 操作融合 | 将多个元素级操作融合为单个 kernel |
| Quantization 传播 | 量化信息的传播与校正 |
与 XLA HLO 的技术差异
┌──────────────────────────────────────────────┐
│ XLA 内部编译流程 │
│ │
│ HLO Graph │
│ │ │
│ ├── HLO Pass: Fusion, Layout, Tiling... │ ← 硬件感知优化
│ │ │
│ ├── Buffer Assignment │ ← 内存分配
│ │ │
│ └── Codegen(Emitter) │ ← 生成目标代码
│ │
│ (以上全在 XLA 内部,HLO 是内部 IR) │
└──────────────────────────────────────────────┘
┌──────────────────────────────────────────────┐
│ StableHLO 生态编译流程 │
│ │
│ StableHLO(稳定接口层) │
│ │ │
│ ├── StableHLO 优化 Pass │ ← 硬件无关优化
│ │ │
│ └── Convert to Lower-level IR │ ← 向下转换
│ │ │
│ ├──→ XLA HLO (TPU) │
│ ├──→ Linalg/其他 (GPU/其他) │
│ └──→ 自定义后端 │
└──────────────────────────────────────────────┘
关键区别:StableHLO 的设计目标是通用性和稳定性,而非特定硬件的极致优化。StableHLO保持与XLA HLO相当的硬件无关抽象层次,并增加了版本化和稳定性保证。硬件相关的 tiling、buffer 分配、指令选择等优化在后续编译流程中进行。
序列化与 VHLO 版本控制
模型以 StableHLO 格式分发时,实际序列化为 VHLO(Versioned HLO) 格式:
- VHLO 的版本兼容性通过目标版本属性(target_version)在方言级别管理,版本号是整体 StableHLO 版本(如
0.9.0),而非每个操作类型有独立版本变体; - 不同版本的编译器可以通过版本升级 pass(upgrade pass)将旧版本 VHLO 转换为目标版本;
- 这保证了向后兼容:旧格式的模型可以在新版本编译器中正确解析。
此机制对于模型分发场景至关重要——用户导出的模型文件不会因为编译器升级而失效。
技术演进史
| 时间节点 | 事件 |
|---|---|
| 约 2017 | Google 内部 XLA 编译器使用 HLO 作为 IR,服务于 TPU |
| 2019–2020 | MLIR 项目在 LLVM 社区兴起,提供多层 IR 基础设施 |
| 约 2022 年中 | Google 将 StableHLO 作为 MLIR Dialect 开源(GitHub: openxla/stablehlo) |
| 2022 年末 | OpenXLA 项目正式发布,StableHLO 成为生态核心组件 |
| 2023 | JAX 率先支持将计算图导出为 StableHLO;TensorFlow XLA 路径集成 |
| 2023–2024 | torch-mlir / SHARK 等项目支持 PyTorch → StableHLO 转换;ONNX → StableHLO 路径逐步完善 |
| 持续进行中 | 操作集持续扩展,Quantization 支持增强,VHLO 版本策略迭代 |
注意:以上时间线为基于公开信息的合理梳理,具体日期请以 OpenXLA 官方博客和 GitHub release 为准。
技术路线对比
ML 编译器 IR 路线对比
| 维度 | StableHLO | ONNX | TOSA | Linalg on Tensor | torch-mlir |
|---|---|---|---|---|---|
| 主导方 | Google / OpenXLA | Microsoft / LF | Arm | Google / LLVM 社区 | LLVM / PyTorch 社区 |
| 定位 | 通用 ML 编译中间层 | 模型交换格式 | 嵌入式/移动端编译 IR | MLIR 原生的线性代数 IR | PyTorch → MLIR 的桥接 |
| 抽象层次 | 中等(原子操作级) | 较高(算子级) | 中等(嵌入式友好) | 较低(结构化循环级) | 中等 |
| MLIR 原生 | ✅ 是 | ❌ 独立 IR 体系 | ✅ 是 | ✅ 是 | ✅ 是 |
| 版本化保证 | ✅ VHLO | ✅ ONNX opset | ✅ 版本化 | ❌ 无正式版本策略 | ⚠️ 不稳定 |
| 动态形状 | ✅ 支持 | ⚠️ 部分支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
| Collective/分布式 | ✅ 有原语 | ❌ 不支持 | ❌ 不支持 | ⚠️ 需额外扩展 | ⚠️ 有限 |
| 量化类型支持 | ⚠️ 增强中 | ✅ 较好 | ✅ 原生支持 | ⚠️ 通过外部扩展 | ⚠️ 有限 |
| 主要服务场景 | 训练+推理通用 | 模型交换/推理 | 端侧/嵌入式推理 | 通用编译后端 | PyTorch 生态 |
关键洞察:StableHLO 的差异化在于训练场景的完整支持(包括分布式通信原语、动态形状、复杂控制流),这是 ONNX 和 TOSA 相对薄弱的领域。
选择逻辑
需要模型交换/推理部署? ──→ ONNX
需要端侧/嵌入式推理? ──→ TOSA
需要通用 ML 编译(训练+推理)? ──→ StableHLO ← 本文主角
需要 MLIR 原生的细粒度优化? ──→ Linalg on Tensor
上下游
上游(谁产生 StableHLO)
| 来源 | 转换路径 | 成熟度 |
|---|---|---|
| JAX | JAX → JAXPR → StableHLO(最原生的路径) | ★★★★★ |
| TensorFlow | TF Graph → XLA HLO → StableHLO | ★★★★☆ |
| PyTorch | PyTorch → torch-mlir → StableHLO | ★★★☆☆ |
| ONNX | ONNX → onnx-mlir/onnx2stablehlo → StableHLO | ★★☆☆☆ |
| 手动构建 | 通过 StableHLO C++/Python API 直接构造 IR | ★★★★☆ |
下游(谁消费 StableHLO)
| 消费方 | 使用方式 |
|---|---|
| XLA/TPU | StableHLO → XLA HLO → TPU 编译器 |
| IREE | StableHLO → Linalg → IREE HAL → LLVM → CPU/GPU/… |
| 各 AI 芯片编译器 | StableHLO → 各家自定义后端 IR → 加速器 |
| 模型存储/分发 | StableHLO IR 序列化为 .mlirbc 或 .stablehlo 格式 |
在 AI 编译栈中的位置
┌────────────────────────────────────────────────────┐
│ 框架层 (JAX/TF/PyTorch) │
├────────────────────────────────────────────────────┤
│ ★ StableHLO ★ ← 【本文主角】 │
│ (稳定、可移植的 ML 编译 IR) │
├────────────────────────────────────────────────────┤
│ MLIR 中层 (Linalg/Tensor/Memref) │
├────────────────────────────────────────────────────┤
│ MLIR 低层 (SCF/Vector/GPU/LLVM Dialect) │
├────────────────────────────────────────────────────┤
│ 硬件 ISA / 机器码 │
└────────────────────────────────────────────────────┘
关键指标
| 指标 | 说明 | 备注 |
|---|---|---|
| 操作数量 | 在数百个量级 | 随版本迭代变化,具体数字请查 GitHub |
| 支持的数据类型 | f8/f16/bf16/f32/f64、i8/i16/i32/i64、u8 等、complex、bool、quantized | 覆盖主流 ML 数据类型 |
| IR 格式 | MLIR textual (.mlir) 和 bytecode (.mlirbc) | bytecode 更紧凑适合分发 |
| 版本策略 | VHLO 语义化版本号 | 兼容性保证程度请参考官方文档 |
| 语言绑定 | C++(核心)、Python(API 和绑定) | |
| 依赖 | MLIR/LLVM(主要)、abseil 等 | LLVM 版本需匹配 |
| License | Apache 2.0 |
供需与市场数据
⚠️ 声明:StableHLO 是开源编译器 IR,不直接产生营收。以下从产业价值角度进行定性分析。
需求侧驱动
- AI 芯片碎片化:全球有数十家公司开发 AI 加速器([行业报告常见估算,如 McKinsey/BCG 报告曾提及数十家]),每家都需要编译器栈,StableHLO 降低了前端适配成本;
- 框架多元化:PyTorch 占据训练主导地位,但 JAX 在 Google 生态和学术界增长迅速,TensorFlow 仍有大量存量部署,统一 IR 减少框架-硬件矩阵适配;
- 模型分发标准化:随着 AI 模型从”自己训练自己用”转向”训练一次、多方部署”,稳定的中间格式成为刚需。
供给侧格局
| 角色 | 代表参与者 |
|---|---|
| 核心开发者 | Google(XLA/OpenXLA 团队)、LLVM/MLIR 社区 |
| 采纳方(编译器) | IREE(Google/开源)、各芯片公司编译器团队 |
| 采纳方(框架) | JAX(原生)、TF XLA、torch-mlir、SHARK |
潜在市场规模估算逻辑
StableHLO 的价值不直接独立计量,但可从以下角度估算其产业影响力:
- AI 编译器工具链市场(包含各种 compiler-as-a-service、工具授权)处于早期,[未充分披露] 具体市场规模;
- StableHLO 的价值在于降低每个 AI 芯片公司编译器研发成本中的前端适配部分——保守估计每家芯片公司前端编译器团队在数十人量级,StableHLO 可节省相当比例的人力。
代表公司与资本映射
核心贡献方
| 公司/组织 | 与 StableHLO 的关系 | 资本市场映射 |
|---|---|---|
| Google / Alphabet | StableHLO 发起者和主要开发者;XLA/TPU 生态原生使用 | GOOGL |
| LLVM Foundation | 提供 MLIR 基础设施(StableHLO 构建其上) | 非上市,社区治理 |
生态采纳方(公开信息可查的)
| 公司/组织 | 采纳方式 | 资本映射 |
|---|---|---|
| AMD | 参与 OpenXLA 社区;ROCm 编译栈关注 MLIR/StableHLO | AMD |
| Intel | IREE 项目参与(编译器栈使用 StableHLO);Habana/Gaudi 编译器关注 | INTC |
| Qualcomm | AI Engine Direct SDK 关注 MLIR 生态 | QCOM |
| 多家 AI 芯片初创公司 | 利用 StableHLO 降低编译器开发门槛 | 各不相同 |
注意:以上采纳关系基于公开可查的信息(如 OpenXLA 官方列出的合作方、MLIR 社区贡献者等),各公司对 StableHLO 的实际投入程度未充分披露,投资者需独立验证。
投资逻辑
直接投资标的
StableHLO 本身是开源基础设施,没有直接的投资标的。但它的存在影响以下投资逻辑:
间接受益分析
1. AI 芯片初创公司(编译器成本下降)
- 逻辑:StableHLO 降低了新 AI 芯片的编译器”冷启动”成本。芯片公司不再需要从零为每个框架写前端,可集中资源在后端优化。
- 受益方:处于早期、编译器团队较小的 AI 芯片公司。
- 风险:StableHLO 的覆盖度和成熟度仍在演进中,是否能满足特定芯片的需求存在不确定性。
2. Google 生态(护城河与平台效应)
- 逻辑:StableHLO + JAX + TPU 构成 Google 的 AI 全栈。StableHLO 成为事实标准意味着更多框架和硬件”接入” Google 主导的生态。
- 受益方:Google Cloud 的 TPU 服务(GOOGL)。
- 风险:如果 PyTorch 生态持续主导训练市场,JAX/StableHLO 的影响力可能受限。
3. 编译器工具链/基础设施公司
- 逻辑:围绕 MLIR/StableHLO 的商业编译器服务(如优化、验证、性能调优)可能存在商业机会。
- 现状:目前以开源社区为主,商业变现路径不清晰。
关键观察点
- PyTorch 官方是否原生集成 StableHLO 导出:目前 PyTorch → StableHLO 依赖第三方(torch-mlir),如果 PyTorch 官方采纳,StableHLO 的生态位将大幅增强;
- ONNX 与 StableHLO 的关系:两者存在功能重叠(推理场景),长期是竞争还是互补值得观察;
- 其他芯片厂商是否采纳:如果 NVIDIA、AMD 等主流厂商的编译器栈原生支持 StableHLO 输入,将标志其成为事实标准。
常见误读纠偏
❌ 误读 1:“StableHLO 就是 XLA HLO 的公开版本”
纠正:StableHLO 和 XLA HLO 是不同的东西。
- XLA HLO 是 Google 内部 XLA 编译器使用的 IR,没有稳定性保证,与 TPU 编译器深度耦合;
- StableHLO 是一个新的、独立定义的操作集,目标是通用性和稳定性,其操作语义经过社区评审;
- StableHLO 可以被转换为 XLA HLO 用于 TPU 编译,但两者不是同一个 IR。
❌ 误读 2:“StableHLO 是一种新的模型格式,将取代 ONNX”
纠正:
- StableHLO 的首要定位是编译器中间表示,而非面向用户层的模型交换格式;
- ONNX 更侧重于推理场景的模型交换,有丰富的算子集、工具链和生态(ONNX Runtime 等);
- StableHLO 可以作为模型存储和分发的格式(通过 VHLO 序列化),但这不是其核心差异点;
- 两者在推理场景有一定重叠,但 StableHLO 的独特价值在于训练场景支持(分布式通信原语、动态形状、复杂控制流),这是 ONNX 不覆盖的领域。
❌ 误读 3:“使用 StableHLO 就能实现零成本跨硬件移植”
纠正:
- StableHLO 保证的是语义正确性(同一操作在不同平台上语义一致),而非性能等价性;
- 不同硬件的最佳实现策略差异巨大(如 Tensor Core 的 tile 大小、内存层次等),这些差异需要在 StableHLO 之后的编译阶段处理;
- 某些操作在特定硬件上可能不支持或需要软件模拟,降级路径由后端决定;
- 因此更准确的说法是:StableHLO 实现了可移植的正确性,但可移植的性能仍是各后端编译器的竞争差异点。
❌ 误读 4:“StableHLO 只面向 Google TPU 生态”
纠正:StableHLO 是 OpenXLA 生态的一部分,其设计目标是跨硬件通用性。虽然其起源与 Google TPU/XLA 紧密相关,但它:
- 是一个原生 MLIR Dialect,可以被任何 MLIR 兼容的编译器栈消费;
- IREE 项目(非 TPU 特定)广泛使用 StableHLO 作为入口 IR;
- 多家非 Google 的硬件公司关注和评估 StableHLO。
学习路径
🟢 入门(1–2 天)
- 阅读 StableHLO 官方网站(openxla.org/stablehlo)了解定位和设计目标
- 浏览 GitHub 仓库(github.com/openxla/stablehlo)的 README 和 spec
- 动手体验:用 JAX 导出一个简单模型的 StableHLO IR,观察 IR 结构
🟡 中级(1–2 周)
- 学习 MLIR 基础:阅读 MLIR 官方文档,理解 Dialect、Operation、Pass、Type 等核心概念
- 深入 StableHLO 规范:逐个学习 StableHLO 的核心操作(从 dot_general、convolution、reduce