IREE项目测试指南:从编译器到运行时的完整测试体系

IREE项目测试指南:从编译器到运行时的完整测试体系

【免费下载链接】iree A retargetable MLIR-based machine learning compiler and runtime toolkit. 【免费下载链接】iree 项目地址: https://gitcode.com/GitHub_Trending/ire/iree

测试体系概述

IREE项目的测试系统是一个精心设计的多层次验证框架,它确保了从编译器前端到运行时后端各个组件的正确性和稳定性。本文将深入解析IREE的测试架构,帮助开发者理解和使用这套系统。

测试类型矩阵

IREE的测试分为三大类别,每种类型针对不同的开发阶段和组件:

测试类型测试工具构建系统支持运行平台
编译器测试iree_lit_testBazel/CMake主机平台
运行时测试iree_cc_testBazel/CMake主机/设备
iree_native_testBazel/CMake主机/设备
iree_hal_cts_test_suiteCMake主机/设备
核心端到端测试iree_check_testBazel/CMake主机/设备
iree_static_linker_testCMake主机/设备

编译器测试详解

编译器测试是验证IREE编译管道正确性的第一道防线,采用与MLIR相同的lit测试框架。

测试文件组织规范

IREE遵循一套清晰的测试文件组织规范:

  • 操作符打印和解析测试:.../IR/test/{OP_CATEGORY}_ops.mlir
  • 折叠和规范化测试:.../IR/test/{OP_CATEGORY}_folding.mlir
  • 编译器传递和管道测试:其他.../test/*.mlir文件

测试执行方法

以测试文件arithmetic_ops.mlir为例:

CMake方式(在构建目录执行):

ctest -R iree/compiler/Dialect/VM/Conversion/MathToVM/test/arithmetic_ops.mlir.test

Bazel方式(在项目根目录执行):

bazel test //compiler/src/iree/compiler/Dialect/VM/Conversion/MathToVM/test:arithmetic_ops.mlir.test

编写新测试的建议

  1. 使用.mlir文件格式,放置在待测试功能相邻的test目录中
  2. 使用iree-opt而非mlir-opt工具,因为它已注册IREE特有的方言和传递
  3. 遵循MLIR测试指南,但避免对运行时产生依赖

构建系统配置示例

Bazel配置

load("//iree/build_tools/bazel:iree_lit_test.bzl", "iree_lit_test_suite")

iree_lit_test_suite(
    name = "lit",
    srcs = glob(["*.mlir"]),
    tools = [
        "@llvm-project//llvm:FileCheck",
        "//tools:iree-opt",
    ],
)

CMake对应配置

iree_lit_test_suite(
  NAME
    lit
  SRCS
    "arithmetic_ops.mlir"
  DATA
    FileCheck
    iree-opt
)

运行时测试深度解析

运行时测试采用GoogleTest框架,验证IREE运行时C++代码的正确性。

测试环境配置技巧

  1. 并行测试加速

    export CTEST_PARALLEL_LEVEL=$(nproc)
    
  2. Vulkan后端选择

    • SwiftShader与原生硬件设备间的切换
    • 通过环境变量控制实现(详见Vulkan环境设置文档)

测试编写最佳实践

  1. 测试文件应与源文件对应:foo_test.cc测试foo.cc
  2. 包含头文件:#include "iree/testing/gtest.h"
  3. 避免对编译器产生依赖
  4. 使用标准gtest主函数:链接iree/testing:gtest_main

构建配置示例

Bazel配置

cc_test(
    name = "arena_test",
    srcs = ["arena_test.cc"],
    deps = [
        ":arena",
        "//iree/testing:gtest_main",
    ],
)

CMake对应配置

iree_cc_test(
  NAME
    arena_test
  SRCS
    "arena_test.cc"
  DEPS
    ::arena
    iree::testing::gtest_main
)

端到端(E2E)测试全攻略

E2E测试验证从编译器输入到运行时执行的完整流程,是IREE的核心验证手段。

测试构建准备

使用CMake时需要特别构建测试依赖:

cmake --build . --target iree-test-deps

对于模型测试,还需配置:

-DIREE_BUILD_E2E_TEST_ARTIFACTS=ON

测试示例解析

典型的E2E测试MLIR文件结构:

func.func @tensor() {
  %input = util.unfoldable_constant dense<[0.0, 1.1, 2.5, 4.9]> : tensor<4xf32>
  %result = "mhlo.floor"(%input) : (tensor<4xf32>) -> tensor<4xf32>
  check.expect_almost_eq_const(%result, dense<[0.0, 1.0, 2.0, 4.0]> : tensor<4xf32>): tensor<4xf32>
  return
}

关键点:

  1. 使用util.unfoldable_constant防止常量折叠
  2. 通过check.expect_almost_eq_const进行近似值断言
  3. 每个公开函数对应一个测试用例

多平台测试套件配置

单后端/驱动组合

iree_check_single_backend_test_suite(
    name = "check_vmvx_local-task",
    srcs = glob(["*.mlir"]),
    driver = "local-task",
    target_backend = "vmvx",
)

多后端/驱动组合

iree_check_test_suite(
    name = "check",
    srcs = ["success.mlir"],
    target_backends_and_drivers = [
        ("vmvx", "local-task"),
        ("vulkan-spirv", "vulkan"),
    ],
)

外部测试套件扩展

对于大型模型和测试集合,IREE支持外部测试套件集成。

测试案例结构

典型目录结构:

test_case_name/
  model.mlir        # MLIR模型定义
  input_0.npy       # 输入数据
  output_0.npy      # 预期输出
  test_data_flags.txt # 测试参数

测试执行流程

基本执行命令:

iree-compile model.mlir {flags} -o model.vmfb
iree-run-module --module=model.vmfb --flagfile=test_data_flags.txt

配置管理

通过JSON文件配置测试参数,例如CPU测试配置:

{
  "description": "ONNX tests for CPU",
  "driver": "local-task",
  "target_backend": "llvm-cpu",
  "timeout": 900,
  "test_suites": [
    "onnx"
  ]
}

测试开发建议

  1. 分层测试:从单元测试到集成测试逐步扩大范围
  2. 平台覆盖:考虑不同后端和驱动的组合情况
  3. 性能考量:大型测试合理设置超时时间
  4. 可维护性:保持测试代码与生产代码同等质量
  5. 文档配套:为复杂测试添加必要的说明注释

通过这套完整的测试体系,IREE项目确保了从编译器到运行时各个组件的可靠性和稳定性,为开发者提供了坚实的质量保障基础。

【免费下载链接】iree A retargetable MLIR-based machine learning compiler and runtime toolkit. 【免费下载链接】iree 项目地址: https://gitcode.com/GitHub_Trending/ire/iree

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值