TVM编译机器学习到 WASM 和 WebGPU

TLDR

TVM 深度学习编译器对 WASM 和 WebGPU 的支持。实验表明,TVM 的 WebGPU 后端在将模型部署到 Web 时可以接近原生 GPU 性能

引论

计算是现代机器学习应用的支柱之一。引入 GPU 以加快深度学习工作量,大大提高了进步速度。鉴于部署机器学习无处不在的需求日益增长,浏览器成为部署智能应用程序的自然场所。

虽然 TensorFlow .js 和 ONNX .js是将机器学习引入浏览器的现有努力,但 Web 版本和本地版本在性能上仍然存在非同小的差距。众多原因之一是缺乏对 Web 上的 GPU 的标准和执行访问。WebGL 缺乏重要的功能,如计算着色器和通用存储缓冲器,这些功能是高性能深度学习所必需的。

WebGPU 是下一代 Web 图形的即将推出的标准,有可能显著改变这种状况。与最新一代图形 API(如 Vulkan 和 Metal)一样,WebGPU 提供一流的计算着色器支持。

为了探索在浏览器中使用 WebGPU 进行机器学习部署的潜力,增强了深度学习编译器 Apache(孵化)TVM,以针对 WASM(用于计算启动参数和调用进入设备启动的主机代码)和 WebGPU(用于设备执行)。初步结果是相当积极的-第一次,可以部署机器学习应用程序在网络上,同时仍然接近本地性能的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 的runtime最少C++。构建了一个最低的 Web runtime库,与生成的着色器和主机驱动代码链接,生成单个 WASM 文件。WASM 模块仍然包含两个未知的依赖关系:

  • runtime需要调用到系统库calls (malloc, stderr)。
  • runtime需要与 WebGPU 驱动程序(在 javascript中,WebGPU API is the first-class citizenWebGPU API 是一流公民)进行交互。

WASI 是解决第一个问题的标准解决方案。虽然网络上还没有成熟的 WASI,但可以使用 emscript 生成类似 WASI 的库,以提供这些系统库。

通过在 TVM 的 JS runtime内构建 WebGPU runtime以及在调用 GPU 代码时从 WASM 模块调用这些功能来解决第二个问题。使用 TVM runtime系统中的打包机制,可以通过将 JavaScript 关闭传递到 WASM 接口来直接输出高级runtime原始。此方法保留了 JavaScript 中的大部分runtime代码,随着 WASI 和 WASM 支持的成熟,可以将更多的 JS 代码引入 WASM runtime。

性能

运行了一个快速实验,比较了通过 TVM 的 WebGPU 后端和使用本地 GPU runtime (金属和 OpenCL) 的本地目标执行完整计算图的执行情况。在移动网络模型上,可以发现 WebGPU 可以接近metal性能。假设 Chrome WebGPU 的runtime目标为metal,而不是 MacOS 上的 OpenCL,可以放心地假设,在面对 GPU 时,几乎没有性能损失。

此基准不包括 CPU 到 GPU 数据复制成本,仅对 GPU 执行进行基准。目前,从 CPU 到 GPU 的数据副本,仍可能需要 25% 的执行时间:这些成本可以通过连续执行设置中的双缓冲等方法进一步摊销。

报告的移动网端到端runtime绝不是最佳的,因为只是重复使用 GTX 1080 Ti 的调度,这与英特尔图形 GPU 非常不同。期望通过在感兴趣的目标平台上使用AutoTVM来进一步提升性能。

展望

结果表明,在网络上机器学习有许多有趣的机会。值得注意的是,WebGPU 是一种仍在不断发展的 API,其影响可能超越 Web 应用程序。例如,随着 WebGPU 的成熟并通过 WASI 实现标准化,可以针对 WebGPU 的原生 API,从而支持使用 WebGPU 的独立 WASM 应用程序。

TVM 社区还积极致力于基于 Rust 的runtime,这将提供更强大的 WASM 支持,并能够与wgpuRust WASM生态系统等项目进行更轻松的互动。

源码

