测试框架¶
本文引用的文件 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc - xla/hlo/pass/hlo_pass_pipeline_test.cc - xla/backends/gpu/transforms/alias_passthrough_params_test.cc - xla/tools/multihost_hlo_runner/functional_hlo_runner.cc - xla/tools/multihost_hlo_runner/create_client.cc - xla/tools/multihost_hlo_runner/BUILD - xla/tools/multihost_hlo_runner/data/sharded_2_devices.hlo - xla/tools/multihost_hlo_runner/data/single_device.hlo - xla/tools/multihost_hlo_runner/data/fp8_gemm_loop.hlo - xla/tools/multihost_hlo_runner/data/transformer_engine_softmax.hlo - xla/tools/multihost_hlo_runner/data/multiple_gemm_fusions.hlo - xla/tools/multihost_hlo_runner/data/auto_layout.hlo - xla/tools/multihost_hlo_runner/data/sharded_computation.hlo - xla/tools/multihost_hlo_runner/data/while_with_known_trip_count.hlo - xla/tools/multihost_hlo_runner/data/fixed_layout.hlo - xla/tools/multihost_hlo_runner/data/dynamic_shaped_arguments.hlo - xla/tools/multihost_hlo_runner/data/single_device_tupled.hlo - xla/tools/multihost_hlo_runner/data/single_gemm_fusion.hlo - xla/tools/multihost_hlo_runner/data/sharded_16_devices.hlo - xla/tools/multihost_hlo_runner/data/sharded_unoptimized_hlo_snapshot.pbtxt
目录¶
简介¶
本文件系统性梳理 XLA 的测试体系,覆盖单元测试、集成测试、HLO 传递测试与多主机 HLO 运行器(Multi-Host HLO Runner)的架构、测试用例编写规范与执行流程,并提供可操作的测试示例路径、测试数据准备、断言方法与结果验证技巧。同时记录持续集成与性能回归检测相关实践,帮助开发者高效编写与维护高质量测试。
项目结构¶
XLA 的测试分布在多个层次: - 文档层:提供 HLO 传递测试与多主机 HLO 运行器使用指南 - 单元测试层:以 GoogleTest/GMock 为主,覆盖 HLO 传递流水线、后端特定变换等 - 集成测试层:通过多主机 HLO 运行器在真实硬件或仿真环境下执行复杂 HLO 模块 - 工具与数据层:提供运行器、测试数据集与构建脚本
graph TB
subgraph "文档"
D1["docs/test_hlo_passes.md"]
D2["docs/tools_multihost_hlo_runner.md"]
end
subgraph "单元测试"
U1["xla/hlo/pass/hlo_pass_pipeline_test.cc"]
U2["xla/backends/gpu/transforms/alias_passthrough_params_test.cc"]
U3["xla/tests/xla_test_backend_predicates.{h,cc}"]
end
subgraph "集成测试工具"
T1["xla/tools/multihost_hlo_runner/functional_hlo_runner.cc"]
T2["xla/tools/multihost_hlo_runner/create_client.cc"]
T3["xla/tools/multihost_hlo_runner/BUILD"]
end
subgraph "测试数据"
DATA["xla/tools/multihost_hlo_runner/data/*.hlo<br/>*.pbtxt"]
end
D1 --> U1
D1 --> U2
D2 --> T1
D2 --> T2
T1 --> DATA
T2 --> DATA
U3 --> U1
U3 --> U2
图示来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/hlo/pass/hlo_pass_pipeline_test.cc - xla/backends/gpu/transforms/alias_passthrough_params_test.cc - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc - xla/tools/multihost_hlo_runner/functional_hlo_runner.cc - xla/tools/multihost_hlo_runner/create_client.cc - xla/tools/multihost_hlo_runner/BUILD
章节来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md
核心组件¶
- HLO 传递测试规范与工具链:基于 FileCheck/LIT 的 HLO 传递测试方法,支持 CHECK 前缀与自动化生成脚本
- 多主机 HLO 运行器:支持单进程/多进程、单节点/多节点复现 HLO,便于集成测试与回归验证
- 后端谓词与参数化测试:通过环境变量驱动的后端谓词,实现跨设备/后端的条件跳过与参数化
- HLO 传递流水线单元测试:验证模块级传递的变更、不变与不变式检查器行为
章节来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc - xla/hlo/pass/hlo_pass_pipeline_test.cc
架构总览¶
下图展示了测试框架的整体架构:文档指导层、测试实现层、工具与数据层之间的关系,以及关键执行路径。
graph TB
A["HLO 传递测试规范<br/>docs/test_hlo_passes.md"] --> B["GoogleTest/GMock 测试套件"]
B --> C["HLO 传递流水线单元测试<br/>hlo_pass_pipeline_test.cc"]
B --> D["后端特定变换测试<br/>alias_passthrough_params_test.cc"]
E["多主机 HLO 运行器<br/>tools/multihost_hlo_runner"] --> F["运行器入口<br/>functional_hlo_runner.cc"]
E --> G["客户端创建<br/>create_client.cc"]
E --> H["测试数据集<br/>data/*.hlo, *.pbtxt"]
I["后端谓词库<br/>xla_test_backend_predicates.{h,cc}"] --> B
I --> E
图示来源 - docs/test_hlo_passes.md - xla/hlo/pass/hlo_pass_pipeline_test.cc - xla/backends/gpu/transforms/alias_passthrough_params_test.cc - xla/tools/multihost_hlo_runner/functional_hlo_runner.cc - xla/tools/multihost_hlo_runner/create_client.cc - xla/tools/multihost_hlo_runner/data/sharded_2_devices.hlo - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc
详细组件分析¶
HLO 传递测试(FileCheck/LIT)¶
- 测试风格
- 使用 FileCheck 在输入 HLO 中内联 CHECK 行,统一使用“// CHECK”作为分隔符
- 推荐将 CHECK 与输入 IR 局部对齐,提升可读性与可维护性
- 对于 GPU 测试,可结合 LIT 运行器与 hlo-opt,按后端目标生成对应前缀的 CHECK
- 自动化辅助
- 提供 generate_hlo_test_checks.py 脚本,自动插入 CHECK 指令,需人工复核一致性
- 不推荐的做法
- 避免遍历结果图进行逐节点匹配,此类测试难以阅读与调试
flowchart TD
Start(["开始:编写 HLO 输入"]) --> InlineCheck["内联 CHECK 指令<br/>使用 // CHECK"]
InlineCheck --> RunOpt["运行 hlo-opt 或 Pass 流水线"]
RunOpt --> Compare["比对输出与 CHECK"]
Compare --> AutoGen{"是否使用自动生成脚本?"}
AutoGen --> |是| ManualReview["人工复核生成的 CHECK"]
AutoGen --> |否| Proceed["直接使用手写 CHECK"]
ManualReview --> Pass{"全部匹配?"}
Proceed --> Pass
Pass --> |是| Ok["测试通过"]
Pass --> |否| Fix["修正 HLO/Pass 或更新 CHECK"]
Fix --> InlineCheck
图示来源 - docs/test_hlo_passes.md
章节来源 - docs/test_hlo_passes.md
多主机 HLO 运行器(集成测试)¶
- 功能概述
- 支持在单 GPU 或多 GPU 上运行 HLO 模块;可仅编译不运行
- 支持单进程与多进程(MPI/SLURM),单节点与多节点场景
- 关键参数
- --run=false:仅编译,必要时可利用持久化自动调优缓存
- --hlo_argument_mode=uninitialized:减少初始化开销与主机内存占用
- --run_xla_backend_only 或 --xla_disable_all_hlo_passes:避免重复编译导致的错误
- 典型流程
- 从模型导出 HLO(before/after 优化)
- 使用运行器在目标拓扑上复现,校验数值与性能指标
sequenceDiagram
participant Dev as "开发者"
participant Dump as "HLO 导出"
participant Runner as "多主机 HLO 运行器"
participant Client as "客户端/分布式初始化"
participant GPU as "GPU 设备"
Dev->>Dump : "导出 HLObefore/after 优化"
Dump-->>Dev : "得到 .hlo / .pbtxt"
Dev->>Runner : "传入 HLO 文件与参数"
Runner->>Client : "初始化 PJRT/NCCL 客户端"
Client->>GPU : "分配设备/拓扑"
Runner->>GPU : "编译并执行 HLO"
GPU-->>Runner : "返回结果/时间"
Runner-->>Dev : "输出日志/指标"
图示来源 - docs/tools_multihost_hlo_runner.md - xla/tools/multihost_hlo_runner/functional_hlo_runner.cc - xla/tools/multihost_hlo_runner/create_client.cc
章节来源 - docs/tools_multihost_hlo_runner.md
后端谓词与参数化测试¶
- 目标
- 基于环境变量(XLA_TEST_DEVICE、XLA_TEST_DEVICE_TYPE、XLA_TEST_MODIFIERS)判断当前后端,动态启用/禁用测试或参数化输入
- 常用谓词
- DeviceIs/DeviceTypeIs/HasModifiers/BackendLike/BackendIsExactly/BackendIsStrict
- BackendSupportsFloat64/BackendSupportsComplex128
- Empty
() 用于参数化测试中生成空输入集合 - 使用建议
- 在测试套件中通过谓词包裹条件逻辑,必要时配合 GTEST_SKIP()/GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST()
flowchart TD
Env["读取环境变量<br/>XLA_TEST_*"] --> Pred["谓词函数计算"]
Pred --> Decision{"满足条件?"}
Decision --> |是| Enable["启用测试/参数化"]
Decision --> |否| Skip["跳过测试/空参数化"]
图示来源 - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc
章节来源 - xla/tests/xla_test_backend_predicates.h - xla/tests/xla_test_backend_predicates.cc
HLO 传递流水线单元测试¶
- 测试要点
- 验证模块级传递是否改变图结构(changed/unchanged)
- 异步线程执行流中的传递应用范围
- 不变式检查器(Invariant Checker)在流水线中的失败传播
- 传递元数据(Pass Metadata)的设置与校验
- 示例参考
- 模块名重命名传递、根指令名称反转、混合流水线、不变式检查器失败、无变更场景
sequenceDiagram
participant Test as "测试用例"
participant Pipeline as "HloPassPipeline"
participant Pass1 as "FooToBarModulePass"
participant Pass2 as "BazToQuxModulePass"
participant Checker as "BarBlowerUpper(不变式)"
Test->>Pipeline : "AddPass/FooToBarModulePass"
Test->>Pipeline : "AddPass/BazToQuxModulePass"
Test->>Pipeline : "AddInvariantChecker/BarBlowerUpper"
Pipeline->>Pass1 : "RunImpl(module)"
Pass1-->>Pipeline : "changed=true/false"
Pipeline->>Pass2 : "RunImpl(module)"
Pass2-->>Pipeline : "changed=true/false"
Pipeline->>Checker : "RunImpl(module)"
Checker-->>Pipeline : "OK 或返回错误"
Pipeline-->>Test : "返回状态与变更标志"
图示来源 - xla/hlo/pass/hlo_pass_pipeline_test.cc
章节来源 - xla/hlo/pass/hlo_pass_pipeline_test.cc
后端特定变换测试(示例:GPU 别名透传参数)¶
- 目标
- 验证别名透传参数变换在 tuple 输出中的行为,确保不会对同一参数建立多重别名
- 断言要点
- 通过 input_output_alias_config 获取别名映射,断言参数到参数的别名关系
- 预设别名场景下的行为一致性
flowchart TD
Parse["解析 HLO 模块"] --> Apply["运行 AliasPassthroughParams 变换"]
Apply --> Config["读取 input_output_alias_config"]
Config --> Assert1["断言 p0 -> p0 映射"]
Config --> Assert2["断言输出未别名 p1若适用"]
Assert1 --> Done["测试完成"]
Assert2 --> Done
图示来源 - xla/backends/gpu/transforms/alias_passthrough_params_test.cc
章节来源 - xla/backends/gpu/transforms/alias_passthrough_params_test.cc
依赖关系分析¶
- 组件耦合
- HLO 传递测试依赖文档规范与工具链(FileCheck/LIT/generate_hlo_test_checks.py)
- 多主机运行器依赖 PJRT/NCCL 客户端与测试数据集
- 后端谓词为所有测试提供统一的后端感知能力
- 外部依赖
- GoogleTest/GMock 用于单元测试
- Bazel 构建系统管理测试目标与运行器构建
graph LR
Docs["HLO 传递测试规范"] --> Tests["单元测试"]
Tools["多主机运行器"] --> IntTests["集成测试"]
Pred["后端谓词库"] --> Tests
Pred --> IntTests
Tests --> Data["测试数据集"]
IntTests --> Data
图示来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/tests/xla_test_backend_predicates.h - xla/tools/multihost_hlo_runner/BUILD
章节来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/tools/multihost_hlo_runner/BUILD
性能考量¶
- 测试数据准备
- 使用 --hlo_argument_mode=uninitialized 减少初始化成本
- 优先选择代表性 HLO(如单设备/多设备、融合/非融合、动态形状等)
- 执行策略
- 将高成本 HLO 仅在 CI 的专用阶段运行,或按后端谓词条件化执行
- 对 GPU 场景,合理设置 CUDA_VISIBLE_DEVICES 与 NCCL 参数
- 回归检测
- 结合运行器输出的时间戳与吞吐指标,建立阈值告警
- 对关键算子(如 GEMM、softmax)建立基准集,定期对比
[本节为通用指导,无需列出具体文件来源]
故障排查指南¶
- 多主机运行器常见问题
- GPU 数量不足或 CUDA_VISIBLE_DEVICES 设置错误:检查设备可见性与数量
- 运行优化后 HLO 报错:使用 --xla_disable_all_hlo_passes 或 --run_xla_backend_only
- 多进程/多节点:确认 MPI/SLURM 环境变量传递正确
- HLO 传递测试
- CHECK 不匹配:使用 generate_hlo_test_checks.py 生成候选 CHECK,再人工核对
- 不变式检查器失败:定位失败传递并修正 PASS 名称或 HLO 输入
- 后端谓词
- 环境变量缺失:确保通过 xla_test 宏设置 XLA_TEST_DEVICE/TYPE/MODIFIERS
章节来源 - docs/tools_multihost_hlo_runner.md - docs/test_hlo_passes.md - xla/tests/xla_test_backend_predicates.cc
结论¶
XLA 测试框架以文档规范为纲、以 GoogleTest 为核心、以多主机运行器为集成验证手段,辅以后端谓词与丰富的测试数据集,形成覆盖单元、传递与集成的完整测试体系。遵循本文的编写规范与执行流程,可显著提升测试质量与可维护性,并为持续集成与性能回归检测提供可靠支撑。
[本节为总结性内容,无需列出具体文件来源]
附录¶
测试用例编写规范速查¶
- HLO 传递测试
- 内联 CHECK,使用“// CHECK”
- 优先采用 LIT+FileCheck 流程
- 自动生成 CHECK 后务必人工复核
- 多主机运行器
- 明确 HLO 类型(before/after 优化)
- 正确设置 --run/--run_xla_backend_only/--hlo_argument_mode
- 多进程场景下确保环境变量传递
- 后端谓词
- 使用谓词控制测试启用/跳过
- 参数化测试中使用 Empty
() 生成空输入集
章节来源 - docs/test_hlo_passes.md - docs/tools_multihost_hlo_runner.md - xla/tests/xla_test_backend_predicates.h
测试数据清单(示例)¶
- 单设备/多设备 HLO
- single_device.hlo
- sharded_2_devices.hlo
- sharded_16_devices.hlo
- 特定算子/模式
- single_gemm_fusion.hlo
- multiple_gemm_fusions.hlo
- fp8_gemm_loop.hlo
- transformer_engine_softmax.hlo
- 布局与形状
- auto_layout.hlo
- fixed_layout.hlo
- dynamic_shaped_arguments.hlo
- 复杂控制流
- while_with_known_trip_count.hlo
- 组合/嵌套
- sharded_computation.hlo
- single_device_tupled.hlo
- 未优化快照
- sharded_unoptimized_hlo_snapshot.pbtxt
章节来源 - xla/tools/multihost_hlo_runner/data/single_device.hlo - xla/tools/multihost_hlo_runner/data/sharded_2_devices.hlo - xla/tools/multihost_hlo_runner/data/sharded_16_devices.hlo - xla/tools/multihost_hlo_runner/data/single_gemm_fusion.hlo - xla/tools/multihost_hlo_runner/data/multiple_gemm_fusions.hlo - xla/tools/multihost_hlo_runner/data/fp8_gemm_loop.hlo - xla/tools/multihost_hlo_runner/data/transformer_engine_softmax.hlo - xla/tools/multihost_hlo_runner/data/auto_layout.hlo - xla/tools/multihost_hlo_runner/data/fixed_layout.hlo - xla/tools/multihost_hlo_runner/data/dynamic_shaped_arguments.hlo - xla/tools/multihost_hlo_runner/data/while_with_known_trip_count.hlo - xla/tools/multihost_hlo_runner/data/sharded_computation.hlo - xla/tools/multihost_hlo_runner/data/single_device_tupled.hlo - xla/tools/multihost_hlo_runner/data/sharded_unoptimized_hlo_snapshot.pbtxt