简而言之,框架是大量可重用的基础设施/库的集合,而语言需添加语法元素
深度学习框架 | 图框架 | |
---|---|---|
算子 | 卷积conv 池化pooling 激活relu |
收集gather 应用apply 分发scatter |
自定义函数 | forward |
process_message |
现有框架 | Tensorflow (Google) Pytorch (Facebook) MXNet (Amazon) |
Pregel (Google) Giraph (Facebook) Spark (Apache) |
注意上表中的内容只是举例,还有很多算子、函数和框架并未列出
全栈编译器(compiler stack)!
作用是将不同深度学习框架上写的模型/计算图,映射到不同的硬件上(下图来自陈天奇在TVM Conference上的演讲
注意TVM并不是把整个框架映射到硬件上,而是将这些框架训练出来的模型映射到硬件上。 这里的模型其实就相当于算法。
前提是模型必须先训练(train)好,参数都已经固定,然后才可以通过TVM编译到不同硬件上跑推断(inference)[3]。
做法是在tensorflow或pytorch中save_model
。
当然,现在TVM也在尝试将未训练的模型编译到硬件上进行训练(这要添加优化器),理论上也是可行的。
TVM的思路是我现在有一堆深度学习模型,想要deploy到不同硬件上,那么就抽取这些模型的共同特征(计算图)统一进行优化,然后像llvm一样再分配到不同硬件上。
而对于图来说,我现在有一堆图算法,想要deploy到不同硬件上,那么就抽取这些算法的共同特征(算子)统一进行优化,然后再分配到不同硬件上。
深度学习界几乎没有人想要造一门新的DSL,猜想可能的原因:
这其实也说明DSL和框架的区别不是很大。
而图分析这边,CSAIL在2018年发布了GraphIt,比原有state-of-the-art的框架的性能高出几倍。
这则说明DSL和框架的区别还是有的,规范了语法语义(实际上是规范用户行为),就可以更方便更好地进行编译优化。