大佬好,我一直也在维护一个轻量的定点推理库NNoM。https://github.com/majianjia/nnom
跟楼主的目标有部分重合。
NNoM 的初衷只是为了简化ARM这套CMSIS-NN的使用,针对10~100kB RAM的单片机做的。不考虑支持现有的各种模型文件或者protobuf因为他们太大,并且需要文件系统的支持。
ONNX 也是我之前考虑的框架,不过我一直没有精力能做下来,现在只支持了Keras的模型。
看了楼主的libonnx源码相当有感触。以我的经历,大概有几个难点
1. 支持绝大部分onnx的ops 需要相当大的工作量。
尤其是以后要适配各种硬件NPU时。各类单片机(比如K210)的硬件加速有着非常多的限制,输入层数,输出层数,卷积核大小等等。
2. 定点算子。常见的8bit, 16bit等定点算子在计算时要考虑各种溢出问题,因为有一些量化方法是允许计算结果大于定点数值,所以在做算子时还需要做计算的“饱和”而不是任其“溢出”。这部分如果不能使用相关的汇编指令,会降低算子的效率。定点算子还会牵扯到很多浮点没有的操作,比如qformat,offset 和 per channel quantization 等。
3. 定点RNN 类型的算子,相当麻烦。包括量化和算子本身。
以上难点基本上在定点算子部分,如果考虑先做一套浮点算子,应该很快能完成。
如果考虑到MCU级别的应用,还需要内存上做文章,做层与层之间的内存复用,避免运行态的动态内存分配等。
楼主已经迈出第一步,感觉做下去意义非常大,我之后有时间也会在github上给libonnx贡献代码:D