NNVM:Open Compiler for AI Frameworks
1.概述
NNVM是一个开源的深度学习编译器,它为深度学习系统提供可重复使用的计算图优化和编译,它由TVM stack支持。
NNVM编译器可以:
- 表示和优化高级图形IR中常见的深度学习工作量
- 转换计算图以最大限度地减少内存利用率,优化数据布局并融合不同硬件后端的计算模式
- 呈现从前端深度学习框架到裸机硬件的端到端的编译管道
NNVM利用operator的高层信息去优化计算图,完成了从symbol描述的网络到graph描述的符号计算图的生成和优化工作。
NNVM中的graph包含了计算图的结构,并且包含了一个从字符串到任意类型的属性映射
map< string, shared_ptr< any > >
这个属性映射包含了每一个tensor的shape、type以及内存分配计划。
NNVM中的pass就是对包含了各种属性映射信息的计算图执行转换,转换使得该计算图拥有更多地属性或者变为另一个计算图。NNVM中实现的pass包括自动差分计算、形状和类型推断、内存计划等。
NNVM采用NNVM_REGISTER_OP去注册一个operator,并可以对不同的op用set_attr注册不同的属性,使得不同operator的实现不必采用同一个operator接口,完成了去中心化的设计目标,使得不同框架下的operator实现都可以采用NNVM做计算图优化。
2.特点
支持的前端和后端
NNVM编译器可以直接从深度学习框架(如Apache MXNet)获取模型。 它还支持模型交换格式,如ONNX和CoreML。对ONNX的支持使NNVM能够从PyTorch,Caffe2和CNTK编译深度学习模型。对CoreML前端的支持将CoreML模型部署到非iOS设备。
分离优化和部署
NNVM编译器应用图形级别和张量级别优化,并联合优化它们以获得最佳性能。 NNVM编译器采取与现有的深度学习框架不同的方法,将图优化与部署运行时打包在一起。 NNVM编译器将优化与实际的部署运行时分离开来,这种方法提供了大量的优化,但仍然保持运行时轻量级。编译后的模块只依赖于最低的TVM运行时间,在树莓派或移动设备上部署时只需要300KB左右。
3.性能
Nvidia GPU
NNVM编译器生成的代码优于K80上的Apache MXNet。 这些改进是由于联合图级和内核级优化。 值得注意的是,NNVM编译器自己生成所有优化的GPU内核,而不依赖于像CuDNN这样的外部库。
Raspberry Pi 3b
由NNVM编译器生成的代码比ResNet18的快两倍。 MobileNet上的差距主要是由于现有的CPU DNN库缺乏深度卷积。 NNVM编译器直接生成高效的ARM代码。