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. 《机器学习Python实现_10_02_集成学习_boosting_adaboost分类器实现》

    一.简介 adaboost是一种boosting方法,它的要点包括如下两方面: 1.模型生成 每一个基分类器会基于上一轮分类器在训练集上的表现,对样本做权重调整,使得错分样本的权重增加,正确分类的样本 ...

  2. 4.Linux命令基本格式与简单使用

    Linux命令名组成: 在Linux/Unix系统下输入命令,就会进行相应的操作,那么这个命令有如下组成: 命令名 [选项] [参数] 注:[]的内容代表可选 命令实例: ls #显示当前文件夹下的所 ...

  3. 一个DDOS木马后门病毒的分析

    http://blog.csdn.net/qq1084283172/article/details/49305827 一.样本信息 文件名称:803c617e665ff7e0318386e24df63 ...

  4. Python脚本写端口扫描器(socket,python-nmap)

    目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...

  5. Windowsw核心编程 第13章 Windows内存结构

    第1 3章 Wi n d o w s的内存结构 13.1 进程的虚拟地址空间 每个进程都被赋予它自己的虚拟地址空间.对于 3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x  ...

  6. Intel汇编程序设计-整数算术指令(上)

    第七章 整数算术指令 7.1 简介 每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备.加密数据,以及实现高速的图形操作时特别有用.本章讲述如何进行移位和循环移位操作以及如何使用移 ...

  7. Portswigger web security academy:DOM Based XSS

    Portswigger web security academy:DOM Based XSS 目录 Portswigger web security academy:DOM Based XSS DOM ...

  8. 【flutter学习】基础知识(一)

    今天开始学习一下flutter 学习思路:首先由一个简单的例子引出每次学习的对象,一点一点加入元素,针对于代码去了解学习详细知识. 看完本篇博客能够快速的读懂flutter简单代码. flutter ...

  9. Mybatis学习之自定义持久层框架(四) 自定义持久层框架:生产sqlSession

    前言 上一回我们完成了数据库配置文件的读取和解析工作,有了这些准备工作,我们就可以与数据库创建连接和会话了,所谓sqlSession就是数据库的会话,一切增删查改操作都是在与数据库的会话中完成,下面我 ...

  10. [敏杰开发]Beta阶段测试报告

    [敏杰开发]Beta阶段测试报告 这是一篇软工课程博客 项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 测试项目 这个作业在哪个 ...