【自动编译代码】陈天奇团队TVM重磅更新:直接在浏览器使用GPU

简介: 华盛顿大学陈天奇团队的深度学习自动优化代码生成器TVM发布更新,不需要写一行Javascprit代码,直接就能将深度学习模型编译到WebGL,然后在浏览器运行。

今天,华盛顿大学陈天奇团队开发的TVM发布了更新,不需要写任何JavaScript代码,直接就能把深度学习模型编译到WebGL/OpenGL,然后在浏览器运行。

深度学习离不开TensorFlow,MXNet,Caffe和PyTorch这些可扩展深度学习系统,但它们大多专门针对小范围的硬件平台(例如服务器级GPU)进行优化,要适应其他平台需要付出相当大的工程成本和费用,这对深度学习系统的灵活部署提出了挑战。

大量不同的深度学习框架(编程语言),越来越多的硬件架构,两者之间需要一个桥梁。TVM框架正是为此而生,旨在让研究人员和开发者能够在各种不同的硬件,从手机、嵌入式设备到低功耗专用芯片这些不同的系统上,快速轻松地部署深度学习应用,而且不会牺牲电池电量或速度。

TVM是神经网络和硬件后端之间一个共同的层(a common layer),无需为每一类设备或服务器建立一个单独的基础架构,该框架使开发人员能够在多种不同的硬件设备上快速轻松地部署和优化深度学习系统,帮助研究人员快速优化新算法的实现,验证新的思路,还有助于促进深度学习研究领域的硬件和软件协同设计。

新发布OpenGL / WebGL后端支持

TVM已经支持多个硬件后端:CPU,GPU,移动设备等......这次我们添加了另一个后端:OpenGL / WebGL

OpenGL / WebGL使我们能够在没有安装CUDA的环境中利用GPU。目前,这是在浏览器中使用GPU的唯一方式。

这个新的后端允许我们以一下3种方式使用OpenGL / WebGL:

  • 本地OpenGL:我们可以将深度学习模型编译成OpenGL,并直接在本地机器上运行,完全只使用Python。
  • 带有RPC的WebGL:我们可以将深度学习模型编译为WebGL,并将其作为一个共享库导出,并带有JavaScript主机代码和WebGL设备代码。然后,我们可以通过RPC将这个共享库部署到TVM JavaScript运行时系统,在浏览器内运行。
  • 带有静态库的WebGL:我们可以将深度学习模型编译为WebGL,将其与TVM JavaScript运行时系统连接,并导出整个包。然后,可以在浏览器的网页中运行模型,不需要依赖项。详细流程如图1所示。
ea0459ebb8e7f62451fd842a3b4dcbc372251db7

图1


以上三种方式的演示代码:https://github.com/dmlc/nnvm/blob/master/tutorials/from_mxnet_to_webgl.py

这与X有何不同?

在浏览器上运行神经网络并不是非常新奇的事。Andrej Karpathy提出的ConvNetJS,以及Google的DeepLearning.JS都是这样的想法。

那么使用WebGL的TVM有什么独特之处?最大的区别是TVM中的操作内核是自动编译的,而不是人工编译的。如图2所示,TVM使用统一的AST定义内核,并将其编译为不同平台上的代码。

b88a47e043e9510f93eec58d8aab4b6d077b2eba

图2

这意味着:

  • 你不需要编写大量附加代码,就可以将现有模型部署到WebGL。NNVM / TVM模型定义对于所有target都是相同的,因此你只需将其编译到新的target。
  • 如果要添加新的操作系统内核,你只需要在TVM中定义一次,而不用为每个target实现一次。你不需要知道如何编写GLSL代码来向WebGL添加新的操作系统内核!

Benchmark

这里,我们为一个典型的工作负载执行基准测试:使用resnet18进行图像分类。

我使用的是有5年历史的8核英特尔®酷睿™i7-3610QM笔记本电脑,以及一个GTX650M。

在这个基准测试中,我们从Gluon模型库里下载了resnet18模型,并对猫的图像进行端到端分类。我们只测量了模型执行时间(不包含模型/输入/参数的加载),并且每个模型运行100次以取得平均值。结果如图3所示。

a0ec76cb333e2ce8b88f1dc196feb4d94e377ef3

图3

