使用SIMD和多线程为TensorFlow.js增压

2020-10-26 13:42:26

三月份,我们为TensorFlow.js引入了一个新的WebAssembly(Wasm)加速后端(向下滚动了解更多关于Wasm的信息,以及为什么这很重要)。今天,我们很兴奋地宣布一项重要的性能更新:从TensorFlow.js版本2.3.0开始,我们的Wasm后端通过利用SIMD(向量)指令和通过XNNPACK(一个高度优化的神经网络运算符程序库)进行多线程处理,速度提高了10倍之多。SIMD和多线程为我们的WASM后端带来了重大的性能提升。下面是Google Chrome中的基准测试,它们展示了对BlazeFace的改进-一个具有10万个参数和大约2000万次乘加操作的轻量级模型:(列出的时间是每个推断的毫秒)较大的模型,如MobileNet V2,一个具有350万个参数和大约3亿次乘加操作的中型模型,获得了更大的加速比:*注意:Pixel4不提供TF.js多线程Wasm后端的基准测试,因为移动浏览器中的多线程支持仍在进行中。IOS中的SIMD支持也仍在开发中。**注:TF.js多线程Wasm后端节点支持在即。SIMD和多线程带来的性能提升是相互独立的。这些基准测试表明,SIMD给普通的Wasm带来了1.7-4.5倍的性能提升,而多线程在此基础上又带来了1.8-2.9倍的加速比。TensorFlow.js 2.1.0支持SIMD,TensorFlow.js 2.3.0支持多线程。在运行时,我们测试SIMD和多线程支持,并提供适当的WASM二进制文件。今天,我们为以下每种情况提供不同的二进制代码:因为大多数支持多线程的运行时也支持SIMD,所以我们决定省略仅支持多线程的运行时,以保持较小的包大小。这意味着如果您的运行时支持多线程,但不支持SIMD,您将获得默认的二进制代码。Wasm后端有两种使用方式:使用npm//Import@TensorFlow/tfjs或@TensorFlow/tfjs-coreconst tf=Required(';@TensorFlow/tfjs';);//将wasm后端添加到全局后端registry.require(';@tensorflow/tfjs-backend-wasm';);//将后端设置为wasm,等待模块就绪。tf.setBackend(';wasm';).Then(()=>;Main();

该库期望Wasm二进制文件位于相对于主JS文件的位置。如果您正在使用诸如Parcel或webpack这样的绑定器,您可能需要使用我们的setWasmPath助手手动指示WASM二进制文件的位置:有关更多信息,请参阅自述文件中的“使用绑定器”一节。使用脚本标记<;!--IMPORT@TensorFlow/tfjs或@TensorFlow/tfjs-src=";https://cdn.jsdelivr.net/npm/@tensorflow/tfjs";>;<;/script>;-->;<;脚本核心<;!--将WASM后端添加到全局后端注册表-->;<;脚本src=";https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm/dist/tf-backend-wasm.js";>;<;/script>;<;script>;tf.setBackend(';wasm';)。则(()=>;main());<;/script>;

注意:TensorFlow.js为每个后端定义了优先级,并将自动为给定环境选择最受支持的后端。如今,WebGL的优先级最高,其次是Wasm,然后是普通的JS后端。要始终使用wasm后端,我们需要显式调用tf.setBackend(‘wasm’)。

要查看自己的性能改进,请查看BlazeFace模型的此演示,该演示已更新为使用新的wasm后端:https://tfjs-wasm-simd-demo.netlify.app/要与未经优化的二进制进行比较,请尝试此版本的演示,它手动关闭了单指令多路复用和多线程支持。WebAssembly(Wasm)是一种跨浏览器的二进制格式,可为Web带来近乎本机的代码执行速度。WASM用作用静态类型高级语言(如C、C++、GO和Rust)编写的程序的编译目标。在TensorFlow.js中,我们使用C++实现Wasm后端,并使用Emscripten进行编译。XNNPACK库为底层的神经网络操作符提供了高度优化的实现。自2017年以来,Chrome、Safari、Firefox和Edge都支持WASM,全球90%的设备都支持WASM。WebAssembly规范正在快速发展,浏览器正在努力支持越来越多的实验性特性。您可以访问该站点来查看您的运行时支持哪些功能,包括:SIMD SIMD代表单指令、多数据,这意味着SIMD指令在小的固定大小的元素矢量上操作,而不是在单个标量上操作。Wasm SIMD方案使现代处理器支持的SIMD指令可以在Web浏览器中使用,从而释放了显著的性能提升。WASM SIMD是第三阶段的建议,可通过Chrome84-86的原始试验获得。这意味着开发者可以选择在他们的网站中使用Wasm SIMD a