首页 > 其他分享 >【AI编译器】MLIR — 入门

【AI编译器】MLIR — 入门

时间:2024-12-23 18:55:20浏览次数:5  
标签:LLVM AI MLIR bazel 编译器 llvm 构建

前言

MLIR 社区充满活力。但由于它是一个新的且快速发展的项目,因此可用的教程和文档并不多。没有权威的MLIR书籍。大多数围绕事物的推理都来自民间传说和技术性很强的 RFC。而且由于 MLIR 构建在 LLVM(该缩写词以前的意思是“低级虚拟机”)之上,因此现有的许多文档都通过类比 LLVM 来解释概念,这对于像我这样不熟悉内部结构的人来说没有帮助LLVM 的工作原理。最后,在我看来,目前的教程水平太高,无法让人们真正了解如何在框架中编写程序。为此,我希望降低使用 MLIR 的准入门槛。因此,这一系列博客文章将详细介绍 MLIR 的总体情况。

MLIR 和 LLVM 简史

关于 MLIR,您首先会注意到的是,它位于LLVM 项目的 monorepo中名为mlir/文件夹下。 LLVM 是一种抽象的汇编语言,编译器开发人员可以将其作为后端,然后 LLVM 本身打包了许多优化和可以编译到的“真正”后端目标。比如说,如果您使用Rust 编程语言,并且希望编译为 x86、ARM 和 WebAssembly,而无需执行所有这些工作,则只需输出 LLVM 代码,然后运行 ​​LLVM 的编译套件即可。

我不想过多了解 LLVM 的历史(更多详细信息请参阅此采访),而且我对它没有任何第一手知识,但从我可以收集到的 LLVM(以前代表“Low Level”) Virtual Machine”)是Chris Lattner在 2000 年代初期的博士项目,旨在成为下一代 C 编译器。 Chris 转到 Apple,负责 LLVM 以及基于 LLVM 构建的 Swift 等语言的工作。 2017 年,他加入 Google Brain,担任 TensorFlow 基础设施团队总监,他和他的团队构建了 MLIR来统一其生态系统中的孤立工具。

我们将在以后的文章中详细讨论 MLIR 到底是什么以及它提供什么。有关高级概述,请参阅 MLIR 论文。简而言之,它是一个构建编译器的框架,其基本理念是一个大编译器应该被分解为许多子语言之间的小编译器(编译器人称之为“中间表示”或“IR”),其中每个子语言-语言旨在使特定类型的优化更自然地表达。因此,MLIR 是多级中间表示的缩写。

MLIR 与 TensorFlow 相关,因为训练和推理都可以被视为程序,其指令类似于“2d 卷积”和“softmax”。优化这些指令并将其转换为较低级别的硬件指令(尤其是在 TPU 加速器上)的过程在很大程度上是编译器的问题。 MLIR 将过程分解为不同抽象级别的 IR,例如张量运算线性代数和较低级别的控制流

但 LLVM 无法直接用作 TensorFlow 编译器。对于 CPU 来说,它过于传统且过于专业化,在较低的抽象层上运行,并且存在附带的技术债务。但 LLVM 确实有许多可重用的部分,例如数据结构、错误处理和测试基础设施。再加上 Lattner 对他工作了近 20 年的项目的熟悉程度,将 MLIR 放入 monorepo 中可能会更容易启动它。

Build systems

现在,LLVM 和 MLIR 的官方构建系统是CMake。但出于几个原因我将使用Bazel。首先,我想引导感兴趣的读者了解 HEIR,这就是 HEIR 所使用的,因为它是 Google 旗下的项目。其次,尽管人们可能担心 Bazel 配置复杂或不受支持,但由于 MLIR 和 LLVM 已成为 Google 生产基础设施的关键,Google 帮助维护Bazel 与 CMake 配置并行的“覆盖”,并且 Google 有待命工程师负责确保 Google 的 MLIR 内部副本与 LLVM monorepo 保持同步,并确保任何构建问题都能得到及时修复。剩下的粗糙边缘对于像我这样不耐烦的假人来说足够简单了。

(下面这部分可跳过,去看看CMake)

这是 Bazel 的概述(其中部分内容重复于我之前的文章)。Bazel是 Google 内部构建系统“Blaze”的开源类似物,而Starlark是其受 Python 启发的脚本语言。关于 Bazel 有很多观点,这里不再赘述。您可以使用bazelisk程序安装它

