最近看到量子位的一则新闻,Pytorch核心开发者灵魂发问:我们怎么越来越像Julia了?
那到底像不像?
我们先看看Julia的特点:
- 动态语言+JIT:其实Julia的JIT很有特色,特别是类型系统和特化这一块,Julia是一个动态语言,但是在jit中需要通过类型系统和特化尽量把类型推导出来,这样才利于JIT优化,这点和AI框架把Python前端翻译到静态图的目标是非常相似的。
- IR反射:Julia利用IR反射机制实现了自动微分的能力,但是本质IR反射其实就是AST的重写,整体自动微分的思路就是source to source的。
- 多指派(multiple-dispatch):看上去与AI框架的算子选择在思路上是非常像的。
具体到Pytorch,其实,我感觉这个要分三个方面看:
1、Pytorch主攻的方向动态图,个人感觉这条路线和Julia是不像的,一个是解释执行、基于Tape的自动微分;另外一个是JIT执行、基于source to source的微分。
2、Pytorch的tracing机制,个人认为与Julia的路线也不一样,因为JIT的思路不一样,Pytorch的tracing实际是采用执行记录的方式进行JIT,而Julia的方式,如前面所讲,是类型推导/特化这种传统的编译器思路。
3、Pytorch的TorchScript机制,这个其实和Julia就有点像了,从Python的表达转换到静态图用到了类似Julia的类型推导、特化、编译优化等JIT技术,但是TorchScript的功能完整性弱了很多,比如控制流这些支持就很不完整。
从我个人的观点看,这些路线中动态图才是Pytorch的主推方向,比如,最近推出的FX等功能,也是在Python层上做Python Rewrite等,然后映射到动态图;所以Pytorch越来越像Julia这个观点还待观察。
实际上,从技术路线上看,MindSpore的静态图实现方式与Julia是最相似的,体现在:
1、JIT技术,MindSpore通过类型推导/特化/优化等技术将Python前端转到了静态图,这里面涉及的难点就是动态类型在执行期转到静态类型,这个方式与Julia是类似的,但是Python语言的动态性更强,比Julia的挑战更大。
2、自动微分,两者都是source to source的微分,当然MindSpore考虑到反向微分的便利性采用了函数式的思路,这一点和Julia是有区别的
3、多指派,MindSpore的算子选择和Julia的method选择上都采用了类似技术。
来源:知乎
作者:金雪锋
推荐阅读
更多嵌入式AI技术相关内容请关注嵌入式AI专栏。