TVM、Openvino、TNN、NCNN前向推理框架使用心得
- 仅是个人开发过程中的一些心得, 不同的开发者应该有不同意见,当然我可能会有一些理解程度不够深入的地方,希望各位指正批评.
- 一共五分,★★★☆☆表示得三分,其中"-"表示接触的不多,无法提供相关的使用心得
| TVM | OpenVino | TNN | NCNN | |
|---|---|---|---|---|
| API友好 | ★★☆☆☆ | ★★★★★ | ★★★★☆ | ★★★★☆ |
| 社区 | ★★★☆☆ | ★★★★★ | ★★★☆☆ | - |
| 开发难度 | ★★★★★ | ★★★☆☆ | ★★★☆☆ | ★★★☆☆ |
| 速度性能 | ★★★★★ | ★★★★☆ | ★★★☆☆ | - |
| 硬件支持 | ★★★★★ | ★★★☆☆ | ★★★★☆ | - |
tvm
我用的是tvm0.6, 在使用tvm开发时需要具备的知识体量还是比较大的,但是在能成功运行第一个demo以后就算突破一个瓶颈.个人感觉TVM的设计上比较偏向"开发者",而非"函数接口调用者",比如在开发过程中我想得到RetinaFace算法结果输出landmark的数值, 我找了很久都没有找到直接获取的函数,只能通过index间接获取( 或许是存在一个比较好的函数而我没有找到), 这index对于不了解算法的工程组同志就就太难了,RetinaFace有9个输出,把index对应上都得蜕层皮.
m_get_output = mod.GetFunction("get_output");
landmark_output = m_get_output(index);
而openvino这个方面就方便太多了,直接输入名字便可以获取
Blob::Ptr output = infer_request->GetBlob(name);
相关讨论:TVM发展最大的瓶颈是不是易用性?
但是,熟练掌握TVM的套路以后你会发现-------真香!!!
- 1.速度提升远超其他框架, 还有auto tune,不仅支持本地tune还有rpc模式,tune完成后速度还能再次提升.
- 2.支持的后端硬件比较广泛,在本工程中CPU和GPU上可以用同一套代码,只需更换对应的模型即可! 在同时支持GPU、CPU的需求下,可能会采用GPU(tenorrt、cuda)+CPU(ncnn、openvino),代码都要写两套!是不是想起了那些苦难的日子!!!

openvino
各方面都是相当的均衡,充分的文档、友好的API使得新手非常容易上手,项目周期变得可控,但是intel出品的openvino是针对自家硬件产品(intel-cpu)的,可以部署的硬件就有一定的限制,当然也可以选择intel有神经网络加速棒(Stick 2, 可以理解为插在USB上的显卡),如下图所示:
TNN
tnn是在ncnn基础上进行的改良,文档、社区、API、都非常的赞,并且在编译时可以选择openvino、TensorRT的编译选项.

NCNN
ncnn我使用的并不多,在生产开发时,主要是给手机端的算法进行加速,根据平时手机端算法应用开发的同事交接情况来看,在极少数情况下NCNN模型int8量化后速度比TVM float32快一些,大部分情况下tvm在手机端仍胜一筹.
总结
TVM:带来的加速效果非常的可观,对硬件的支持非常宽泛, 但是对新手不友好, 需要熟练掌握算法输入输出结构,并且熟知TVM API函数的情况下,可以使用TVM对算法进行加速,否则项目周期会变得不可控.
OpenVino:对新手友好,但对部署的硬件有一定的要求,如果算法可以在intel-cpu、神经网络加速棒(Stick 2)上部署,那么OpenVino是一个不错选择.
TNN:对新手友好,单纯使用TNN加速带来的加速效果一般,可以按照TNN的文档对算法进行一次优化;在编译时可以选择openvino、TensorRT编译选项,对硬件的支持就宽泛.
NCNN:加速PC端加速效果并不理想,手机端的使用比较多一些.