本文档涵盖了 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) 来验证数值一致性
1e-7来源:tests/test-backend-ops.cpp435-594 tests/test-backend-ops.cpp176-190
MODE_PERF 模式测量后端之间的操作性能,提供优化和硬件比较的指标。
| 指标类型 | 测量 | 用途 |
|---|---|---|
| 基于 FLOPS | 每秒浮点运算次数 | 矩阵运算、卷积 |
| 基于内存 | 每秒千兆字节吞吐量 | 内存密集型操作 |
| 延迟 | 每操作微秒 | 小型张量运算 |
性能目标
来源: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
该框架提供了强大的张量初始化功能,支持各种数据类型和量化方案。
来源:tests/test-backend-ops.cpp39-128
在运行测试之前,该框架会验证后端是否支持所需的操作。
该框架使用两个主要指标进行数值验证
归一化均方误差 (NMSE):
NMSE = MSE(a, b) / MSE(a, 0)
1e-7平均绝对不对称性 (MAA):
Asymmetry = (a - b) / (a + b)
MAA = mean(|asymmetry|)
1e-4来源:tests/test-backend-ops.cpp176-223
该框架通过在测试期间插入在分配的张量之间的 sentinel 张量,实现了复杂的内存溢出检测。
Sentinel 在 MODE_TEST 中自动添加,但在性能和梯度模式中禁用,以避免开销。
来源:tests/test-backend-ops.cpp388-433
测试文件遵循三部分组织模式
该框架涵盖了所有主要的 GGML 操作类别。
| 操作类别 | 示例测试 | 关键验证 |
|---|---|---|
| 算术 | test_add、test_mul、test_div | 逐元素一致性 |
| 矩阵运算 | test_mul_mat、test_out_prod | 数值精度、性能 |
| 卷积 | test_conv_1d、test_conv_2d | 空间操作正确性 |
| 激活函数 | test_relu、test_gelu、test_silu | 非线性函数精度 |
| 归一化 | test_norm、test_rms_norm | 统计操作精度 |
| 量化 | 各种量化矩阵乘法 | 低精度算术验证 |
来源:tests/test-backend-ops.cpp984
测试框架与 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