β

[原创] 在树莓派3上使用微软ELL嵌入式学习库(3)

编码无悔 / Intent & Focused 67 阅读

转载需注明出处: https://www.codelast.com/

本文是 上一篇文章 的续文。
微软于2017年6月底发布了一个主要用于嵌入式系统(例如,树莓派,ARM Cortex-M0等)的机器学习库 ELL (Embedded Learning Library,嵌入式学习库)。
在前几篇文章中,我在Ubuntu PC上对ELL里现成可用的model进行了测试,虽然由于我台式机太老旧的原因,运行速度相当之慢,不过它终究跑通了demo,下一步,我们需要在台式机上,把ELL的model编译到目标平台上——在这里,目标平台指的就是树莓派3。
注:本文的所有操作,都是在台式机上运行的。

ELL自带了一个非常酷的神经网络模型编译器,它可以为目标平台生成高度优化的代码,从而可以让model在目标平台上以很快的速度运行。
在前面运行 CNTK demo的时候,细心的你一定会发现,demo运行的同时,在 ELL/build/tutorials/vision/gettingStarted/ 目录下生成了一个 vgg16ImageNet.map 文件(如果你使用的是Darknet,生成的就是 darknetReference.map),这个文件是ELL格式的model文件,之后会用到。
文章来源: https://www.codelast.com/
所以二话不说,直接开始编译:


cd ELL/build
make compiled_vgg16ImageNet_pi3

我以为这个过程会很顺利,结果呢?我试了很多次,每一次编译经过很长时间的等待之后,都以失败告终,错误信息大概类似于下面这样:

(前面还有很多,省略)
[ 85%] Built target trainers
[ 96%] Built target common
[ 98%] Built target compile
[ 98%] Generating /home/codelast/programme/pi/ELL/build/tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.ll;/home/codelast/programme/pi/ELL/build/tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.i;/home/codelast/programme/pi/ELL/build/tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.i.h
OpenBLAS : Your OS does not support AVX instructions. OpenBLAS is using Nehalem kernels as a fallback, which may give poorer performance.
[100%] Compiling vgg16ImageNet.ll to /home/codelast/programme/pi/ELL/build/tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.o for pi3
Killed
make[3]: *** [tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.o] Error 137
make[3]: *** Deleting file `tutorials/vision/gettingStarted/compiled_vgg16ImageNet_pi3/vgg16ImageNet.o'
make[2]: *** [tutorials/vision/gettingStarted/CMakeFiles/compiled_vgg16ImageNet_pi3.dir/all] Error 2
make[1]: *** [tutorials/vision/gettingStarted/CMakeFiles/compiled_vgg16ImageNet_pi3.dir/rule] Error 2
make: *** [compiled_vgg16ImageNet_pi3] Error 2
注意有一个“Killed”,这说明由于编译的过程占用了太多资源,进程被我OS的kernel杀掉了。我说过我用的是一台性能非常差的Ubuntu PC,所以硬件条件限制,遇到这种情况在所难免。
文章来源: https://www.codelast.com/

现在摆在我面前的路有两条:1) 换一台高性能的PC来尝试编译;2) 把CNTK换成轻量级的Darknet。
ELL的开发者建议使用轻量级的Darknet,而不是用CNTK。所以我就把前面几篇文章中CNTK的测试流程,换成Darknet又走了一遍。
重新再来一遍,会发现其实非常顺手和简单了:


cd build/tutorials/vision/gettingStarted
curl -O https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/darknet.cfg
curl -O https://pjreddie.com/media/files/darknet.weights

这样就下载好了Darknet model,你会看到这个model的大小只有28M,而CNTK model(VGG16_ImageNet_Caffe.model)的大小有528M,不是一个数量级的。
文章来源: https://www.codelast.com/
然后把摄像头连接到PC上,就可以跑Darknet的demo了:

python darknetDemo.py

一切如此简单。BTW,这个demo跑起来确实比CNTK的速度快多了。

跑Darknet的demo成功之后,我们就可以像前面说的一样,为目标平台(树莓派)编译Darknet的代码了:


cd ELL/build
make compiled_darknetReference_pi3

这回进程终于没有被kernel kill掉了!看来CNTK的编译过程果然占用了太多OS资源。

编译成功之后,你可以用任何方式(例如FileZilla,命令行SCP等等),把 ELL/build/tutorials/vision/gettingStarted/compiled_darknetReference_pi3/ 这个编译生成的目录,拷贝到树莓派上,我们之后需要在树莓派上,用这个目录下的东西,进一步编译出一个Python module,从而可以在树莓派上跑image classification的demo。
文章来源: https://www.codelast.com/
仔细看一下就会发现,Darknet的这个目录只有区区的29M大小,而CNTK对应的那个目录 compiled_vgg16ImageNet_pi3 竟然有3.4G大!这意味着,如果你决定在CNTK一条路上走到黑,那么你树莓派OS的TF卡就必须至少有16G大,否则你很可能由于OS里还要装一些必备软件,从而导致存储不下这个目录了。我之前尝试用CNTK的时候,就遇到了这样的问题,导致我要 用GParted去resize树莓派的TF卡

至此,我们终于完成了在PC上的所有工作,下一步,我们的工作就要转到树莓派上了,请接着看下一篇文章。

作者:编码无悔 / Intent & Focused
最优化之路
原文地址:[原创] 在树莓派3上使用微软ELL嵌入式学习库(3), 感谢原作者分享。

发表评论