元峰 · 2021年04月25日

部署PyTorch模型到终端

作者: Gemfield
转自:AIZOO

背景

AI能力进行服务端部署并不是任何时候都适用,在未来,可能大多数时候都不适用。Gemfield来列举几个场景:

  • 1,AI能力的输出只是服务个别用户的时候(不能发挥服务端一对多的规模优势);比如手机的AI拍照。
  • 2,终端到服务端一来一回的网络延迟不能接受的情况下(遑论网络不稳定甚至断网经常发生);比如无人驾驶。
  • 3,服务端算力受限的情况;服务端目前的AI计算能力相对来说是很强大,但这更像是社会主义集中资源办大事的模式;如果有很多并行的微小AI能力需求,这种情况下就不适用。比如要对几十万路监控探头进行AI分析,最好的模式还是将AI能力部署在AI摄像探头上,将AI能力的输出再回传到服务端。否则,仅仅几十万路的视频流就足以让服务端无法承受。

在几年之前,AI能力还没有落地的情况下,是不会有这样的场景的,所以大多数人(也包括大多数厂商)也不会考虑类似的问题。但如今,AI+革命带来了越来越多类似的场景。为了给这些场景提供解决方案(有人说叫边缘计算),软硬件巨头开始了剧烈的转型。

AI生态软硬件介绍

Gemfield将从服务端AI训练硬件、服务端AI训练软件框架、终端AI前向(推理)硬件、终端AI前向(推理)软件框架这四个方面来阐述。注意硬件四大巨头:Nvidia GPU、Apple NPU、Google TPU、Intel VPU。

服务端AI训练硬件

目前市场上有Nvidia的cuda和google cloud上的TPU。在google cloud之外,比如自建数据中心、AWS、AZURE、阿里云上,Nvidia的CUDA设备是事实上的唯一AI训练硬件。

华为2018年推出了Ascend 910(昇腾910),但截止到目前尚未看到可用于开发者的使用文档(提醒我?)。

服务端AI训练软件框架

目前市场上主要有:Tensorflow、PyTorch。在学术上,一般选择PyTorch。

终端AI前向硬件

这里的终端可以是类电脑的设备、手机、汽车、摄像头、IoT、众多嵌入式设备。这些设备上用到的AI加速硬件也五花八门,市场出货量大的有:

  1. Nvidia:CUDA GPU,面向嵌入式的JETSON;
  2. Intel:Movidius VPU(NCS2);
  3. Apple:A12处理器(及之后)上的NPU;
  4. 高通:骁龙处理器(AIE引擎,目前到了第5代);
  5. 华为:麒麟处理器(达芬奇架构);
  6. 联发科:天玑处理器(APU3.0);
  7. 为AI优化的FPGA;

