使用Apache TVM将机器学习编译为WASM和WebGPU
使用Apache TVM将机器学习编译为WASM和WebGPU
TLDR
在Apache TVM深度学习编译器中引入了对WASM和WebGPU的支持。实验表明,在将模型部署到Web时,TVM的WebGPU后端可以接近本机 GPU的性能。
概述
计算是现代机器学习应用程序的支柱之一。GPU的引入加快了深度学习的工作量,极大地提高了运行速度。部署机器学习的需求不断增长,浏览器已成为部署智能应用程序的自然之所。
TensorFlow.js和ONNX.js将机器学习引入浏览器,但Web版本和本机版本之间在性能上仍然存在着不小的差距。许多原因之一是缺乏对Web上GPU的标准访问和高性能访问。WebGL缺少高性能着色学习所需的重要功能,例如计算着色器和通用存储缓冲区。
WebGPU是下一代Web图形标准。与最新一代的图形API(例如Vulkan和Metal)一样,WebGPU提供了一流的计算着色器支持。
为了探索在浏览器中使用WebGPU进行机器学习部署的潜力,增强了深度学习编译器Apache(incubating)TVM,以WASM(用于计算启动参数并调用设备启动的主机代码)和WebGPU(用于设备)为目标。执行初步结果是非常积极的-第一次,可以在Web上部署机器学习应用程序,同时仍能接近GPU的本机性能。
机器学习编译器
试用WebGPU的自然反应是为深度神经网络(矩阵乘法和卷积)中的原始算子编写着色器,然后直接优化性能。这是现有框架(例如TensorFlow.js)使用的传统工作流程。
相反,采用了基于编译的方法。TVM自动从TensorFlow,Keras,PyTorch,MXNet和ONNX等高级框架中提取模型,使用机器学习驱动的方法自动生成低级代码,在这种情况下,将以SPIR-V格式计算着色器。然后可以为可部署模块生成的代码打包。
编译的方法的一个重要优点是基础架构的重用。通过重用基础结构来优化CUDA,Metal和OpenCL等本机平台的GPU内核,能够轻松地(相对于其它方法)以Web为目标。如果WebGPU API到本机API的映射有效,可以通过很少的工作获得类似的性能。更重要的是,AutoTVM基础架构,能够针对特定模型专门化计算着色器,从而能够为感兴趣的特定模型生成最佳的计算着色器。
构建WASM和WebGPU编译器
为了构建可以针对WASM和WebGPU的编译器,需要以下元素:
- 用于计算着色器的SPIR-V生成器。
- 主机程序的WASM生成器。
- 加载和执行生成的程序的runtime。
TVM已经有Vulkan的SPIR-V目标,使用LLVM生成主机代码。可以仅将二者的用途重新生成设备和主机程序。
主要挑战是runtime。需要一个runtime来加载着色器代码,并使主机代码对话能够正确地与着色器通信。TVM具有最低的基于C ++的runtime。构建了一个最小的Web runtime库,生成的着色器和主机驱动代码链接,生成一个WASM文件。但是,此WASM模块仍然包含两个未知的依赖项:
- runtime需要调用系统库调用(malloc,stderr)。
- wasmruntime需要与WebGPU驱动程序进行交互(在Javascript中,WebGPU API是the first-class citizen)。
WASI是解决第一个问题的标准解决方案。尽管网络上还没有成熟的WASI,使用emscripten生成类似WASI的库,提供这些系统库。
通过在TVM的JS runtime内部构建WebGPU runtime来解决第二个问题,在调用GPU代码时,从WASM模块中回调这些功能。使用TVM runtime系统中的PackedFunc机制,可以通过将JavaScript闭包传递到WASM接口,直接公开高级runtime原语。这种方法将大多数runtime代码保留在JavaScript中,随着WASI和WASM支持的成熟,可以将更多JS代码引入WASM runtime。
性能
进行了一个快速实验,比较了通过TVM的WebGPU后端和使用本地GPU runtime(Metal和OpenCL)的本地目标执行完整计算图的情况。在MobileNet模型上,可以发现WebGPU可以接近Metal的性能。假设Chrome WebGPU的runtime以MacOS上的Metal(而不是OpenCL)为目标,可以放心地假设以GPU为目标时,性能几乎没有损失。
此基准不包括CPU到GPU的数据复制成本,而仅基准GPU的执行。从CPU到GPU的数据复制,仍会占用25%的执行时间。可以通过诸如连续执行设置中的双缓冲之类的方法,进一步摊销这些成本。
报告的mobilenet的端到端runtime,绝不是最佳选择,重复使用了GTX 1080 Ti的优化程序,这与Intel图形GPU截然不同。希望通过在目标平台上使用AutoTVM来进一步提高性能。
展望未来
结果表明,在网络上进行机器学习有许多有趣的机会。值得注意的是,WebGPU是一个仍在不断发展的API,其含义可能会超出Web应用程序。例如,当WebGPU成熟,通过WASI标准化时,可以将其定位为WebGPU的本机API,使用WebGPU的独立WASM应用程序。
TVM社区还积极地在基于Rust的runtime上工作,该runtime将提供更强大的WASM支持,wgpu和Rust WASM生态系统等项目的交互更加轻松。
提出的方法为大多数WASM的应用场景提供了有效的机器学习支持。接近本机的性能,可以释放浏览器上更好的联合学习功能。相同的编译程序包,也应该能够在本机WASM执行程序上运行,为应用程序提供sandbox 。
使用Apache TVM将机器学习编译为WASM和WebGPU的更多相关文章
- TVM编译机器学习到 WASM 和 WebGPU
TVM编译机器学习到 WASM 和 WebGPU TLDR TVM 深度学习编译器对 WASM 和 WebGPU 的支持.实验表明,TVM 的 WebGPU 后端在将模型部署到 Web 时可以接近原生 ...
- TVM适配NN编译Compiler缺陷
TVM适配NN编译Compiler缺陷 内容纲要 前言 TVM针对VTA的编译流程 自定义VTA架构:TVM的缺陷与性能瓶颈 TVM缺陷与瓶颈 缺陷一:SRAM配置灵活性差 缺陷二:计算阵列配置僵硬 ...
- 试试将.NET7编译为WASM并在Docker上运行
之前有听到说Docker支持Wasmtime了,刚好.NET7也支持WASM,就带大家来了解一下这个东西,顺便试试它怎么样. 因为WASM(WebAssembly) 一开始是一个给浏览器的技术,比起J ...
- Centos7 Apache 2.4.18编译安装
安装环境:CentOS Linux release 7.0.1406 (Core) 0x01 到官网http://httpd.apache.org/download.cgi#apache24下载apa ...
- Apache 流媒体 拖动模块编译
Windows使用apxs独立编译 Apache 模块 http://blog.sina.com.cn/s/blog_43b83d340100mdhl.html 安装 apxs 1.解压apxs.zi ...
- 以Apache模块的方式编译安装php-5.4.27
为什么要安装低版本的php? 由于apc,xcache的更新版本跟不上php版本的速度,所以,我们需要安装比较稳定的php低版本程序,再安装其它与之相匹配的扩展. 开工: 新建用户及用户组 group ...
- 以Apache模块的方式编译安装php-5.5.4
新建用户及用户组 groupadd webuser useradd -g webuser webuser 下载php-5.5 下载地址:http://pan.baidu.com/s/1o6I6Lnk ...
- apache ranger源码编译
官方文档 http://ranger.apache.org/quick_start_guide.html Quick Start Guide Build Process 1. Check out th ...
- apache atlas源码编译打包 centos
参考:https://atlas.apache.org/InstallationSteps.html https://blog.csdn.net/lingbo229/article/details/8 ...
随机推荐
- 记weblogic上传shell路径
0x01 前言 自从上次在渗透过程中发现了波weblogic CVE-2020-2551漏洞后面又对其进行了复现,后边看到exp里有个上传webshell的功能,但是由于不清楚weblogic这个路径 ...
- php 一些神奇加有趣的函数
php里面神奇且又有趣的函数 这么有意思的title,我忍不住要啰嗦俩句,1--只是个人喜欢,不喜勿喷:2--仅个人笔记,未完,待续 列举 get_defined_constants:get_defi ...
- javascript取url的参数的方法
<script type="text/javascript"> function request(paras) { var url = location.href; v ...
- 【手打】coredns单台使用
目录: coredns介绍 coredns安装 corendns配置 coredns介绍 CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师 ...
- 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)
0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...
- Python中根据库包名学习使用该库包
目录 Python库包模块 import 语句 from-import 语句 搜索路径 PYTHONPATH 变量 命名空间和作用域 查看模块中所有变量和函数,以及查看具体函数的用法 globals( ...
- linux安装MySQL报 error while loading shared libraries: libtinfo.so.5 解决办法
MySQL服务启动报错 error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No ...
- vmware vpshere 安装完的必备工作
1:例如:vCenter计算机地址为:192.168.0.200, 访问地址:https://192.168.0.200,安装证书: 参考教程:https://blog.csdn.net/cooljs ...
- [PowerShell] 快速入门, 基本语法, 常用类型, 函数, .NET 互操作
PowerShell 快速入门 开始之前, 我们认定你已经有一定的编程基础, 熟悉 .NET 中的类型与对象. 此文章对于 .NET 开发者来说更简单哦! 在 PowerShell 中, 几乎一切都是 ...
- Git 系列教程(8)- 远程仓库的使用
查看远程仓库 如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令,它会列出你指定的每一个远程服务器的名称 如果是刚 clone 下来的自己的库,能看到 origin,这是 Gi ...