本文是对发表于WWW 2019的论文《Moving Deep Learning into Web Browser: How Far Can We Go? 》的回顾。论文第一作者为中心的马郓助理教授,通信作者为中心的刘譞哲副教授,其余作者为中心本科毕业生向东伟、硕士生郑舒宇以及博士生田得雨。本文针对在浏览器中运行深度学习任务的新趋势,调研和测试了最热门的7个基于JavaScript的深度学习框架,以评估这些框架的功能和性能,并与传统的深度学习框架进行了性能比较。本文的发现能够帮助应用开发者、深度学习框架开发者、浏览器厂商对浏览器上的深度学习效率进行优化。
深度学习技术在过去十年极大地拓展了人工智能的边界,在图像处理、语音识别、自然语言处理等领域得到了广泛的应用。学术和产业界也提出和研发了多个深度学习框架如TensorFlow、Caffe等。然而,人工智能应用需要运行于Windows、iOS、Android等多种类型的平台上,将人工智能应用向多种平台移植极具挑战。Web应用具有较强的可移植性,因此基于Web的人工智能应用开发成为了研究热点。从2015年起,ConvNetJS 、TensorFlow.js 等一系列基于JavaScript的深度学习库和框架被提出。然而这些框架在功能和性能上能否很好地支持深度学习应用仍然存疑,本文所进行的实证研究回答了以下三个问题:现有框架提供了哪些功能和特性支持多种类型的深度学习任务?现有框架在不同的深度学习任务下性能表现如何?在浏览器中进行深度学习与在原生平台上运行相比有多大的性能差距?本文选择了7个基于JavaScript的深度学习框架进行研究,并将Tensorflow.js与基于Python的原生Tensorflow的性能进行了比较,得出了一系列结论并给出了建议。
1、现有框架的功能与特性
为了选择最新的浏览器支持的 DL 框架,作者在 GitHub 上搜索关键字“deep learning framework”,并用 JavaScript 语言过滤结果。然后选择了 GitHub 上星数超过 1000 的前 7 个框架[1]。对每个框架的具体介绍如下:
TensorFlow.js[2] :2018 年 3 月由 Google 发布,是一个 inbrowser 机器学习库,支持使用 JavaScript 在浏览器中定义、训练和运行模型。TensorFlow.js 由 WebGL 提供支持,并提供用于定义模型的高级 API。TensorFlow.js 支持所有 Keras 层(包括 Dense、CNN、LSTM 等)。因此,很容易将原生 TensorFlow 和 Keras 预先训练的模型导入到浏览器中并使用 Tensorflow.js。
ConvNetJS[3] :是一个 Javascript 库,最初由斯坦福大学的 Andrej Karpathy 编写。ConvNetJS 目前支持用于分类和回归的常用神经网络模型和代价函数。此外,它还支持卷积网络和强化学习。然而遗憾的是,尽管 ConvNetJS 可能是在 TensorFlow.js 之前最著名的框架,但其在 2016 年 11 月后已经不再维护了。
Keras.js[4]:抽象出许多框架作为后端支撑,包括 TensorFlow、CNTK 等。它支持导入 Keras 预先训练的模型进行推理。在 GPU 模式下,Keras.js 的计算由 WebGL 执行。然而,这个项目也已经不再活跃。
WebDNN[5]:由东京大学发布的 WebDNN 号称是浏览器中最快的 DNN 执行框架。它只支持推理(训练)任务。该框架支持 4 个执行后端:WebGPU、WebGL、WebAssembly 和 Fallback pure JavaScript 实现。WebDNN 通过压缩模型数据来优化 DNN 模型,以加快执行速度。
brain.js[6]:是一个用于神经网络的 JavaScript 库,它取代了不推荐使用的 “brain” 库。它为训练任务提供 DNN、RNN、LSTM 和 GRU。该库支持将训练好的 DL 模型的状态用 JSON 序列化和加载。
synaptic[7]:这是一个不依赖于 JavaScript 架构的神经网络库,基本上支持任何类型的一阶甚至二阶 RNN。该库还包括一些内置的 DL 架构,包括多层感知器、LSTM、液态机(Liquid state machines)和 Hopfield 网络。
Mind[8]:这是一个灵活的神经网络库。核心框架只有 247 行代码,它使用矩阵实现来处理训练数据。它支持自定义网络拓扑和插件,以导入 mind 社区创建的预训练模型。然而,这个项目也已经不再活跃。
从提供的功能性来看,多数框架支持训练和推断两类任务;不同的框架支持的神经网络类型及操作有较大差异,仅有TensorFlow.js等3个框架支持了DNN、CNN、RNN三类神经网络;多数框架都支持以层为单位构建神经网络,TensorFlow.js相比其他框架支持了更多的层类别;TensorFlow.js也支持了更多种类的激活函数和优化器;7个框架中仅有TensorFlow.js支持使用GPU加速训练,TensorFlow.js等3个框架支持使用GPU加速推断。
从开发者支持来看,TensorFlow.js在开发文档、演示等多个方面优于其他框架,但因其支持较丰富的功能,其软件包也是较大的。
2、现有框架的性能
测试结果显示,ConvNetJS在训练和推断上性能均为最佳;Tensorflow.js是唯一支持GPU加速的框架,且性能与ConvNetJS可比。ConvNetJS性能更佳的原因可能是其在实现上与其他框架存在较大区别。
3、浏览器框架与原生框架性能对比
在推断任务的实验中,Tensorflow.js在nGPU上的表现弱于原生Tensorflow,但也仅慢1-2倍。Tensorflow.js在iGPU上的表现则优于原生Tensorflow在CPU上的表现。
在决策树的实验中,尽管在任何配置下Tensorflow.js几乎都慢于原生Tensorflow。但两个重要发现是,第一,较多使用CPU还是GPU对性能差异有极大的影响;第二,任务类型对性能差异有极大影响,在训练任务中Tensorflow.js平均慢33.9倍,而在推断任务中则只慢5.8倍。
4、主要研究发现
第一,浏览器端的深度学习框架仍在早期阶段,仅有Tensorflow.js提供了较全面的功能和支持了较多种类的深度学习任务。
第二,浏览器端对深度学习的支持主要仍然集中于推断任务,训练任务仍然受到较大局限。
第三,模型加载是推断任务中最耗时的部分,因此对于较小的模型,使用CPU的表现优于GPU。
第四,在没有独立显卡时,集成显卡对浏览器端深度学习框架性能有较大帮助。相比原生Tensorflow仅在CPU上运行,Tensorflow.js利用集成显卡表现出了更好的性能。
第五,系统资源的利用有待进一步优化。对于Tensorflow.js,CPU没有得到充分的利用;对于WebGL,分配的内存受限于浏览器,导致部分深度学习任务崩溃。