Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding

Tutorial - 如何在MacOS 上安装Mlir以及MLIR Python Binding

前言

在习惯了在 IDE 中利用成熟的编译工具链运行代码和享受舒适的代码编写环境之后,我逐渐依赖于具有 GUI 界面的软件工具,而忽视了使用命令行直接操作程序的重要性。因此,在这次搭建环境的过程中,我深刻地感受到了自己对 Unix 指令的不熟悉。本文的主要目的是展示如何从源代码开始构建、手动编译整个过程的步骤,并记录我不断踩坑的经历以及如何克服这些困难。我通过博客的形式记录并发布在互联网上,希望能帮助解决您在 macOS 安装 MLIR Python-Binding时遇到的问,并提供实用的经验。

【环境】MacBook Pro M2 系列芯片

方法一: 从源代码手动构建MLIR Python-Binding

一、前期准备

对于Intel 系列 X86 架构的Macbook 用户,直接掉过本小节中的 1.1

1.1 在搭载ARM结构的M2 芯片上配置X86_64环境

MLIR中的Python-binding提供的底层文件是基于X86架构的。这是我踩的第一个坑,自作主张地用Cmake 修改了xz,lz4的动态链接库(.dylib)的支持的硬件架构,导致最终没有通过ninja的python的测试

首先打卡命令行 配置Rosetta2 的模拟环境 :

softwareupdate --install-rosetta

Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding_第1张图片
1.安装miniforge,在主页面上下载x86_64版本 或者 mambaforge的x86_64版本
在这里插入图片描述
2.在安装Miniforge之前,确保当前的终端会话已经通过Rosetta 2启动。您可以使用arch -x86_64来启动一个新的终端会话,模拟由Rosetta创建的x86_64环境如下所示

arch -x86_64 zsh 
  1. 切换到下载路径,安装Miniforge/mambaforge:
    (bash 命令可以解释执行.sh的安装脚本)
bash 安装包名字.sh

以上步骤实现在arm架构的芯片上创建一个x86的虚拟环境

1.2 安装基本的构建环境

默认系统上已经有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

1.3 搭建虚拟环境

运行不用的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

二、安装MLIR Python-Binding

进入到对应的虚拟环境,从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

Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding_第2张图片
创建并进入到构建文档,开始手动配置项目

在构建文件中输入以下命令

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。

Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding_第3张图片在构建项目时,自动检测到错误的 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 库

方法二:Easy模式一键导入MLIR

pyMLIR是一个完整的Python接口,用于根据MLIR文档中描述的语法解析、处理和输出MLIR文件。
只需要在终端键入python -m pip install pymlir 即可一键下载

但是MLIR库的底层文件大不相同,第一张图片是pyMLIR的包内容文件条目展示 第二张是手动编译的MLIR的包内容文件图标展示

Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding_第4张图片
Tutorial - 如何在MacOS 上安装MLIR以及MLIR Python Binding_第5张图片
对于两者的区别,人类智慧之光给出的答案是:
这是因为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绑定可能更适合。

最后感谢您的耐心阅读,浏览完了整个安装文档,如果在本文中出现了不恰当、不合适的表述,请在评论区中留言,您的反馈是我持续创作的最大动力~

你可能感兴趣的:(MLIR,macos,python,编辑器)