菜单

后端测试与验证

相关源文件

本文档涵盖了 llama.cpp 中 GGML 后端全面的测试和验证框架。该系统可确保在 CPU、CUDA、Metal、Vulkan 和 SYCL 等多个硬件加速后端之间进行数值一致性、性能验证和梯度正确性。

有关各个后端实现的更多信息,请参阅CPU 后端CUDA 后端Metal 后端Vulkan 后端SYCL 后端。有关核心 GGML 张量库,请参阅GGML 张量库

测试框架架构

后端测试系统主要在 test-backend-ops.cpp 中实现,它提供了一个全面的框架来验证不同后端上的 GGML 操作。该框架确保所有后端对相同的操作产生数值上一致的结果,验证性能特性,并验证自动微分的梯度计算。

测试框架组件

来源tests/test-backend-ops.cpp1-981

测试模式

该框架运行三种不同的模式,每种模式都服务于特定的验证目的

跨后端一致性测试

MODE_TEST 模式验证不同后端对相同的 GGML 操作产生数值上相同的结果。这对于确保不同硬件配置的模型正确性至关重要。

比较使用归一化均方误差 (NMSE) 来验证数值一致性

  • NMSE 阈值:对于大多数操作,默认值为 1e-7
  • NaN 检测:任何 NaN 值都会导致立即失败
  • Infinity 处理:两个后端都必须产生相同符号的 Infinity
  • Sentinel 验证:使用 sentinel 张量进行内存溢出检测

来源tests/test-backend-ops.cpp435-594 tests/test-backend-ops.cpp176-190

性能基准测试

MODE_PERF 模式测量后端之间的操作性能,提供优化和硬件比较的指标。

指标类型测量用途
基于 FLOPS每秒浮点运算次数矩阵运算、卷积
基于内存每秒千兆字节吞吐量内存密集型操作
延迟每操作微秒小型张量运算

性能目标

  • CPU:测量目标为 8 GFLOP
  • GPU:测量目标为 100 GFLOP
  • 最短时长:稳定的测量时长为 1 秒

来源tests/test-backend-ops.cpp596-747

梯度验证

MODE_GRAD 模式使用有限差分法来验证梯度计算,确保自动微分行为的正确性。

来源tests/test-backend-ops.cpp749-981 tests/test-backend-ops.cpp198-223

测试用例实现

基础测试用例结构

所有操作测试都继承自 test_case 基类,它为测试 GGML 操作提供了标准化的接口。

来源tests/test-backend-ops.cpp320-981

张量初始化

该框架提供了强大的张量初始化功能,支持各种数据类型和量化方案。

  • 均匀随机分布:值在可配置的最小/最大边界之间
  • 并行初始化:多线程处理大张量
  • 量化支持:自动量化 Q4_0、Q8_0 和其他格式
  • 类型处理:F32、F16、BF16、整数类型和量化格式

来源tests/test-backend-ops.cpp39-128

跨后端验证流程

后端支持检测

在运行测试之前,该框架会验证后端是否支持所需的操作。

数值比较指标

该框架使用两个主要指标进行数值验证

  1. 归一化均方误差 (NMSE):

    NMSE = MSE(a, b) / MSE(a, 0)
    
    • 相对误差测量
    • 默认阈值:1e-7
    • 与尺度无关的比较
  2. 平均绝对不对称性 (MAA):

    Asymmetry = (a - b) / (a + b)
    MAA = mean(|asymmetry|)
    
    • 在接近零值时表现稳定
    • 默认阈值:1e-4
    • 用于梯度验证

来源tests/test-backend-ops.cpp176-223

基于 Sentinel 的内存验证

该框架通过在测试期间插入在分配的张量之间的 sentinel 张量,实现了复杂的内存溢出检测。

Sentinel 系统架构

Sentinel 在 MODE_TEST 中自动添加,但在性能和梯度模式中禁用,以避免开销。

来源tests/test-backend-ops.cpp388-433

测试组织和执行

测试部分结构

测试文件遵循三部分组织模式

  1. 第一部分:通用设置、实用函数和公共基础设施
  2. 第二部分:GGML 操作定义为测试用例类
  3. 第三部分:测试实例化和执行配置

操作覆盖

该框架涵盖了所有主要的 GGML 操作类别。

操作类别示例测试关键验证
算术test_addtest_multest_div逐元素一致性
矩阵运算test_mul_mattest_out_prod数值精度、性能
卷积test_conv_1dtest_conv_2d空间操作正确性
激活函数test_relutest_gelutest_silu非线性函数精度
归一化test_normtest_rms_norm统计操作精度
量化各种量化矩阵乘法低精度算术验证

来源tests/test-backend-ops.cpp984

与 GGML 后端系统的集成

测试框架与 GGML 后端抽象层深度集成,利用关键组件

  • 后端注册:自动检测可用后端
  • 缓冲区管理ggml_backend_buffer_t 用于内存管理
  • 图计算ggml_backend_graph_compute 用于操作执行
  • 设备抽象ggml_backend_dev_t 用于硬件特定优化

这种集成确保了验证涵盖了从高级操作到硬件特定实现的所有软件堆栈。

来源ggml/src/ggml-backend.cpp327-351 ggml/include/ggml-backend.h100-106