该基准测试在以下4种不同的设置下运行:

  • CPU(LLVM):模型被编译为LLVM IR和JIT’ed,完全在CPU上运行。
  • OpenCL:模型被编译成OpenCL。还有一些glue code被编译到LLVM,负责设置和启动OpenCL内核。然后我们在本地机器上运行。
  • OpenGL:与OpenCL相同,但编译为OpenGL。
  • WebGL:glue code被编译为LLVM,并使用Emscripten转换为JavaScript。设备代码被编译为WebGL。我们在Firefox上执行模型。

从上面的结果可以看出,TVM OpenGL后端与OpenCL具有相似的性能。有趣的是,浏览器的WebGL版本并不比桌面OpenGL慢很多。考虑到主机代码是JavaScript,这很令人惊讶。这可能是由于Emscripten生成了asm.js,可以在Firefox中显著优化。

这是将深度学习模型自动编译到Web浏览器的第一步。随着我们将优化带入TVM堆栈,可以期待更多性能改进。

TVM:一个端到端的优化堆栈

可扩展框架,如TensorFlow,MXNet,Caffe和PyTorch是目前深度学习领域最流行和实用的框架。但是,这些框架只针对范围较窄的服务器级GPU进行了优化,如果要将工作负载部署到其他平台(例如手机,嵌入式设备和专用加速器FPGA、ASIC等),就需要大量费力的工作。我们提出一个端到端的优化堆栈TVM,具备图形级和运算符级的优化,以为不同硬件后端提供深度学习工作负载的性能可移植性。我们讨论了TVM解决深度学习优化的挑战:高级操作符融合、跨线程的低级内存重用、任意硬件基元的映射,以及内存延迟隐藏。实验结果表明,TVM在多个硬件后端的性能可与现有支持低功耗CPU和服务器级GPU的最优库相媲美。我们还通过针对基于FPGA的通用深度学习加速器的实验,展示了TVM对新的硬件加速器后端的适应能力。该编译器基础结构已经开源。

f5d1a8a97c1b51b912f742d354629be0b0e531fa

图4:CPU、GPU与TPU类的加速器需要不同的片上存储架构和计算基元。在生成优化代码时我们必须考虑这个问题。

我们提出TVM,一个端到端的优化编译器堆栈(如图5所示),它能降低和微调深度学习的工作负载,以适应多种硬件后端。TVM的设计目的是分离算法描述、schedule和硬件接口,这个原则受到Halide的compute/schedule分离的想法的启发,而且通过将schedule与目标硬件内部函数分开进行了扩展。这一额外的分离可以支持新的专用加速器及其相应的新的内部函数。

2acdfaa60ab3d60c66d230cebfd96ec806fefae4

图5:TVM 堆栈图。目前的堆栈支持多种深度学习框架以及主流 CPU、GPU 以及专用深度学习加速器。

TVM具有两个优化层:一个是计算图优化层;另一个是带有新的schedule primitives的张量优化层。结合这两个优化层,TVM可以从大多数深度学习框架中获取模型描述,执行高级和低级优化,并为后端生成特定硬件的优化代码,例如Raspberry Pi,GPU和基于FPGA的专用加速器。本研究的贡献如下:

8481c8f592b7f349aa84a1de5c171db681516edf我们构建了一个端到端的编译优化堆栈,能够将高级框架(包括Caffe,MXNet,PyTorch,Caffe2,CNTK)中指定的深度学习工作负载部署到多种硬件后端(包括CPU,GPU和 8481c8f592b7f349aa84a1de5c171db681516edf 基于FPGA的加速器,以及今天发布的OpenGL / WebGL后端)。
8481c8f592b7f349aa84a1de5c171db681516edf 我们提出了在不同硬件后端中为深度学习工作负载提供性能可移植性的主要优化挑战,并引入新的 schedule primitive,以利用跨线程内存重用、新硬件的内部函数和延迟隐藏。
8481c8f592b7f349aa84a1de5c171db681516edf 我们在基于FPGA的通用加速器上对TVM进行评估,提供关于如何最优适应特定加速器的具体案例。

8481c8f592b7f349aa84a1de5c171db681516edf我们的编译器可以生成可部署的代码,其性能可与当前最优的库相媲美,并且可适应新的专用加速器后端。

fbc40779e0012429a10a0db2fd68b7a11ec6ba5f

图6:两层卷积神经网络的计算图示例。图中的每个节点代表一次运算,消耗一个或多个tensor,并产生一个或多个tensor。

