使用TVM将深度学习模型编译为WebGL
OpenGL / WebGL后端
TVM已经瞄准了很多涵盖各种平台的后端:CPU,GPU,移动设备等......这次我们添加了另一个后端:OpenGL / WebGL。
OpenGL / WebGL使我们能够在没有安装CUDA的环境中利用GPU。目前,它是在浏览器中使用GPU的唯一方式。
这个新的后端允许我们以3种不同的方式使用OpenGL / WebGL:
本地OpenGL:我们可以将深度学习模型编译成OpenGL,并直接在本地机器上运行,完全使用Python。
使用RPC的WebGL:我们可以将深度学习模型编译为WebGL,并通过Emscripten将其作为共享库导出,并使用JavaScript主机代码和WebGL设备代码进行导出。然后,我们可以通过RPC将该库部署到运行在浏览器内的TVM JavaScript运行时系统上。
带有静态库的WebGL:我们可以将深度学习模型编译为WebGL,将其与TVM JavaScript运行时系统链接并导出整个包。然后,我们可以在浏览器的网页上运行模型,而不依赖于它。详细流程如图1所示。
我们依靠Emscripten及其fastcomp LLVM后端来生成javascript后端。
这与X有何不同?
在浏览器上运行神经网络并不是一件全新的事情。Andrej Karpathy的ConvNetJS 和Google的DeepLearning.JS就是这方面的例子。
那么使用WebGL的TVM有什么独特之处?最大的区别是TVM中的操作内核是自动编译的,而不是手写的。如图2所示,TVM使用统一的AST定义内核,并将其编译为不同平台上的代码。
图2
这意味着:
要将现有模型部署到WebGL,您不需要编写大量附加代码。NNVM / TVM模型定义对于所有目标都是相同的,因此您只需将其编译为新的目标即可。
要添加一个新的操作内核,只需要在TVM中定义一次,而不是每个目标都执行一次。您不需要知道如何编写GLSL代码来将新的操作内核添加到WebGL中!
基准
在这里,我们为典型的工作负载执行基准测试:使用resnet18进行图像分类。
在此基准测试中,我们从Gluon模型动物园下载了resnet18模型,并对猫图像执行端到端分类。我们只测量模型执行时间(无模型/输入/参数加载),并且每个模型运行100次以获得平均值。结果如图3所示。
基准测试有四种不同的设置:
CPU(LLVM):该模型被编译为LLVM IR和JIT'ed。因此,它完全在CPU上运行。
OpenCL:该模型被编译成OpenCL。还有一些胶合代码被编译到LLVM,负责设置和启动OpenCL内核。然后我们在本地机器上运行它。
OpenGL:与OpenCL相同,但编译为OpenGL。
WebGL:胶合代码被编译为LLVM,并使用Emscripten的Fastcomp LLVM后端转换为JavaScript。设备代码被编译为WebGL。我们在Firefox中执行模型。
从上面的结果可以看出,TVM OpenGL后端与OpenCL具有相似的性能。更有趣的是,浏览器内的WebGL版本并不比桌面OpenGL慢很多。考虑到主机代码是JavaScript,这是非常令人惊讶的。这可能是由于Emscripten生成了asm.js,可以在Firefox中进行显着的优化。
这是将深度学习模型自动编译到Web浏览器的第一步。我们期待更多的性能改进,因为我们将优化纳入TVM堆栈。