欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来谈谈 AI编译,是谈谈AI发展系列的第五篇。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq
本文是 “谈谈 AI 发展” 的第五篇,其他几篇的情况如下:
- 谈谈 AI 发展第一篇:AI 训练框架 ==> 访问方式:链接;
- 谈谈 AI 发展第二篇:AI 推理框架 ==> 访问方式:链接;
- 谈谈 AI 发展第三篇:AI 训练算力 ==> 访问方式:链接;
- 谈谈 AI 发展第四篇:AI 推理算力 ==> 访问方式:链接;
- 谈谈 AI 发展第五篇:AI 编译框架 ==> 本篇;
- 谈谈 AI 发展第六篇:AI 大模型应用 ==> 敬请期待;
时光斗转星移,AI 飞速发展。
满打满算,我真正进入到 AI 这个行业差不多五年多的样子,这段时间其实是正处于 AI 框架和 AI 算法本身快速发展的黄金阶段。也很有幸见证了一些 “古早” 的框架、算法,以及从 “古早” 到 “现代” 快速进化的过程,感慨良多。我决定在这几篇文章中谈谈我这个阶段对于 AI 的一些基础设施,如框架、算力、算法等的思考、感受和想法,作为一种输出,也作为一种记录,可能几年后回过头再来看,会别有一番滋味。
深度学习编译器,听起来是个高级词汇,把它拆开来理解可能会更加好理解一些。大家知道编译器的功能是将高级编程语言编译成目标机器可以直接执行的机器语言,这个理解的基础上再加入 “深度学习” 的话,可以直接将深度学习编译器的功能理解为将深度学习图表达编译成目标机器可以直接执行的机器语言。当然,不管是编译器还是深度学习编译器,都会涉及端到端的编译优化。
记得最开始接触 “深度学习编译器” 差不多是在 20 年的时候,那时候 TVM 还很年轻,更新迭代特别快,其实即使现在也是版本迭代很快,这其实也说明 TVM 的社区力量是非常庞大的。
TVM 让我 “喜爱” 的原因不只是是因为它本身做的事情 (深度学习编译,前后端统一),还因为它的作者陈天奇。当时我记得一查,丽水、上海交大,一下子亲切感就上来了,再一查,XGBoost、MXNet、TVM,大佬啊大佬。这种对大佬 “觉得很近实际很远” 的 “错觉” 之前也有过,记得高中的时候,英语老师是马云同桌 (下图之一),每次上英语课半节课都在讲马云,导致我英语成绩不好的同时也让我 “错误地” 认为马云就是我们那嘎啦身边的人,直到我大学来到杭州才发现大家都在叫 “马爸爸”,然后就悟了。
回到 TVM,说到 AI 编译框架,很多人的第一反应就是 TVM,没错,我也是。直到现在,我依旧认为 TVM 就是 AI 编译框架的代表。AI 编译框架想解决的问题主要是前后端的高性能统一大业,前端统一训练框架,后端统一算力硬件。其实我觉得后端统一的现实意义会更加大一些,毕竟前端在现在这个年代已经呈现逐步收敛到 Pytorch 的趋势,然后再加个 Onnx 其实就能支持大部分了,而后端才是那个真正ß依旧呈 “百花齐放” 的地方。
对于 “后端才是百花齐放的地方”,我的真正感受来自于昇腾 CANN。之前我看着天奇的 PPT,哦后端会支持 CPU、GPU、ARM、FPGA、手机端,然后拿起 TVM 的示例,在 GPU 上跑一跑试试 with TensorRT、在树莓派上跑一跑试试 TVM RPC,对,天奇说的对,确实是支持。但似乎没有在实际项目中深度使用过,就是会感触不太深。记得是在华为杭研院,我第一次听到了 CANN 的一些技术分享,特别是自定义算子那一块,什么 DSL、什么 TIK、什么循环拆分、什么资源调度、什么 auto-tune,咋的头文件还有 tvm 巴拉巴拉,我当时就琢磨这应该就是基于 TVM 整的吧,事实也确实如此。这其实也是 TVM 这类深度学习编译器特别显作用的地方:对于自研 NPU 的软件栈架构,基于 TVM 的硬件抽象是个不错的选择。
调优、代码生成,似乎是深度学习编译器最为明显的特征,那么什么是调优,什么是代码生成呢,这个时候就会自然墙推郑怜悯的这篇 Ansor 的论文《Ansor:Generating High-Performance Tensor Programs for Deep Learning》,下面是 ansor 的系统逻辑架构,
下面是调优超参搜索的策略,
下面是搜索空间的生成策略,
对于这篇文章的解读我之前也写过,可供参考《AI编译优化 | 谈谈 tvm ansor》。ansor 是 auto-tvm 的升级版,是真正的自动调优,而 auto-tvm 则提供了手动写 temp 的调优方式。TVM 有了 ansor 的加持,不管是单算子、subgraph 还是整网,表现都很棒。
除了 TVM,另外不得不提 MLIR。在前面的介绍中,不管是自动调优、不管是代码生成等都是基于深度学习图表达的,这其实也可以看出 TVM 是比较专用于深度学习编译的,而 MLIR 在定位上会更底层一些,MLIR 更加关注于提供一种通用且灵活的中间表达、为构建编译器提供基础设施。或者再直接点,MLIR 可以被用来构建 TVM 这样的编译器系统。尽管两者在功能上有一定的交集,但 MLIR 更像是一种底层技术基建,而 TVM 则是一个更加上层、更加专用、专门针对深度学习的实现。在实际应用中,MLIR 可以作为 TVM 的一个重要组件或者一种互补来使用,使得 TVM 能够更容易地整合更多元化的前端语言和后端硬件支持。
说了这么多,来介绍一下 MLIR 本身,MLIR 全称为 Multi-Level Intermediate Representation,最初是由 Chris Lattner 在 Google 主导开发的项目,目前已经合并到 LLVM 项目中,成为了 LLVM 的一部分,而 LLVM 在编译器层面的范畴则更广,这个大家应该相对会更加了解一些。
再说个国产的软件栈,感兴趣的朋友可以去看看国产芯算能的软件栈,在编译生成 bmodel 的时候有两种方式,一种是 nntc,另外一种就是 mlir 编译,而目前则是全盘在往 mlir 转。
另外类似的 AI 编译框架还有 XLA、Glow 等,这些我目前接触偏少,就不在这里多说了。
好了,以上分享了 谈谈 AI 发展第五篇:AI 编译框架,希望我的分享能对你的学习有一点帮助。
【公众号传送】
畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。一定会对你学习有所帮助,也一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq