深度学习已证明自己在图像识别、语音识别、自然语言处理等领域吊打传统机器学习方法,网上也有很多深度学习的资料和教程,目前来看还是以讲解「流程」偏多,比如做目标检测,主要是按收集数据、标注、训练、测试这几个步骤来讲。
而我们的最终目的是将训练的模型应用到现有系统中,那么深度学习模型如何部署呢?有下面几个问题需要考虑:
硬件
神经网络再次火起来除了因为学习算法的突破、大数据的出现,就是硬件性能的发展和成本的下降了。十几年前的硬件条件下,建立多层多节点的神经网络,其时间复杂度是无法接受的。
所以,生产环境的硬件配置是首先需要考虑的,是部署在客户端机器上,还是部署在服务器上,甚或嵌入式设备上。
调用问题
比如你用TensorFlow训练了一个自己的模型,如何应用到C++或Java的生产系统中呢?网上很多教程都是用Python来进行训练的,这就需要解决Python和C++或Java之间的调用问题。
这里有篇文章,大家可以参考:
http://www.myoak.info/post/62/
文中介绍了如何利用Deeplearning4j系列工具将深度学习应用到Java生成环境中,文中提到:使用深度学习,最理想的方案是,不管你拥有大数据或小数据,都应该可以很方便的部署。数据科学家在企业里部署深度学习时,总会遇到的问题有:
1 以数据为质心的模式
2 系统整合问题
3 训练模型
4 运用模型
这里我们重点说一下C++应用程序如何调用深度学习的模型。以C++调用TensorFlow的模型为例,我了解到有三种实现方式。
1、编译TensorFlow的C++版本的动态链接库
我一共尝试了4次,花了一周时间,每次编译要花一天时间(或一晚),最后也没编成功,仍然报error。有这方面成功经验的小伙伴,欢迎来指导哇。
这个尝试叫做「从源代码安装TensorFlow」,对于此官方是这么说的:我们不支持在Windows上构建TensorFlow。不过,如果您无论如何想要尝试在Windows上构建TensorFlow,可使用以下两种方法中的任何一种:
1 Windows上的Bazel
2 TensorFlow CMake构建
2、使用OpenCV的DNN模型调用
我曾做过一个使用OpenCV的DNN模块加载Caffe模型的联系,代码见这个链接:
https://docs.opencv.org/3.3.0/d5/de7/tutorial_dnn_googlenet.html
然而,OpenCV的DNN模块支持加载的模型还不够多,特别是我们自己训练的模型,很多时候都会加载失败,因此OpenCV+TensorFlow或OpenCV+Caffe的路线也不是那么容易走的。
3、单纯的C++和Python之间的调用
这种方法有个前提,就是客户端机器需要安装Python和TensorFlow环境,这个就有比较大的局限性了。
关于在C++系统中使用深度学习,目前还在尝试编译Caffe的C++库、TensorFlow Serving这两种方式。
性能问题
生成环境一般都有明确的性能指标,比如每秒钟期望的请求数量、处理一张图片的时间等等,除了对时间有要求外,还可能对空间有要求,比如你希望将模型视为整个应用程序的一部分,将模型加载到应用程序中。服务端的应用程序还好,如果是客户端想加载深度学习模型,恐怕无法忍受动辄几百M、上G的大小。
所以,深度学习模型是否可以应用到低端的机器环境中,需要进一步探索。而在服务端,一是可以利用并行计算达到时间指标,再者服务器端就不存在空间的限制了。
Kubernetes Docker是一种在服务器端部署模型的工具,大家可以了解一下:
https://yeasy.gitbooks.io/docker_practice/kubernetes/
12周,坚持周更之16/12,连接开发者,连接迭代成长者
领取专属 10元无门槛券
私享最新 技术干货