TVM编译机器学习到 WASM 和 WebGPU的更多相关文章

  1. 使用Apache TVM将机器学习编译为WASM和WebGPU

    使用Apache TVM将机器学习编译为WASM和WebGPU TLDR 在Apache TVM深度学习编译器中引入了对WASM和WebGPU的支持.实验表明,在将模型部署到Web时,TVM的WebG ...

  2. 对于WebAssembly编译出来的.wasm文件js如何调用

    WebAssembly也叫浏览器字节码技术 这里就不过多的解释了网上很多介绍 主要是让大家知道在js里面如何调用执行它,我之前看WebAssemblyAPI时候反正是看得一脸懵逼 也是为了大家能更快的 ...

  3. TVM适配NN编译Compiler缺陷

    TVM适配NN编译Compiler缺陷 内容纲要 前言 TVM针对VTA的编译流程 自定义VTA架构:TVM的缺陷与性能瓶颈 TVM缺陷与瓶颈 缺陷一:SRAM配置灵活性差 缺陷二:计算阵列配置僵硬 ...

  4. TVM 高效保护隐私 ML

    TVM 高效保护隐私 ML 这篇文章描述了Myelin,一个在值得信赖的硬件飞地中保护隐私的机器学习框架,以及TVM如何使Myelin快速.关键的想法是,TVM,不像其它流行的ML框架,将模型编译成轻 ...

  5. Deep Learning部署TVM Golang运行时Runtime

    Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...

  6. Eos的Wasm智能合约的局限性

    官方只支持用C++写智能合约 用C++写智能合约门槛过高,会把许多开发者挡在门外,C++的复杂性也会让智能合约的设计变得困难. Wasm智能合约的效率并不是最优 由于C++最终也是编译成wasm字节码 ...

  7. WebAssembly学习(三):AssemblyScript - TypeScript到WebAssembly的编译

    虽然说只要高级语言能转换成 LLVM IR,就能被编译成 WebAssembly 字节码,官方也推荐c/c++的方式,但是让一个前端工程师去熟练使用c/c++显然是有点困难,那么TypeScript ...

  8. TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈

    TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈  本文对TVM的论文进行了翻译整理 深度学习如今无处不在且必不可少.这次创新部分得益于可扩展的深度学习系统,比如 TensorFlo ...

  9. TVM代码生成codegen

    TVM代码生成codegen 硬件后端提供程序(例如Intel,NVIDIA,ARM等),提供诸如cuBLAS或cuDNN之类的内核库以及许多常用的深度学习内核,或者提供框架例,如带有图形引擎的DNN ...

随机推荐

  1. B - Rikka with Graph HDU - 5631 (并查集+思维)

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  2. Selenium3自动化测试【17】元素定位之Link定位

    Link定位 find_element_by_link_text方法是通过文本链接来定位元素. 以Bing首页中顶部的[学术]链接为例,如图所示. 查看对应的html代码.从html中我们能看出这是一 ...

  3. 14- 小程序测试与airtest自动化测试

    什么是小程序 小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不用关 ...

  4. hdu1530 最大团简单题目

    题意:       给你一个无向图,让你找到这个图里面的最大团是多少. 思路:       最大图案是NP问题,直接暴力搜索,如果当前的这个点可以加入当前最大团,那么就选择加入或者舍去,如果不能加入, ...

  5. 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件

    在Windows上使用终端模拟程序连接操作Linux以及上传下载文件 [很简单,就是一个工具的使用而已,放这里是做个笔记.] 刚买的云主机,或者是虚拟机里安装的Linux系统,可能会涉及到在windo ...

  6. 接口测试的N中玩法

    在我看来接口测试相对其他类型的测试是比较简单的.对于最常见的HTTP接口,只需要知道接口的 URL.方法.参数类型.返回值 ... 就可以对接口进行测试了. apifox 如果你是入门级选手,那么ap ...

  7. ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule

    解释:执行docker-compose up -d时出现ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule 原因:防火墙 ...

  8. Redis(附Win10版本 和可视化工具)

    启动服务端 通过win+r,cmd 运行命令行然后输入如下指令: G: cd software cd G:\software\redis-64.3.0.503 redis-server.exe 这样就 ...

  9. 微言Netty:百万并发基石上的epoll之剑

    说道本章标题,相信很多人知道我在暗喻石中剑这个典故,在此典故中,天命注定的亚瑟很容易的就拔出了这把石中剑,但是由于资历不被其他人认可,所以他颇费了一番周折才成为了真正意义上的英格兰全境之王,亚瑟王.说 ...

  10. C#常见的文件路径Api

    我们经常有遇到要处理文件路径的需求,那么一般我们常见的有几种: 程序下面的文件 临时目录下的文件 获取程序下面的文件 首先我们创建了实例解决方案: 其中调用链是:Main.Shell->FooA ...