在AI benchmark (http://ai-bencmark.com/ )上,... benchmark之外,嵌入式领域主要是Nvidia、Intel垄断。

除了这些在个人市场占主流地位的巨头外,还有Google的Edge TPU、国产的寒武纪、百度昆仑、阿里含光800等,但还没有哪个在个人市场上占据主流。

除了上述的特定AI加速硬件,AI能力当然还可以运行在通用CPU上,主流的就是x86-64和ARM。需要注意的是,新一代的通用CPU将会越来越多的考虑AI能力的运算:

  • x86-64 CPU,比如十代酷睿首次加入了AI加速指令集DLBoost,十一代酷睿强化了DLBoost指令集、加入了GNA2.0单元等;
  • ARM CPU,也在丰富自己的AI核系列产品。

终端AI前向软件框架

  1. 桌面级(被NVIDIA CUDA设备垄断)上使用的是PyTorch、Tensorflow;
  2. iOS上使用的是Apple的CoreML、LibTorch库等,国内还比较流行的库有腾讯的NCNN、TNN等;
  3. Android上使用的是TFlite框架、LibTorch库等,国内还比较流行的有腾讯的NCNN、TNN、以及小米和阿里的推理库也在演进中;
  4. Intel NCS上使用的是Intel的NCSDK;
  5. Nvidia嵌入式设备上使用的TensorRT。

开发模式

就像上面分析的那样,在服务端,Nvidia的CUDA设备是目前事实上的唯一设备,因此,除却价格外,这个生态系统对开发者是友好的,大家拥有标准的交流语言;而一旦到了种类繁多的终端上,软硬件可谓是百花齐放,没有一个统一标准。这就带来了目前主流的部署方式:

在服务端训练出特定的算法模型——再将这个模型部署到服务端或者终端(以后大多数场景下是部署到终端)——需要服务端AI框架到终端AI推理框架的转换工具。推理框架和转换工具将构建起一个独立的生态系统,目前,很多这样的独立生态系统在相互竞争,同时也为普通的开发者带来了诸多AI开发难题。

在本文,gemfield将不定期更新一些AI算法部署到终端的实践。由于在服务端,Gemfield一般使用基于PyTorch的DeepVAC框架,因此本文Gemfield将介绍如何将PyTorch模型运行到各终端上。目前支持的有:

  • PyTorch模型部署到iOS上;
  • PyTorch模型部署到Android上;
  • PyTorch模型部署到x86-64 cpu上;
  • PyTorch模型部署到ARM Linux上(待完善)。

PyTorch模型部署到iOS

两种方式,使用LibTorch库或者转换为苹果的CoreML。

1,直接使用PyTorch库

参考专栏文章:

Gemfield:部署PyTorch 1.4到XCode和iOSzhuanlan.zhihu.com

你也可以参考libdeepvac项目:

https://github.com/DeepVAC/li...

2,PyTorch模型转换为CoreML

参考专栏文章:

Gemfield:转换PyTorch模型到CoreMLzhuanlan.zhihu.com


PyTorch模型到Android

总的说来方法有很多种,主要有:

  • 直接使用LibTorch库;
  • PyTorch模型转NCNN;
  • PyTorch模型转TFlite。

1,使用LibTorch库(推荐)

你可以参考libdeepvac项目:

https://github.com/DeepVAC/li...

2,Pytorch到NCNN

通过onnx转换,刚开始(2019年1月25日)ncnn不支持upsample,在合并了Gemfield的一些PR后,终于可以转换成功了。详细使用方法,请参考NCNN官方。

现在在NCNN之后又在主推TNN,你也可以试试。

3,PyTorch到TFlite

TFlite毕竟是Android的亲儿子。而PyTorch到tflite有很多种方法,但都或多或少有问题,不建议。

PyTorch模型部署到x86-64 cpu

你可能会奇怪,训练好的模型不是天然的就能运行在x86 cpu上吗?没错,但是速度很慢。所以最好是将训练好的模型进行量化,然后部署到CPU上运行。你可以参考如下项目:

https://github.com/DeepVAC/de...

PyTorch模型部署到ARM Linux上(待完善)

待补充。

附录

Gemfield在此章节记录一些Android上调试所使用的命令。

1,adb传输文件、运行程序

使用adb push、adb shell命令:

#Linux shell commandadb push speed_benchmark /data/local/tmp/speed_benchmarkadb push init_net.pb /data/local/tmp/adb push predict_net.pb /data/local/tmp/#测试能否运行adb shell /data/local/tmp/speed_benchmark --net /data/local/tmp/predict_net.pb --init_net /data/local/tmp/init_net.pb --input data --input_dims 1,3,640,384 --input_type float --warmup 50 --iter 10

总结

未完待续,我还会随时回来的。

相关阅读

image.png
关注元峰微信号“AIZOOTech”

更多算法模型相关请关注AIZOO专栏
推荐阅读
关注数
225
内容数
48
AIZOO.com 致力于搭建AI开发者、AI公司与需求方的桥梁,打造中国最大的算法和产品商城。传播AI领域资讯和技术,展示AI算法和产品。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息