ncnn是一个高性能神经网络前向计算框架,无第三方依赖,跨平台,简单易用。作者nihui是来自腾讯优图的顶级人工智能专家。目前受众范围主要集中在中、俄、日地区。相比onnx背靠的微软,亚马逊,Facebook和IBM,ncnn这边的维护和社区发展就不那么强悍,但它的确是一个非常高效的框架,我喜欢其全平台部署的特性。
0. NCNN代表作
A. 视频超分辨放大
- waifu2x-ncnn-vulkan
- realcugan-ncnn-vulkan
- realsr-ncnn-vulkan
- realsrgan-ncnn-vulkan
这些都已被广泛运用于动漫视频超分辨放大。随后也诞生了更多面向普通人的操作界面,比如我写的【佰阅人工智能APP系列】。
B. 视频补帧
rife-ncnn-vulkan
C. Deepfacelab
https://github.com/iperov/DeepFaceLive
D. 视频一键绿幕抠图
以上列举的这些应用,都是基于ncnn的,零依赖,不需要繁重的cuda驱动,推理速度快,并发友好。当然也有一大堆偏向工业应用的目标检测,这里就不作一一列举了。
2. 核心贡献为什么比前端冷清?
相比现代编程的异彩纷呈,人工智能推理框架数量极少,积极参与贡献者少之又少,究其原因在于,人工智能推理框架的核心是推理,需要实现海量数学模型算法。偏算法层面的东西,一般人就只能套用现成的,核心贡献需要极高算法能力要求。
3. 全平台部署的重要性
ncnn截至2022年5月,已实现Pytorch模型自动量化成fp16。一套代码可跨终端运行,这是非常了不起的特点。平时用Pytorch或飞浆等框架训练模型,最后转成ncnn模型,实现任意终端的高效推理,现实意义重大。
4. 一些痛点
个人入门C++许久,一直没写什么,直到遇见ncnn这个框架,才方便的开发出了一些应用。如果小白入门ncnn,建议废弃里面的纯c代码,比如一些c的标准库、OpenMP这类的偏底层语法,改用C++20现代编程写法。C++20现代编程很多与流行语言语法习惯一致,开发效率很高,如果使用纯c的一些语法,给人的感觉就是凭空函数太多,摸不着门。代码推荐vscode,只需安装cmake扩展插件,就能快捷编译c++程序。
ncnn现在是万能的吗?不一定,就目前而言其底层支持多输多出,然而源头模型转换的多输入目前没有案例可循。比如视频抠图的RVM模型。经典AI模型一般分割任务,连续推理,但2021年起,越来越多的应用开始支持多输入,比如视频抠图,比如视频补帧等。除此之外,自然语言和音频处理领域,目前也没有ncnn的相关案例。核心开发者一直忙着工业级板子的适配,广泛应用依旧需要开发者热心的贡献。
如果你需要参考其他模型转换方法、部署案例,可以关注我开源的ncnn-models:https://github.com/Baiyuetribe/ncnn-models
5. 异彩纷呈的AI应用何时到来?
受限于c++开发习惯,目前几乎所有的AI应用都是单个或多个组合连续推理,实现较为简单或复杂的应用,随着多输入模型的到来,ncnn的底层推理已无问题,然而复杂应用开发需要更高效的开发语言,Go语言和Rust是最合适的,Rust已有ncnn案例,go版如果能实现,那么基于NCNN的AI应用将比现在丰富无数倍。然而现实需求肯定等不及相关适配,如果是服务器,只能做好本地API部署,实现经典的TCP调用。但是AI应用一般依赖GPU强大的算力,本地化应用是主流,难不成本地也要多开API?倘若go版能实现,就没有这些痛点了。