MLGraph
实验性: 这是一项实验性技术。在生产环境中使用前,请仔细检查浏览器兼容性表格。
Web 神经网络(WebNN)API 的 MLGraph 接口表示一个已编译的计算图。图一旦构建完成就是不可变的:其算子、输入、输出和常量权重都无法更改。
MLGraph 通过 MLGraphBuilder.build() 获得,并通过 MLContext.dispatch() 执行。图与创建它的构建器所属的 MLContext 绑定,只能在该上下文上分派。
此特性仅在安全上下文 (HTTPS 或 localhost)中可用,并且在主线程和 Web Worker 中均可使用。
Web IDL
web-idl
[SecureContext, Exposed=(Window, Worker)]
interface MLGraph {
undefined destroy();
};构造函数
无。请使用 MLGraphBuilder.build() 创建 MLGraph。
实例属性
无。图的输入和输出的名称及描述符与构建时使用的相同;dispatch() 会据此验证你传入的张量。
实例方法
destroy()
destroy() 方法释放与该图关联的资源。调用之后,该图不能再被分派:MLContext.dispatch() 会抛出 InvalidStateError DOMException。
已经使用该图分派的工作仍会完成;实现会在这些工作结束后释放图的资源。多次调用 destroy() 不会产生额外效果。当图所属的上下文丢失或被销毁时,图也会被自动销毁。
语法
syntax.js
destroy()参数
无。
返回值
无(undefined)。
示例
构建、运行和销毁图
graph-lifecycle.js
const context = await navigator.ml.createContext();
const builder = new MLGraphBuilder(context);
const desc = { dataType: 'float32', shape: [2, 3] };
const x = builder.input('x', desc);
const graph = await builder.build({ y: builder.relu(x) });
const input = await context.createTensor({ ...desc, writable: true });
const output = await context.createTensor({ ...desc, readable: true });
context.writeTensor(input, new Float32Array([-1, 2, -3, 4, -5, 6]));
context.dispatch(graph, { x: input }, { y: output });
console.log(new Float32Array(await context.readTensor(output))); // [0, 2, 0, 4, 0, 6]
// 不再需要时释放已编译的图。
graph.destroy();注意事项
- 只要数据类型和形状匹配,图就可以被分派任意多次,每次使用不同的输入和输出张量。
build()中的编译可能包含权重预处理:常量数据会被转换并以设备特定的格式缓存。请重用图,而不是为每次推理重新构建。- 对于不再需要的图,尤其是大型模型,请调用
destroy(),以便及时释放设备内存,而不是等待垃圾回收。
规范
| 规范 | 状态 |
|---|---|
Web 神经网络 API — MLGraph 接口 | 候选推荐草案 |
最新的编辑草案可在 webmachinelearning.github.io/webnn 查看。
浏览器兼容性
WebNN 正在积极开发中,不同浏览器、操作系统和硬件的支持情况各不相同。
参见
Last updated on