大家好!感谢大家在百忙之中出席今天的分享会,我非常荣幸有机会向大家汇报过去半年在MLIR小队的工作成果。在这段时间里,我不断努力和成长,为推动buddy-mlir小队的发展贡献了自己的一份力量。接下来,我将更详细地分享我的工作,涵盖构建系统的完善、Sparse Tensor的深入研究、PyTorch到RISC-V V扩展验证流程的全面完成,以及与chipsalliance/t1项目的深度合作等方面。

首先,我要谈到的是我在修复和完善buddy-mlir构建系统方面的工作。原有的构建系统专注于内部使用,但随着buddy-mlir的高速迭代发展,有更多的下游项目需要用到 buddy-mlir 的内部特性,我们迫切需要一个更为健壮和灵活的构建系统。比如目前我们分成了前端中端和后端三个代码源,分别有不同的头文件和 Python Binding,而原有的构建系统并不支持安装这些文件。通过对构建系统的彻底修复和完善,我们现在拥有了一个更加稳定、可维护的编译环境,能够更好地支持下游对buddy-mlir的使用。

接下来是我对MLIR Sparse Tensor的深入调研。Sparse Tensor在AI领域是一个重要的概念,通过优化Sparse Tensor,我们能够为稀疏模型提供存储和计算上的重要优化。我投入了大量的时间和精力,从Sparse Compiler与其他Dialect的协同工作到内部Pass的深度分析,将这些工作总结成一系列博客和使用样例,并纳入buddy-mlir的仓库。这一系列的工作为我们未来在RVV上对Sparse Tensor的优化工作奠定了坚实的基础,为整个团队在这一领域的研究提供了重要的参考。

此外,我顺利完成了从PyTorch到RISC-V V扩展的端到端验证流程。这项工作对buddy-mlir来说至关重要,因为DSL到DSA的端到端编译支持是我们工作的一个关键部分。

PyTorch作为一种流行的深度学习框架,拥有着丰富的生态系统和强大的社区支持。然而尽管Python在AI生态中非常活跃,但其在高性能计算方面的局限性不可忽视。由于 Python 其本身的语言特性,比如其解释性质和动态类型系统,使得在PyTorch中进行静态分析和优化变得相对困难。高性能计算往往需要对代码进行静态分析以进行更有效的优化,但是PyTorch的动态图特性使得这一过程变得复杂。为了克服这个挑战,buddy-mlir提供了支持从DSL到DSA编译的完整编译生态,使用了 dynamo compiler 等一系列技术手段,在中端采用了包括静态图转换和对PyTorch模型的特定优化。为用户提供了在Python中继续使用PyTorch框架的同时,能够利用 buddy-mlir 的基建,获得LLVM的高性能优化支持。其次,由于PyTorch的生态系统非常庞大,与其它深度学习框架相比,我们需要特别关注与 RISC-V V 扩展的优化问题。一些常见的优化技术在传统的CPU或GPU上可能有效,但在RISC-V V扩展上可能需要进行一些定制化的修改。

我的工作重点在于为 buddy-mlir 提供RISC-V V拓展后端的支持,一个例子就是近期与chipsalliance/t1项目保持着紧密的合作。t1项目是一个使用Chisel生成、支持RISC-V V拓展的长向量IP核心。通过与t1项目的深度合作,buddy-mlir 的 AI 至 RVV 的端到端实现在 t1 上完整成功的验证。在这个过程中,我遇到了一些挑战,比如t1项目是一颗baremetal环境的嵌入式核,t1 的仿真环境是 baremetal 的,既没有 kernel,没有 syscall,也没有 filesystem。而 bert 依赖往 stdout 打输出,也需要 malloc 申请内存。缺乏对 t1 这一后端的支持,导致在一段时间内从PyTorch到t1的端到端流程只能在模拟器环境验证,无法在真正的 rvv 的 IP 核上验证。为了解决这些后端基础库缺失的问题,我引入了newlib这一专门为嵌入式打造的库,并手动实现了一系列如 sbrk, write 等函数,手动对接上 t1 内部的 uart mmio 设备和内部内存模型,以适应 t1 团队的特殊需求。最终成功在t1项目的仿真环境上跑通了AI模型bert。在 t1 项目上完成端到端的验证流程,可以给我们团队提供更多真实的硬件数据,为未来做自动向量化和对 rvv 做优化提供了坚实的基础。

在与t1团队的合作中,我也投入了大量精力协助他们重构开发环境。首先是优化CI测试,确保每次修改都能及时更新测例数据、核心性能变化数据和波形文件数据。为了让性能变化更为直观,我加强了可视化方面的工作,这样在每一次 RTL 更改后,buddy 小队和 t1 小队都能看到新的性能数据增长或下降,并针对性做出调整。

接下来,我协助优化t1团队的构建环境,采用nix flake作为开发环境的部署工具,经过一系列配置后,现在我们能够用一条命令轻松配置好mlir/jre/clang等工具链,以及完整的从测例源码到 ELF 的编译流程定义,我们拥有着最可复现的环境,不管你在任何机器上,搭建 t1 的仿真环境,跑起 buddy-mlir 的测例,结果都是能稳定运行,可复现结果的。

随后,我帮助t1团队重构他们的仿真环境,通过从增加更多内部探针,获取这颗核心的内部数据,如在Lane内部添加laneRequest 的 valid/ready 探针、Load/Store Unit 内获得 tilelink port A/D 的 valid 和 ready 信号的探针。通过这些探针,我们能够获取t1这颗核心的微观组件状态,当出现 performance issue 时,可以清晰的观测到在哪一个 cycle,内部的哪一个小的组件出现了阻塞,从而更方便地过滤波形数据。同时结合框图的方式,可以为buddy-mlir团队提供更全面、更直观的数据,帮助他们做性能分析和编译优化。这一系列的工作不仅提高了我们在RVV后端工作中的效率,同时也对t1团队整体工作产生了积极的促进作用,这一工作也为未来软硬协同调优的工作铺垫了基础。

以上是我在过去的半年里获得的成果,通过与buddy-mlir团队和t1团队的紧密合作,我不仅在技术领域取得了显著进展,同时也促进了两个团队之间的协同发展。未来,我将继续在这一合作基础上不断努力,为未来 buddy-mlir 性能优化工作和研究提供以下的支持。首先我可以利用现有的后端工作的经验,为 buddy-mlir 在未来对接其他后端的工作中提供更多的帮助,让 buddy-mlir 优化后的代码跑在更多的设备上。其次,基于这些新的后端,为 buddy-mlir 小队提供全新的 perf 数据,帮助前中端工作的小伙伴做优化。最后,基于我本身拥有的大量 infra 和发行版的现有知识,可以为 buddy-mlir 和其他后端之间提供一个稳定,可靠,reproducible 的开发环境部署, CI 环境建设,和软件的构建发行。除了内部工作,我也会积极参与开源社区的交流合作,与更多的团队分享我的经验和成果。最后,我对buddy-mlir的未来充满信心。相信在团队的共同努力下,我们将能够取得更大的成就,为技术的发展和行业的繁荣做出更为重要的贡献。感谢大家的支持,