Tutorial - 如何在MacOS 上安装Mlir以及MLIR Python Binding
在习惯了在 IDE 中利用成熟的编译工具链运行代码和享受舒适的代码编写环境之后,我逐渐依赖于具有 GUI 界面的软件工具,而忽视了使用命令行直接操作程序的重要性。因此,在这次搭建环境的过程中,我深刻地感受到了自己对 Unix 指令的不熟悉。本文的主要目的是展示如何从源代码开始构建、手动编译整个过程的步骤,并记录我不断踩坑的经历以及如何克服这些困难。我通过博客的形式记录并发布在互联网上,希望能帮助解决您在 macOS 安装 MLIR Python-Binding时遇到的问,并提供实用的经验。
【环境】MacBook Pro M2 系列芯片
对于Intel 系列 X86 架构的Macbook 用户,直接掉过本小节中的 1.1
MLIR中的Python-binding提供的底层文件是基于X86架构的。这是我踩的第一个坑,自作主张地用Cmake 修改了xz,lz4的动态链接库(.dylib)的支持的硬件架构,导致最终没有通过ninja的python的测试
首先打卡命令行 配置Rosetta2 的模拟环境 :
softwareupdate --install-rosetta
1.安装miniforge,在主页面上下载x86_64版本 或者 mambaforge的x86_64版本
2.在安装Miniforge之前,确保当前的终端会话已经通过Rosetta 2启动。您可以使用arch -x86_64
来启动一个新的终端会话,模拟由Rosetta创建的x86_64环境如下所示
arch -x86_64 zsh
bash 安装包名字.sh
以上步骤实现在arm架构的芯片上创建一个x86的虚拟环境
默认系统上已经有Python 3.6版本以上的Python解释器 ,在终端中通过python --version
查看
安装Homebrew包管理器,如果你还没有安装Homebrew,请在终端中输入以下命令来安装:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
继续安装,使用Homebrew安装跨平台的构建系统CMake和构建工具Ninja:
brew install cmake ninja
运行不用的Python项目依赖的环境和资源包不同,为了避免各种环境产生的干扰以及发生不必要的冲突(又是一段心酸的血泪史),应该单独为每一个项目都创建一个Python编写的虚拟环境。下面介绍如何用在终端中使用包管理器工具Conda
首先激活环境:
conda activate
创建一个新的Python虚拟环境
conda create -n `your_name` python=3.10
激活新创建的Python环境
conda activate `your_name`
经过以上的操作 ,命令行提示的前缀名从(base)变为了我安装的名字为tutorial的虚拟环境
4.最后通过在终端运行file $(which python)
来检查是否成功安装了x86架构的python解释器,Mac intel 芯片的用户可以忽略
(file
命令用于确定给定文件的类型,包括可执行文件、文本文件、二进制文件)
另外可以通过以下命令查看Conda管理器中的所有环境 和 当前虚拟环境中安装的python包
conda info --envs
conda list
进入到对应的虚拟环境,从Github中克隆整个项目
git clone https://github.com/llvm/llvm-project.git
下载完后进入项目工程文件夹
根据官网的Python-Binding的安装指南首现应该安装在此目录文件下的所有python依赖mlir/python/requirements.txt
保持一致性和避免潜在混淆最好用以下的命令来升级pip版本
如果直接使用pip install --upgrade pip
(又是一段心酸的血泪史)那么会导致不同Python环境和不同pip版本之间的冲突
python -m pip install --upgrade pip
逐个安装所需的Python包及其指定版本,确保在不同开发环境中使用相同的包版本
python -m pip install -r mlir/python/requirements.txt
在构建文件中输入以下命令
cmake -G Ninja -DLLVM_ENABLE_PROJECTS="mlir" -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_ENABLE_BINDINGS=ON -DMLIR_ENABLE_BINDINGS_PYTHON=ON -DCMAKE_BUILD_TYPE=Release ../llvm
命令行选项:
-D =:设置CMake变量。例如:-DCMAKE_BUILD_TYPE=Release。这将CMAKE_BUILD_TYPE变量设置为Release。变量名称和值是根据具体项目确定的
出现了一个错误
-G 是一个 CMake 命令行选项,它用于指定要哪种类型的构建文件 例如,-G Ninja 表示要生成提供给 Ninja 构建工具使用的构建文件,而 -G “Unix Makefiles” 表示生成供 Unix 系统中的 Make 工具使用的 Makefile。
在构建项目时,自动检测到错误的 Python 解释器,检查到我了默认启动的python解释器,而并非虚拟环境中的Python解释器,因此用 -DPython3_EXECUTABLE 参数来指定 Python 解释器的路径 重修修改命令
cmake -G Ninja -DLLVM_ENABLE_PROJECTS="mlir" -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_ENABLE_BINDINGS=ON -DPython3_EXECUTABLE=$(which python) -DCMAKE_BUILD_TYPE=Release ../llvm
执行这个命令后,CMake 会在当前目录中生成构建文件,运行ninja命令来编译和链接整个项目
ninja
需要处理4098个文件
通过 ninja check-mlir-python
命令来测试 python-binding 在上述步骤中安装的正确性
运行完与Python-binding 相关的测试后,得到结果如下:
最后 依次进入以下路径会得到找到一个用于Python的MLIR核心库
在这个路径下输入python
然后再次键入import mlir
如果没有任何报错,恭喜你安装成功~
每次在终端运行时,现把MLIR核心库所在的路径配置为当前的PythonPath
export PYTHONPATH=your_path/tools/mlir/python_packages/mlir_core
不推荐直接在zshcr文件中把mlir的存储路径设置为全局变量,因为方法二讲引入另一个MLIR 库
pyMLIR是一个完整的Python接口,用于根据MLIR文档中描述的语法解析、处理和输出MLIR文件。
只需要在终端键入python -m pip install pymlir
即可一键下载
但是MLIR库的底层文件大不相同,第一张图片是pyMLIR的包内容文件条目展示 第二张是手动编译的MLIR的包内容文件图标展示
对于两者的区别,人类智慧之光给出的答案是:
这是因为pymlir和MLIR的官方Python绑定(也称为python-binding)是两个不同的库,它们分别为Python提供了不同级别的接口和功能。
pymlir是由第三方开发的库,旨在简化在Python中与MLIR进行交互的过程。它提供了一种高级的、面向Python程序员的接口,使得编写和处理MLIR代码变得更加容易。pymlir库主要关注在Python中以简单、直观的方式处理MLIR,封装了MLIR的底层细节。
与之相反,官方的MLIR项目(即LLVM项目中的MLIR组件)提供了Python绑定,这些绑定更接近于底层API,它们是通过C++实现的MLIR功能的包装。这些Python绑定允许Python开发人员访问MLIR底层功能,但可能需要更深入的了解MLIR的实现和原理。
简言之,pymlir和MLIR的官方Python绑定分别为Python提供了不同级别的接口和功能,你可以根据你的需求和编程背景选择使用哪个库。如果你希望用更简单、直观的方式在Python中处理MLIR,那么pymlir可能是一个更好的选择。然而,如果你需要更底层的控制和对MLIR实现的深入了解,那么使用官方的Python绑定可能更适合。
最后感谢您的耐心阅读,浏览完了整个安装文档,如果在本文中出现了不恰当、不合适的表述,请在评论区中留言,您的反馈是我持续创作的最大动力~