首先是一些术语。要使用 Bazel,您需要执行以下操作。

  • 定义一个WORKSPACE文件,该文件定义项目的所有外部依赖项、如何获取其源代码以及应使用哪些 bazel 命令来构建它们。这可以被认为是顶级 CMakeLists,只不过除了声明项目目录树的根和项目名称之外,它不包含任何构建项目的指令。
  • 在每个子目录中定义一组BUILD文件,声明可以从该目录(但不是其子目录)中的源文件构建的构建目标。这类似于子目录中的 CMakeLists 文件。每个构建目标都可以声明对其他构建目标的依赖关系,bazel build确保首先构建依赖关系,并在会话中缓存构建结果。许多项目在项目根目录中都有一个BUILD文件,用于公开项目的公共库和 API。
  • 使用cc_librarycc_binarycc_test等内置 bazel规则将文件分组到可以使用bazel build构建的库、也可以使用bazel run运行的可执行二进制文件以及也可以使用bazel test运行的测试。大多数 bazel 规则归结为使用特定参数调用一些可执行程序,例如gccjavac,同时还跟踪文件系统上“封闭”位置中构建工件的累积依赖项集。
  • 定义执行自定义程序的新 bazel 规则,并声明静态依赖关系图的依赖关系和输出。 MLIR 的自定义规则围绕tblgen程序该程序是 MLIR 的自定义模板语言,用于生成 C++ 代码
  • 编写将内置 bazel 命令链接在一起的任何其他 bazel。宏看起来像调用各个 bazel 规则并可能在它们之间传递数据的 Python 函数。它们编写在.bzl文件(包含 Starlark 代码)中,由bazel直接解释。当我们谈论 MLIR 的测试框架lit时,我们会看到一个很好的 bazel 宏示例,但本文包含一个简单的示例,用于在WORKSPACE文件(也是 Starlark)中设置 LLVM 依赖项。

一般来说,bazel分两个阶段构建目标。首先是分析阶段,它加载所有BUILD文件和导入的.bzl文件,并扫描所有被调用的规则。特别是,它运行宏,因为它需要知道宏调用什么规则(并且规则可以由控制流保护,或者它们的参数可以动态生成等)。但它本身并不运行构建规则。在此过程中,它可以构建完整的依赖关系图,并报告有关拼写错误、缺少依赖关系、循环等的错误。分析阶段完成后,它会按依赖关系顺序运行底层规则,并缓存结果。仅当规则所依赖的文件或其底层依赖项发生变化时,Bazel 才会再次运行规则。

WORKSPACE 和 llvm-project 依赖项

添加.gitignore来过滤掉 Bazel 的构建目录后,此提交设置了一个初始WORKSPACE文件和两个 bazel 文件,它们执行不寻常的两步舞蹈来配置 LLVM 代码库。工作区文件如下所示:

workspace(name = "mlir_tutorial")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")

load("//bazel:import_llvm.bzl", "import_llvm")

import_llvm("llvm-raw")

load("//bazel:setup_llvm.bzl", "setup_llvm")

setup_llvm("llvm-project")

这不是一种正常的依赖关系。正常的依赖关系可能如下所示:

http_archive(
    name = "abc",
    build_file = "//bazel:abc.BUILD",
    sha256 = "7fa5a448a4309fb4d6cf856c3fe4cc4be46b09dd552a05d5cfacd75f8d9504ad",
    urls = [
        "https://github.com/berkeley-abc/abc/archive/eb44a80bf2eb8723231e72bb095c97d1e4834d56.zip",
    ],
)

上面告诉 bazel:从给定的 URL 中提取 zip 文件,仔细检查它的哈希和,然后(因为依赖的项目不是用 bazel 构建的)我会告诉你在我的存储库中的哪里可以找到你应该的 BUILD 文件用于构建它。如果项目有 BUILD 文件,我们可以省略build_file并且它会正常工作。

现在,LLVM 具有 bazel 构建文件,但它们隐藏在项目的utils/bazel子目录中。 Bazel 要求其特殊文件位于正确的位置,并且 bazel 配置旨在与 CMake 配置同步。因此utils/bazel目录有一个llvm_configurebazel 宏,它执行一个正确符号链接所有内容的 python 脚本。有关上游系统的更多信息可以在此处找到。

因此,要运行这个宏,我们必须下载 LLVM 代码作为存储库,将其放入import_llvm.bzl文件中,并调用该宏,将其放入setup_llvm.bzl中。为什么有两个文件? bazel 的一个明显的怪癖是,您无法从下载依赖项的同一个WORKSPACE文件中的依赖项的 bazel 文件中load()宏。

还值得一提的是,import_llvm.bzl是我放置硬编码提交哈希的位置,该哈希将该项目固定到特定的 LLVM 版本。

相关文章:

【AI编译器】MLIR(7)— Dialect转换 - 知乎

【AI编译器】MLIR(6)— Dialect使用Traits - 知乎

【AI编译器】MLIR(5)— 定义一个Dialect - 知乎

【AI编译器】MLIR(4)— Tablegen写pass - 知乎

【AI编译器】MLIR(3) — 编写第一个pass - 知乎

【AI编译器】MLIR(2) — 运行和测试Lowering - 知乎

