算术为参考文档
- https://github.com/dmlc/nnvm
- https://github.com/dmlc/tvm
- http://tvmlang.org/
- https://baijiahao.baidu.com/s?id=1580600243200331182 陈天奇团队发布NNVM编译器,性能优于MXNet
- https://mp.weixin.qq.com/s/CHUZX92tERidKq-y3EMTfQ NNVM 编译器导论:用于AI框架的一种新式端到端编译器
- http://dataunion.org/31598.html 如何使用CNN推理机在IoT设备上实现深度学习
- https://zhuanlan.zhihu.com/p/32711259 从NNVM和ONNX看AI芯片的基础运算算子
- https://www.zhihu.com/question/64091792/answer/217722459 如何评价陈天奇团队新开源的TVM?
综述
NNVM是亚马逊和华盛顿大学合作发布的开源端到端深度学习编译器,支持将包括mxnet,pytorch,caffe2,coreml等在内的深度学习模型编译部署到硬件上并提供多级别联合优化。速度更快,部署更加轻量级。支持包括树莓派,FPGA板卡,服务器和各种移动式设备和cuda,opencl,metal,javascript以及其它各种后端。
NNVM compiler可以将前端框架中的工作负载直接编译到硬件后端,能在高层图中间表示(IR)中表示和优化普通的深度学习工作负载,也能为不同的硬件后端转换计算图、最小化内存占用、优化数据分布、融合计算模式。
NNVM编译器基于此前发布的TVM堆栈中的两个组件:NNVM用于生成计算图,TVM用于映射张量运算。
NNVM:将不同框架的工作负载表示为标准化计算图,然后将这些高级图转换为执行图
TVM:提供一种独立于硬件的特定域语言(DSL),以简化张量索引层次中的运算符实现。另外,TVM还支持多线程、平铺、缓存等。
TVM软件堆栈
上图基本上展示了TVM软件堆栈的功能构成:
- Computation Graph Optimization
- Tensor Compute Description
- Schedule Space and Optimzation
值得关注的是TVM软件堆栈并不是一个完全重新创建的应用软件,作者本人也提供到TVM参考和继承的软件,其中提到了TOPI、HalideIR、TACO和Loopy,如果你的需求不是仅仅使用TVM,而是定制TVM来满足自己的需求的话了解TVM的软件继承关系是非常有必要的。
TOPI(TVM Operator Inventory)
TOPI即TVM操作符清单,一个TVM操作符收集库,是为了让TVM可以同时手工定制和自动优化计算Kernel函数。具体的目标为:
- 提供操作符声明的语法糖
- 提供创建融合操作符的基础功能
- 提供不同硬件下的通用调度器
文件组织
- include:C++库,只包含头文件
- python:TOPI的python库
- recipe:包含一些有用的操作符示例集合
指导方针
- 使用numpy-style操作符命名约定
- 尽可能分离操作符声明和调度
- 慎重地维护需求
- 注意数据布局,如果不指定则默认使用NCHW布局
HalideIR
HalideIR是一个构建符号表达式的基本模块,并且可以为新的DSL(领域专用语言)提供算术简化功能。HalideIR是通过剥离和重构Halide项目的一部分得到的。值得注意的是除了HalideIR,TVM编译器的其他部分代码也源自Halide代码库。
根据TVM官方说明来看,当TVM团队准备为编译器软件堆栈创建符号表达式数据结构和算术简化代码时发现市面上并没有可以直接独立使用的相关模块化代码库。所以才选择剥离和重构Halide项目供TVM使用的方案,而没有直接使用Halide项目。
文件组织
- tvm:TVM包装器相关代码
- base:基础工具箱和数据类型
- ir:IR数据结构
- arithmetic:算术简化