Web上的深度学习

今年5月份的时候,偶然看到了“开源软件供应链点亮计划 - 暑期2021”这个活动,而我正好对深度学习与Web结合感兴趣,于是报名了“web 上运行 mge 模型”这个项目。

终于在10月底,我基本实现了Megengine.js,完成了项目的验收,项目的结题报告书可以在这里 (opens new window)找到,于是写这篇文章来梳理一下这段时间里自己的想法,作为报告书的一个补充。

# 如何写一个深度学习框架?

提到深度学习框架,很容易想到Tensorflow,Pytorch等,但大多数用户其实也只是使用它们,并不知晓它们真正的工作原理。但这也并不是什么神秘的事,只是写一个可以正常运行的深度学习框架还是比较简单的,真正困难的是这背后无止境的优化。

简单来说,一个深度学习框架主要由两部分组成:

  1. 计算部分
  2. 逻辑部分

计算部分主要包含一些基础的数据结构(Tensor)以及各种算子的前向与反向计算,通常这部分会对外保留统一的接口,内部针对不同计算设备,不同架构进行实现,尽可能取得高性能。 逻辑部分则通过构建计算图的形式,将数据和算子按一定结构组合起来。模型的输入将沿着计算图不断前进,得到输出;同时损失也将沿着计算图反向传播,得到每个节点的梯度。之后便可以使用优化器对网络参数进行优化。

虽然每个框架都有自己的设计理念和架构技巧,但大体上来说,都会按这样的模式来划分。于是如果我们想要写一个深度学习框架,主要实现的就是上述这两部分。

# 如何写一个Web上的深度学习框架?

至于Web,主流语言仍然是JavaScript,但JavaScript的性能暂时还没办法达到深度学习的要求,这其实就是说,计算部分必须想其他的办法来实现。现在主流的方案主要有三种:

  1. WebGL:即OpenGL的Web版本。
  2. WebGPU:GPU硬件向Web开放的接口。
  3. WebAssembly:一种可以在浏览器中运行的二进制编码格式,能达到接近原生的性能。

前两者都利用GPU的计算能力,而WebAssembly则仍然是在CPU上进行计算。利用它们来完成计算模块可以取得还不错的性能,至于逻辑部分就可以用JavaScript来实现了。TensorFlow.js (opens new window)就是一个很好的例子。

Megengine.js背靠MegEngine,通过将MegEngine编译成WebAssembly来获取计算性能,并使用TypeScript实现了上层的逻辑,这样就使用较小的成本将一个深度学习框架搬上了Web。

# Web端深度学习的使用场景?

在我看来,目前大多数应用还是偏向于小工具一些,比如对图像做超分辨率,比如对音乐进行通道分离,或是使用GAN生成一些图像等。在美妆的场景下,可以识别嘴唇等部位进行虚拟试妆。也许是因为深度学习模型还是比较受限,或是并没有什么特别需要在Web上完成的任务。当然也许是我看的太少了,并没有列举出很多。

另一个方面,Web的好处是几乎所有平台都可以用,现在比较多用的跨平台方案就是基于Web的[1]。将深度学习框架搬上Web之后,可以比较方便地在移动端使用,甚至在微信小程序中也可以使用。最近疫情期间可能会需要使用小程序中扫描身份证进行认证,如果能在手机端完成识别,不经过网络的话就会比较安全。

Web上交互的方式很多,相信之后深度学习的模型不断发展,会出现更多的应用,在交互这个方面提升很多。比如现在Github Copilot (opens new window)的出现,就极大地改变了VSCode的交互方式,是近期一个非常实用的工具了。

# 深度学习在 Web 上的困境?

目前来说,还是没有特别需要用到它的场景。算力和模型之类的问题都会慢慢解决,但没有使用场景的话,工具再高效又有什么用呢。

# 后记

经过这几个月的努力,完成了自己还算满意的工作,更重要的是,通过这样的经历,我学习了很多深度学习框架层面的东西,设计思路等等,同时对于整个系统也多了一些思考。如果再让我选一次,我还是会积极参加的。

不过目前还有一件事想做,就是将Megengine.js嵌入到微信小程序中,有一些细节问题需要处理。如果能完成这件事,对整个系统的推广应该是很有帮助的。

p.s. 已经可以在小程序中运行了,再完善一下就可以发布了。


  1. 比如Electron (opens new window),Notion就是基于它开发的。 ↩︎