序列化与格式¶
本文引用的文件 - xla.proto - xla_data.proto - protobuf_util.h - protobuf_util.cc - hlo.proto - hlo_dumps.md - debug_options_flags.h - debug_options_flags.cc - autotuner_cache.proto - autotuner.cc - file_based_autotuner_cache.cc - hlo_benchmark_runner.cc - metadata_collector.cc - metadata_utils.h - core/host_offloading/host_offloading_executable.proto - pjrt_c_api_shardings_extension.h - pjrt_layout_serdes.proto - executable_metadata.proto - xla_host_callback.proto - xla_sharding.proto - stream_executor_executable.proto - autotune_results.proto - autotuning.proto - autotune_result_wrapper.cc - autotune_result_wrapper.h - text_literal_reader.h - text_literal_writer.h - text_literal_reader.cc - text_literal_writer.cc - packed_literal_reader.h - packed_literal_reader.cc - sort_json.h - sort_json.cc - shape_util.proto - shape_util.h - shape_util.cc - shape_util_test.cc - shape_pool.h - shape_pool.cc - shape_pool_test.cc - literal_util.h - literal_util.cc - literal_util_test.cc - literal_pool.h - literal_pool.cc - literal_pool_test.cc - runtime/large_hlo_snapshot_serialization/large_hlo_snapshot_serialization.h - runtime/large_hlo_snapshot_serialization/large_hlo_snapshot_serialization.cc
目录¶
引言¶
本文件面向XLA中间表示(HLO)的序列化与格式系统,系统性阐述以下内容: - HLO计算图的序列化格式与二进制编码规范 - 可移植API设计与跨平台传输能力 - HLO模块的元数据存储、版本管理与兼容性策略 - 序列化过程中的完整性校验、压缩与性能优化 - 反序列化的错误处理、回退机制与调试支持 - 不同格式之间的转换规则与限制条件 - 序列化与反序列化的最佳实践与性能建议
项目结构¶
围绕序列化与格式的关键目录与文件如下: - 协议缓冲区定义:xla.proto、xla_data.proto、service/hlo.proto、各后端与工具的proto - 序列化工具:protobuf_util.、large_hlo_snapshot_serialization. - 文本/打包读写:text_literal_reader/writer.、packed_literal_reader/writer. - 元数据与调试:hlo_dumps.md、debug_options_flags.、metadata_collector.、metadata_utils.h - 自动调优缓存:autotuner_cache.proto、autotuner.cc、file_based_autotuner_cache.cc、autotune_result_wrapper.*
graph TB
subgraph "协议定义"
XLA["xla.proto"]
DATA["xla_data.proto"]
HLO["service/hlo.proto"]
AUTOCACHE["backends/autotuner/autotuner_cache.proto"]
AUTORES["autotune_results.proto"]
AUTOCONF["autotuning.proto"]
end
subgraph "序列化工具"
PBUTIL_H["protobuf_util.h"]
PBUTIL_CC["protobuf_util.cc"]
LARGE_SNAP["runtime/large_hlo_snapshot_serialization.*"]
end
subgraph "文本与打包"
TXTREAD["text_literal_reader.*"]
TXTWR["text_literal_writer.*"]
PACKR["packed_literal_reader.*"]
end
subgraph "元数据与调试"
DUMPS["docs/hlo_dumps.md"]
DBGFLAGS["debug_options_flags.*"]
METACOL["backends/profiler/cpu/metadata_collector.cc"]
METAUTIL["backends/profiler/cpu/metadata_utils.h"]
end
XLA --- DATA
XLA --- HLO
AUTOCACHE --- AUTORES
AUTOCACHE --- AUTOCONF
PBUTIL_H --> PBUTIL_CC
LARGE_SNAP --- HLO
TXTREAD --- DATA
TXTWR --- DATA
PACKR --- DATA
DUMPS --- HLO
DBGFLAGS --- XLA
METACOL --- HLO
METAUTIL --- HLO
图表来源 - xla.proto - xla_data.proto - hlo.proto - autotuner_cache.proto - autotune_results.proto - autotuning.proto - protobuf_util.h - protobuf_util.cc - large_hlo_snapshot_serialization.h - large_hlo_snapshot_serialization.cc - text_literal_reader.h - text_literal_writer.h - packed_literal_reader.h - hlo_dumps.md - debug_options_flags.h - debug_options_flags.cc - metadata_collector.cc - metadata_utils.h
章节来源 - xla.proto - xla_data.proto - hlo.proto - hlo_dumps.md
核心组件¶
- 协议缓冲区定义
- xla.proto:包含调试选项、执行选项、设备句柄等,支撑跨平台编译与运行配置
- xla_data.proto:定义基础类型、形状、布局、字面量、收集通信参数等核心数据结构
- service/hlo.proto:定义HLO模块、指令、配置等服务层结构
- 序列化工具
- protobuf_util.*:提供基于序列化的消息比较与哈希,确保一致性与稳定性
- large_hlo_snapshot_serialization.*:针对大型快照的序列化封装
- 文本与打包读写
- text_literal_reader/writer.*:文本形式的字面量读写
- packed_literal_reader.*:紧凑二进制字面量读取
- 元数据与调试
- hlo_dumps.md:描述HloProto等转储格式
- debug_options_flags.*:调试标志与兼容性控制
- metadata_collector.*、metadata_utils.h:将HloProto注入到分析/可视化流程
章节来源 - xla.proto - xla_data.proto - protobuf_util.h - protobuf_util.cc - hlo_dumps.md - debug_options_flags.h - debug_options_flags.cc - metadata_collector.cc - metadata_utils.h
架构总览¶
下图展示XLA序列化与格式系统在编译与运行阶段的交互关系。
graph TB
A["前端/框架"] --> B["HLO模块构建<br/>service/hlo.proto"]
B --> C["序列化为HloProto<br/>xla_data.proto/LiteralProto"]
C --> D["持久化/传输<br/>文件/网络"]
D --> E["反序列化/加载<br/>protobuf_util.*"]
E --> F["执行/分析<br/>DebugOptions/ExecutionOptions"]
F --> G["元数据采集与可视化<br/>metadata_collector.cc"]
F --> H["自动调优缓存<br/>autotuner_cache.proto"]
图表来源 - hlo.proto - xla_data.proto - protobuf_util.h - protobuf_util.cc - metadata_collector.cc - autotuner_cache.proto
详细组件分析¶
组件A:HLO模块与指令序列化(HloProto)¶
- 结构要点
- HLO模块通过service/hlo.proto定义,包含指令列表、入口点、配置等
- 字面量通过xla_data.proto中的LiteralProto进行序列化,覆盖多种原生类型与稀疏编码
- 编码规范
- 使用Protocol Buffers标准二进制编码;字段顺序与默认值遵循proto3语义
- 字面量按类型分字段存储,小端序编码,稀疏索引与值分离
- 跨平台传输
- 通过xla.proto中的ExecutionOptions携带DebugOptions,确保跨平台行为一致
- 支持压缩转储(如xla_dump_compress_protos),降低带宽占用
sequenceDiagram
participant FE as "前端"
participant HLO as "HLO模块(service/hlo.proto)"
participant SER as "序列化(xla_data.proto)"
participant IO as "文件/网络"
participant DES as "反序列化(protobuf_util.*)"
FE->>HLO : 构建HLO模块
HLO->>SER : 生成HloProto/LiteralProto
SER->>IO : 写入二进制/文本
IO-->>DES : 读取序列化数据
DES-->>HLO : 反序列化为内存对象
图表来源 - hlo.proto - xla_data.proto - protobuf_util.h - protobuf_util.cc
章节来源 - hlo.proto - xla_data.proto - xla.proto
组件B:字面量序列化与文本/打包读写¶
- 字面量序列化
- LiteralProto覆盖布尔、整数、浮点、复数、稀疏索引等字段
- 小端序存储,FP16/BF16/U16/S16等字段明确编码方式
- 文本读写
- text_literal_reader/writer.*提供人类可读文本格式,便于调试与审计
- 打包读取
- packed_literal_reader.*用于高性能场景下的紧凑二进制读取
flowchart TD
Start(["开始"]) --> CheckFmt["选择读写格式<br/>文本/打包/二进制"]
CheckFmt --> Text["文本读写<br/>text_literal_reader/writer"]
CheckFmt --> Packed["打包读取<br/>packed_literal_reader"]
CheckFmt --> Binary["二进制读写<br/>LiteralProto"]
Text --> End(["结束"])
Packed --> End
Binary --> End
图表来源 - xla_data.proto - text_literal_reader.h - text_literal_writer.h - packed_literal_reader.h
章节来源 - xla_data.proto - text_literal_reader.cc - text_literal_writer.cc - packed_literal_reader.cc
组件C:元数据与调试(HloProto转储与可视化)¶
- 转储格式
- hlo_dumps.md指出HloProto为结构化转储格式,支持文本/二进制/HTML等多种输出
- 元数据采集
- metadata_collector.cc将HloProto注入到分析平面,metadata_utils.h提供统计与可视化接口
- 调试选项
- debug_options_flags.*提供大量调试开关,影响序列化/转储行为与验证策略
sequenceDiagram
participant RUN as "运行时"
participant DUMP as "转储(hlo_dumps.md)"
participant META as "元数据(metadata_collector.cc)"
participant VIS as "可视化(metadata_utils.h)"
RUN->>DUMP : 生成HloProto转储
DUMP->>META : 注入HloProto
META->>VIS : 提供统计/可视化
图表来源 - hlo_dumps.md - metadata_collector.cc - metadata_utils.h - debug_options_flags.h
章节来源 - hlo_dumps.md - metadata_collector.cc - metadata_utils.h - debug_options_flags.cc
组件D:自动调优结果的序列化与缓存¶
- 结构
- autotuner_cache.proto定义缓存键/值序列化结构
- autotuner.cc在自动调优过程中序列化结果并写入缓存
- file_based_autotuner_cache.cc提供文件级序列化/反序列化实现
- autotune_result_wrapper.*对键/值进行确定性序列化
- 版本与兼容性
- 通过proto字段编号与保留字段维持向后兼容
- 支持不同后端与平台的序列化差异
sequenceDiagram
participant AT as "自动调优器(autotuner.cc)"
participant WRAP as "结果包装(autotune_result_wrapper.*)"
participant CACHE as "缓存(file_based_autotuner_cache.cc)"
participant PROTO as "autotuner_cache.proto"
AT->>WRAP : 序列化键/值
WRAP-->>PROTO : 确定性序列化
PROTO->>CACHE : 写入/读取缓存
CACHE-->>AT : 返回序列化结果
图表来源 - autotuner.cc - autotuner.cc - autotuner_cache.proto - file_based_autotuner_cache.cc - autotune_result_wrapper.cc
章节来源 - autotuner.cc - autotuner.cc - autotuner_cache.proto - file_based_autotuner_cache.cc - autotune_result_wrapper.cc
组件E:大型快照序列化(大体积HLO)¶
- 需求背景
- 大型HLO模块在转储/传输时可能超出单文件或内存限制
- 实现思路
- large_hlo_snapshot_serialization.*提供分块/流式序列化能力,结合压缩与校验
- 与HloProto配合,支持超大规模图的稳定落盘与传输
flowchart TD
A["HLO模块"] --> B["分块/流式序列化"]
B --> C["压缩/校验"]
C --> D["持久化/传输"]
D --> E["恢复/反序列化"]
图表来源 - large_hlo_snapshot_serialization.h - large_hlo_snapshot_serialization.cc
章节来源 - large_hlo_snapshot_serialization.h - large_hlo_snapshot_serialization.cc
依赖关系分析¶
- 协议依赖
- xla.proto导入xla_data.proto与service/hlo.proto,形成“配置-数据-模块”的层级
- 各后端与工具(如PJRT、自动调优)通过proto导入使用核心数据结构
- 工具依赖
- protobuf_util.*被广泛用于一致性校验与哈希
- 文本/打包读写与字面量序列化紧密耦合
- 运行期依赖
- DebugOptions/ExecutionOptions贯穿序列化/转储/执行链路
- 元数据采集与可视化依赖HloProto注入
graph LR
XLA["xla.proto"] --> DATA["xla_data.proto"]
XLA --> HLO["service/hlo.proto"]
DATA --> TXT["text_literal_reader/writer.*"]
DATA --> PACK["packed_literal_reader.*"]
DATA --> PBUTIL["protobuf_util.*"]
HLO --> DUMP["hlo_dumps.md"]
HLO --> META["metadata_collector.cc"]
HLO --> AUTOCACHE["autotuner_cache.proto"]
图表来源 - xla.proto - xla_data.proto - hlo.proto - protobuf_util.h - text_literal_reader.h - text_literal_writer.h - packed_literal_reader.h - hlo_dumps.md - metadata_collector.cc - autotuner_cache.proto
章节来源 - xla.proto - xla_data.proto - hlo.proto - protobuf_util.h
性能考量¶
- 序列化开销
- 使用确定性序列化(protobuf_util.*)避免字段顺序差异导致的不必要比较
- 对大型HLO采用分块/流式序列化与压缩,降低I/O与内存峰值
- 压缩策略
- 支持转储压缩(如xla_dump_compress_protos),显著减少磁盘占用
- 读写路径
- 文本格式适合调试与审计;打包/二进制格式适合高吞吐传输
- 并发与缓存
- 自动调优缓存序列化结果,避免重复计算;文件级缓存提供快速命中
[本节为通用性能讨论,无需特定文件引用]
故障排查指南¶
- 反序列化错误
- 检查序列化格式一致性(protobuf_util.*提供比较与哈希工具)
- 核对字段编号与保留字段,避免破坏向后兼容
- 转储问题
- 确认hlo_dumps.md中格式选择与目标环境匹配
- 使用debug_options_flags.*调整验证级别与日志级别
- 自动调优缓存
- 若缓存损坏,清理后重新生成;确认autotuner_cache.proto字段编号正确
- 使用autotune_result_wrapper.*确保键/值序列化确定性
章节来源 - protobuf_util.h - protobuf_util.cc - hlo_dumps.md - debug_options_flags.h - autotuner_cache.proto - autotune_result_wrapper.cc
结论¶
XLA的序列化与格式系统以Protocol Buffers为核心,结合确定性序列化、压缩与分块策略,在保证跨平台一致性的同时兼顾性能与可维护性。通过完善的元数据采集与调试工具链,系统实现了从编译到执行的全链路可观测与可控。
[本节为总结性内容,无需特定文件引用]
附录¶
- 最佳实践
- 优先使用二进制序列化进行生产传输,文本格式仅用于调试
- 对大型HLO启用分块/流式序列化与压缩
- 使用protobuf_util.*进行一致性校验,避免因字段顺序差异引发的问题
- 在跨平台部署中,严格管理xla.proto中的调试与执行选项,确保行为一致
- 转换规则与限制
- 字面量序列化严格遵循xla_data.proto的字段与编码约定
- HloProto与文本/打包格式之间存在严格的解析与生成规则
- 自动调优缓存的键/值序列化需保持确定性,避免运行时差异
[本节为通用指导,无需特定文件引用]