更多细节,请阅读论文:https://arxiv.org/pdf/1802.04799.pdf

XLA v.s. TVM:深度学习“中间表示”之争

从结构上看,TVM是一个完整的深度学习中间表示(IR)堆栈的基础层(base layer),提供了一个可重用的工具链,用于编译高级神经网络算法,生成适合特定硬件平台的低级机器代码。

借鉴构建编译器的方法,团队构建了一个两级的中间层,由NNVM(用于任务调度和内存管理的高级IR)和TVM(优化计算内核的低级IR)。 TVM随附一套可重复使用的优化库,能够随意调整,适应从可穿戴设备到高端云计算服务器的各种硬件平台的需求。

6cd0c4c447be8fb96006bf38912d1ff8844bf4d7

谷歌的XLA也是使用两层优化的结构,但XLA只针对TensorFlow。相比之下,TVM则试图成为一个开放的接口。

不仅如此,陈天奇之前在回答知乎提问“如何评价陈天奇的模块化深度学习系统NNVM?”时表示,“TVM和已有的解决方案不同,以XLA作为例子,TVM走了和目前的XLA比更加激进的技术路线,TVM可以用来使得实现XLA需要的功能更加容易 ”。

根据TVM博客,现在已经做了如下更新:

ac920c55c51eaf1e155dc79a9765966fdc4ec5ac

在最近统计的深度学习开源框架排名中,TensorFlow均位于第一,毫无争议。但未来,中间表示(IR)将成为深度学习框架之间竞争的关键。


原文发布时间为:2018-03-13

本文作者:肖琴、文强

本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号

原文链接:【自动编译代码】陈天奇团队TVM重磅更新:直接在浏览器使用GPU

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
3月前
|
存储 运维 Serverless
函数计算产品使用问题之如何解决代码需要多个gpu的问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
25天前
|
机器学习/深度学习 并行计算 算法
GPU加速与代码性能优化:挖掘计算潜力的深度探索
【10月更文挑战第20天】GPU加速与代码性能优化:挖掘计算潜力的深度探索
|
25天前
|
人工智能 语音技术 UED
仅用4块GPU、不到3天训练出开源版GPT-4o,这是国内团队最新研究
【10月更文挑战第19天】中国科学院计算技术研究所提出了一种名为LLaMA-Omni的新型模型架构,实现与大型语言模型(LLMs)的低延迟、高质量语音交互。该模型集成了预训练的语音编码器、语音适配器、LLM和流式语音解码器,能够在不进行语音转录的情况下直接生成文本和语音响应,显著提升了用户体验。实验结果显示,LLaMA-Omni的响应延迟低至226ms,具有创新性和实用性。
47 1
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
62 0
|
3月前
|
机器学习/深度学习 并行计算 TensorFlow
GPU加速TensorFlow模型训练:从环境配置到代码实践的全方位指南,助你大幅提升深度学习应用性能,让模型训练不再等待
【8月更文挑战第31天】本文以随笔形式探讨了如何在TensorFlow中利用GPU加速模型训练,并提供了详细的实践指南。从安装支持GPU的TensorFlow版本到配置NVIDIA CUDA及cuDNN库,再到构建CNN模型并使用MNIST数据集训练,全面展示了GPU加速的重要性与实现方法。通过对比CPU与GPU上的训练效果,突显了GPU在提升训练速度方面的显著优势。最后,还介绍了如何借助TensorBoard监控训练过程,以便进一步优化模型。
594 0
|
3月前
|
Rust 安全 JavaScript
Rust 和 WebAssembly 搞大事啦!代码在浏览器中运行,这波操作简直逆天!
【8月更文挑战第31天】《Rust 与 WebAssembly:将 Rust 代码运行在浏览器中》介绍了 Rust 和 WebAssembly 的强大结合。Rust 是一门安全高效的编程语言,而 WebAssembly 则是新兴的网页技术标准,两者结合使得 Rust 代码能在浏览器中运行,带来更高的性能和安全性。文章通过示例代码展示了如何将 Rust 函数编译为 WebAssembly 格式并在网页中调用,从而实现复杂高效的应用程序,同时确保了内存安全性和跨平台兼容性,为开发者提供了全新的可能性。
146 0
|
4月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
4月前
|
存储 缓存 JavaScript
|
4月前
|
机器学习/深度学习 TensorFlow API
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。