WebNN 测试
本指南介绍可用于在不同浏览器和设备上验证 WebNN 实现的测试方法和工具。
前提条件
在测试 WebNN 功能之前,请确保已按照 WebNN 安装指南为目标后端(例如 WebNN Windows ML / OpenVINO EP GPU)正确配置浏览器。
测试计划
WebNN 测试涵盖多种验证方式,覆盖多个测试套件,以确保正确性、性能、安全性和稳定性。
测试基础设施
- Chromium bots:持续集成测试涵盖单元测试和 Web Platform Tests(WPT)一致性测试
- Microsoft Edge 团队测试设施
- WebNN Automation Tests ,涵盖 WPT、示例和演示
- W3C WebML 社区测试设施
- WebNN Samples Test Framework ,涵盖 WebNN 示例和演示
- 其他硬件厂商测试设施
后端
WebNN 会针对多个版本的后端实现进行验证:
- 公开版本:稳定的 Windows ML、Execution Providers,以及 GPU、NPU 驱动
- IHV EP 认证测试套件
- 预发布版本
测试设备
WebNN 确保在所有主流硬件配置上进行测试,并会及时支持最新设备。
测试频率
除了针对所有代码变更的持续集成测试之外,WebNN 还遵循计划性的测试策略:
- 每夜:WPT 和演示自动化测试
- 每日:性能和模型测试
- 持续模糊测试:模糊测试目标由 buildbots 自动发现,使用不同的模糊测试引擎构建,然后上传到分布式 ClusterFuzz 系统以大规模运行
- 按需:在重大版本发布前进行 PageHeap 测试,用于调试
WebNN 测试套件
Web Platform Tests(WPT)
WebNN API 遵循 W3C 标准,并包含全面的测试套件,以确保跨浏览器兼容性。
| 资源 | 链接 |
|---|---|
| W3C WebNN API 规范 | WebNN API |
| W3C WebNN API 仓库 | webmachinelearning/webnn |
WebNN Web Platform Tests / 一致性测试套件
WebNN 一致性测试套件(CTS) 是 web-platform-tests 项目的一部分,这是一个跨浏览器测试套件,用于确保所有主流浏览器之间的 Web 平台兼容性。
这些测试能够为以下对象提供信心:
- 浏览器实现者:其 WebNN 实现与其他浏览器兼容
- Web 开发者:可以依赖 WebNN 在不同浏览器和设备上的一致行为
Web IDL 测试
文件: idlharness.https.any.js
验证 WebNN API 是否正确实现了 Web IDL 规范中定义的接口。该测试使用每日更新的规范 Web IDL 快照,位于 ../interfaces/webnn.idl。
验证测试
位置: validation_tests/
这些测试验证 WebNN 方法是否按照规范算法正确校验输入参数,并确保无效输入被正确拒绝。
示例: validation_tests/matmul.https.any.js 确认:
- 当输入张量的秩小于 2 时会抛出异常
- 输入张量的形状必须可广播
- 满足其他参数验证要求
一致性测试
位置: conformance_tests/
这些测试验证 WebNN 算子是否产生正确的计算结果。
示例: conformance_tests/matmul.https.any.js 验证 N 维矩阵乘法能够产生数学上准确的输出。
测试执行上下文
设备变体
WebNN 支持多种计算设备(CPU、GPU、NPU)。测试使用 META: variant=?... 在不同设备类型上自动运行同一个测试。
全局上下文
WebNN 接口可通过 navigator.ml 在 Window 和 Worker 上下文中使用。测试使用:
.any.js约定META: global=window,dedicatedworker
这使得同一个测试可以在多个 JavaScript 执行上下文中运行。
注意: 大多数特定于算子的测试仅指定 global=window 以减少计算开销,因为单个算子在不同上下文之间出现行为差异的可能性很小。
运行 WPT 测试
您也可以通过 WebNN Automation Tests 运行 WPT 自动化测试
示例和开发者预览演示测试
交互式示例和演示有助于验证真实场景中的 WebNN 使用模式。
| 资源 | 仓库 |
|---|---|
| W3C WebNN 示例 | webmachinelearning/webnn-samples |
| WebNN 开发者预览演示 | microsoft/webnn-developer-preview |
| LiteRT.js on WebNN 演示 | litert.webnn.io |
| HuggingFace:WebNN Spaces | huggingface.co/webnn/spaces |
- W3C WebNN 示例 展示了 WebNN API 在 Web 应用中的实际用法
- WebNN 开发者预览演示 展示了 WebNN API 与 ONNX Runtime Web 的集成
- LiteRT.js on WebNN 演示 展示了 WebNN API 与 LiteRT.js 的集成
- HuggingFace:WebNN Spaces 实现了更多基于 Transformers.js 的 WebNN 示例
测试示例和演示应用
我们提供了自动化测试框架,用于全面测试示例和演示:
访问测试框架
访问 WebNN Automation Tests 或 WebNN Samples Test Framework 仓库
按照设置说明操作
查看 README 了解配置详情
运行测试并生成报告
执行自动化测试以验证示例功能并生成详细的测试报告
Chromium 中的模糊测试
模糊测试(Fuzzing)是一种自动化软件测试技术,它向程序提供无效、意外或随机的数据作为输入。它是发现代码中安全漏洞和稳定性问题的最有效方法之一。
在 WebNN 中,模糊测试通过生成多种多样的输入组合来帮助发现边界情况和潜在崩溃,而这些情况可能是传统测试用例无法覆盖的。
在 PageHeap 下测试
注意:完整页堆验证由于内存消耗很高,可能导致系统内存不足。应在开发和测试期间有选择地使用,而不要在生产环境中使用。
什么是 PageHeap?
PageHeap 是 Windows 的一项诊断功能,用于帮助检测内存访问违规。它会在每次分配的边界处保留内存,以检测对已分配区域之外内存的访问尝试。这可以捕获常见的内存缺陷,例如:
- 缓冲区溢出
- 释放后使用错误
- 越界内存访问
PageHeap 模式
GFlags 提供两种 PageHeap 验证模式:
- 标准堆验证 在每次堆分配的末尾写入填充模式,并在释放分配时检查这些模式。此模式对性能的影响极小。
- 完整页堆验证 在每次分配的末尾放置一个不可访问的保护页,使程序在访问分配区域之外的内存时立即停止。这提供了更强的保障,但会占用明显更多的内存(每次分配占用一个完整页)。
为什么要在 PageHeap 下测试 WebNN?
在 PageHeap 下测试 WebNN 有以下几个好处:
- 早期发现:内存违规会在发生时立即被捕获,使缺陷更易于诊断和修复。
- 安全保障:有助于在潜在的内存处理相关安全漏洞到达生产环境之前将其发现。
- 全面覆盖:与模糊测试结合使用时,PageHeap 可确保自动生成的测试输入不会触发隐藏的内存安全问题。
在 PageHeap 下测试 WebNN
安装 Debugging Tools for Windows
运行 GFlags.exe 可执行文件
转到 Image File 选项卡
在 Image 编辑框中输入 chrome.exe
按 Tab 键
勾选 Enable page heap 复选框
点击 Apply 按钮
- 运行 WebNN 测试,例如 WPT 测试或 WebNN 演示测试
观察崩溃
性能测试
WebNN 的性能会在数百个 AI 模型上进行评估,以确保在不同 WebNN 后端上都能获得最佳性能。每个 WebNN 后端都会针对涵盖各种架构、规模和使用场景的大量模型套件进行测试,以提供全面的性能洞察。
如需获取全面的 WebNN 性能测试工具和 Web AI 基准测试网站,请联系 Intel Web 团队。
其他资源
- WebNN API 规范 - 完整的技术规范
- Web Platform Tests - 跨浏览器测试倡议
- GFlags 和 PageHeap