最近开始研究神经网络加速(Neural Network Acceleration),入手了英特尔出品的Neural Compute Stick 2,(没找到中文官方翻译,神经计算棒?还是叫NCS2吧。。)把玩了一下,颇有心得。跟大家分享一下。
自从深度学习火起来之后,Nvidia GPU大卖。因为可以做神经网络的训练(Training),搭配CUDA享用,不亦乐乎。但不是所有设备上都可以装GPU的。GPU耗电多,产热多,想装在手机、智能摄像头这种地方还是差了点。好在神经网络也不是要一直训练的。神经网络真的要用的时候只用它的推理(Inference)部分。推理时不需要更新权重(update weights),只出结果就好了。所以码农们在开发软件时把神经网络训练好了,封装到软件里拿出来卖就是了。
在这种背景下,各大公司纷纷推出了不同的神经网络加速器(Neural Network Accelerator),意在在比较低的运行功率下,能加速神经网络的推理运算,达到“多快好省”的目的。目前一些比较有代表性的产品有:谷歌的边缘张量处理器(Google Edge TPU),开头提到的英特尔NCS2,英伟达的Jetson系列,等等。本文着重讨论NCS2。
NCS2(Neural Compute Stick 2)顾名思义,是用来计算神经网络的一个小棒棒,而且是第二代。它其实外形像一个U盘一样。通体英特尔蓝。外壳是铝合金质地,个人猜测是用来加速散热用的。接口为USB 3.0。具体模样可以见题图。
NCS2内部的核心是一个名为Movidius Myriad X VPU的芯片。Movidius本来是个爱尔兰公司,后来被英特尔收购了。Myriad是芯片的产品名。X是版本号,但其实只是第三代,上一代叫Myriad 2... VPU的V代表Vision。具体芯片内部我也没有做很深的了解,感兴趣的同学可以自行去官网查看。
NCS2的使用需要软件的支持。目前支持的操作系统有Windows 10或Ubuntu 16.04。我使用的是Ubuntu。和NCS2配套使用的软件叫OpenVINO,是英特尔主导开发的一套开源软件。不过官网上说NCS2只支持和提前编译好(pre-compiled)的OpenVINO使用。也就是说从源代码安装(install from source)的方式没办法用来驱动NCS2。好在英特尔大概每个季度就会发行一个新的版本,而且在论坛上的支持很及时。缺点是如果发现了bug,也没办法自己修改,只能干等下一个版本。
所以想使用OpenVINO需要从官网下载(下载地址),选择自己相应的操作系统(官网没说支持macOS,但好像有下载包,可以试一下)。这里也po一下OpenVINO的源代码库地址以供参考:opencv/dldt。
OpenVINO的主要功能分两大块:模型优化器(Model optimizer)和推理引擎(Inference Engine)。推理引擎其实是在部署(deploy)的时候主要需要用到的模块。任何神经网络的推理都需要通过推理引擎提交到NCS2上去。推理引擎主要是用C++写的,提供C++ API,但也同时提供(比较简陋的)Python API。
推理引擎只接受特定格式的神经网络文件:英特尔中介码(Intel's intermediate representation,缩写IR)。IR是由两个文件构成。一个是xml文件,用来描述神经网络的架构。一个是二进制文件,用来存储神经网络的权重。IR可以从其他比较流行的神经网络框架转换(convert)得到,支持TensorFlow, Caffe, ONNX等等。而文件的转换就是通过模型优化器(MO)完成的。但是MO不直接支持PyTorch。所以想把PyTorch转换成IR需要先导出成ONNX格式,再转成IR。
由于OpenVINO历史很短,模型优化器和推理引擎两个重要部件现在有很多bug和限制。模型优化器因为是用Python写的,运行时也不涉及到任何硬件(毕竟只是个文件转换器),所以可以自己debug。但因为推理引擎涉及硬件,而且英特尔不支持从源代码安装,所以遇到相应的bug时就会很恼火。唯一的解决办法就是更改最初的模型,来避开这些bug。
当你终于成功地把你的神经网络模型转换成IR之后,就可以使用推理引擎来做运算了。如果比较懒,也可以先试一下OpenVINO自带的范例。个人测试了一下,发现其实比在CPU上运行还要慢一些,不过毕竟是通过USB供电的,功率也不高,综合起来总体效率还不错。
对了,如果你囊中羞涩,还不想买NCS2,其实OpenVINO也是支持CPU运算的。只要你的电脑CPU是Intel的就好。毕竟是同一家的。OpenVINO还可以用CPU中的集成GPU进行运算。速度大为提高,但功率也随之变高了。
文章评论(0条评论)
登录后参与讨论