【AI编译器】MLIR(1) — 入门 - 知乎

标签:LLVM,AI,MLIR,bazel,编译器,llvm,构建
From: https://blog.csdn.net/qq_34106574/article/details/144675216

相关文章

  • 全民AI时代:手把手教你用Ollama & AnythingLLM搭建AI知识库,无需编程,跟着做就行!
    前言在本地电脑上跑大语言模型(LLM),已经不是什么高科技操作了。随着技术的迭代,现在利用Ollam和AnythingLLM就可以轻松构建自己的本地知识库,人人皆可上手,有手就行。过往要达成这一目标,可是需要有编程经验的。首先得了解一下背后的原理。大概就是三步走:一是LLM,大语言模型,懂得......
  • Uncertainty-aware Grounded Action Transformation towards Sim-to-Real Transfer fo
    根据这段伪代码(Algorithm1)和描述提供的信息,以下是对动作选择流程的详细分析,以及如何解决策略$\pi_\theta$和逆向模型$h_{\phi-}$在动作生成和修正中的作用:UGAT算法的核心流程预训练策略$\pi_\theta$(第1行)在虚拟环境$E_\text{sim}$中,用强化学习对策略$\p......
  • 大小球准确判断方法:AI人工智能大数据预测
    一、引言在体育竞技领域,预测比赛结果一直是众多球迷和专业人士关注的焦点。本文旨在探讨如何运用AI人工智能和大数据技术,对比赛中的大小球结果进行准确判断。我们将详细介绍相关算法和算式,以及如何在实际操作中提高预测的准确性。二、数据预处理在进行AI预测之前,首先要对数......
  • 电影/短剧解说AI神器~!一键去重生成解说视频!
    今天给大家分享一个非常奈斯的工具,这真得是做短剧或者是影视解说赛道兄弟们的福音啊~!废话不多说,赶紧来看看它是咋样的:它是一款集成了深度去重、视频拼接、智能讲解以及自动识别讲解等功能的AI视频处理工具。以下是这些功能的详细介绍:深度去重提供了帧级深度去重功能,能......
  • 电影/短剧解说AI神器~!一键去重生成解说视频!
    今天给大家分享一个非常奈斯的工具,这真得是做短剧或者是影视解说赛道兄弟们的福音啊~!废话不多说,赶紧来看看它是咋样的:它是一款集成了深度去重、视频拼接、智能讲解以及自动识别讲解等功能的AI视频处理工具。以下是这些功能的详细介绍:深度去重提供了帧级深度去重功能,能......
  • 电影/短剧解说AI神器~!一键去重生成解说视频!
    今天给大家分享一个非常奈斯的工具,这真得是做短剧或者是影视解说赛道兄弟们的福音啊~!废话不多说,赶紧来看看它是咋样的:它是一款集成了深度去重、视频拼接、智能讲解以及自动识别讲解等功能的AI视频处理工具。以下是这些功能的详细介绍:深度去重提供了帧级深度去重功能,能......
  • 电影/短剧解说AI神器~!一键去重生成解说视频!
    今天给大家分享一个非常奈斯的工具,这真得是做短剧或者是影视解说赛道兄弟们的福音啊~!废话不多说,赶紧来看看它是咋样的:它是一款集成了深度去重、视频拼接、智能讲解以及自动识别讲解等功能的AI视频处理工具。以下是这些功能的详细介绍:深度去重提供了帧级深度去重功能,能......
  • 电影/短剧解说AI神器~!一键去重生成解说视频!
    今天给大家分享一个非常奈斯的工具,这真得是做短剧或者是影视解说赛道兄弟们的福音啊~!废话不多说,赶紧来看看它是咋样的:它是一款集成了深度去重、视频拼接、智能讲解以及自动识别讲解等功能的AI视频处理工具。以下是这些功能的详细介绍:深度去重提供了帧级深度去重功能,能......
  • Ai翻译软件大对决:九款Ai翻译神器深度剖析与选型指南,建议收藏
    在当今这个全球化与互联网深度交融的时代,语言的隔阂曾是人们交流、学习以及工作娱乐时面临的一大阻碍,而AI翻译软件的出现,就如同点点星光,照亮了跨越这些障碍的道路,成为了大家生活中极为重要的帮手。今天,咱们就一起走进九款颇具代表性的AI翻译软件,去好好了解一下它们各自的独......
  • 这家语音 AI 公司新融资 2700 万美元,并预测了 2025 年语音技术趋势
    12月13日,语音AI初创公司Cartesia宣布完成了新一轮2700万美元的融资,由知名风投机构IndexVentures领投。 Cartesia由KaranGoel和AlbertGu联合创立,专注于开发基于状态空间模型(SSM)的创新架构,该架构以其卓越的计算效率和实时处理能力而著称。Cartesia的核心产......