安装
Numba/llvmlite 技术栈包含以下主要组件:
Numba 是编译器包,它依赖于 llvmlite。
llvmlite 是 LLVM API 的轻量级绑定包,它依赖于 LLVM。
LLVM 是用于从各种输入生成可执行代码的即时 (JIT) 编译器框架。
所有组件都必须经过编译才能使用。而且,由于技术栈中的每个组件都依赖于前一个组件,因此您需要编译 LLVM 才能编译 llvmlite,进而才能编译 Numba。LLVM 包的体积很大,根据平台的不同,编译可能需要大量时间(大约一小时)和技能。
预构建二进制文件
如上所述,为 llvmlite 构建 LLVM 具有挑战性。强烈建议安装已构建和测试过的二进制包。
官方 Conda 包可在 Anaconda 发行版中获取
conda install llvmlite
开发版本从 Git 主分支构建并上传到 Numba 在 Anaconda Cloud 上的开发频道
conda install -c numba/label/dev llvmlite
也可从 PyPI 安装二进制 wheel 包
pip install llvmlite
不提供二进制 wheel 包的开发版本。
与预期相反,Numba 维护者构建的 llvmlite 包并不使用系统上和/或 Conda 环境中可能存在的任何 LLVM 共享库。llvmlite 所需的 LLVM 部分在构建时静态链接。因此,从 Numba 频道安装 llvmlite 二进制包不需要最终用户同时安装 LLVM。(有关此原因的更多详细信息,请参阅:为什么要静态链接到 LLVM?)。但请注意,由其他方(例如 conda-forge)编译的 llvmlite 包可能会将其拆分为 llvmlite
和 llvm
包,并进行动态链接。
Conda 包:
Numba 维护者将以下内容发布到 Numba 频道:
Numba 包
llvmlite 包
llvmdev 包(包含 LLVM 的构建)
llvmlite 包在运行时不需要 llvmdev 包,因为 llvmlite 的动态库在编译时通过对 llvmdev
包的依赖而静态链接到 LLVM(如上所述)。
Anaconda 发行版和 conda-forge 频道发布:
Numba 包
llvmlite 包
LLVM 被拆分为运行时库(包名为
llvm
)和编译时库/头文件等,其中包含一个 LLVM 构建(包名为llvmdev
)
在编译时,llvmdev
和 llvm
包用于构建 llvmlite,并且 llvmlite 的动态库会动态链接到 llvm
元包中的库。这意味着在运行时,llvmlite
依赖于包含 LLVM 共享库的 llvm
包(实际上是一个名为 libllvm
的包包含 DSO,但提及 llvm
包是为了获取 run_exports
)。
使用 pip
Numba 维护者提供二进制 wheel 包:
Numba wheel 包(
x86*
架构)llvmlite wheel 包(
x86*
架构)
请注意,与 Numba 频道上的 conda 包一样,llvmlite 的 wheel 包也是静态链接到 LLVM 的。这减轻了对基于 LLVM 的二进制 wheel 包的需求。另请注意,截至 0.36 版本,这不包括 aarch64
架构,例如不支持在树莓派上安装。
Numba 维护者为以下内容提供 sdist
(源码分发包):
Numba
llvmlite
请注意,没有为 LLVM 提供 sdist
。如果您尝试从 sdist
构建 llvmlite
,您将需要使用自己适当的 LLVM 来引导该包。
这最终如何成为问题。
如果您在不受支持的架构(即非
x86*
)或不受支持的 Python 版本(例如 Python alpha 版本)上使用二进制 wheel 包,那么pip
将尝试从sdist
构建 Numba,进而尝试从sdist
构建llvmlite
。这将不可避免地失败,因为llvmlite
源代码分发包需要适当的 LLVM 安装才能构建。如果您正在使用
pip < 19.0
,那么manylinux2010
wheel 包将无法安装,您最终会遇到第 1 点所述的情况,即不支持,因此需要从sdist
构建。
历史上,此问题表现为以下错误消息,在此原样引用以供将来参考:
FileNotFoundError: [Errno 2] No such file or directory: 'llvm-config'
“修复”它的方法…
如果您正在使用
pip < 19.0
并且在x86*
架构上,如果可以的话,请更新它,这将使您能够使用manylinux2010
二进制 wheel 包。如果您在不受支持的架构上,例如树莓派,如果可用,请使用
conda
。否则:您可能需要从源代码构建,这意味着需要提供一个 LLVM。如果您有可用的 conda,则可以使用它通过一个可用的
llvm
/llvmdev
包来引导安装。有关从源代码编译的更多信息,请参阅下面的“手动构建”部分,并特别注意使用LLVM_CONFIG
环境变量来指定您的 LLVM 安装位置。
使用系统提供的 LLVM 包时需要注意什么。
使用系统提供的 LLVM 包时,可能会出现一些问题:
LLVM 包可能根本无法与 Numba/llvmlite 协同工作。
如果它在某种程度上确实有效,那么它不太可能包含使 Numba/llvmlite 完全正确运行所需的正确补丁。
由于 Numba/llvmlite 的维护者可能不知道该包是如何编译的,因此当出现问题时可能更难获得帮助。
手动构建
构建 llvmlite 需要首先构建 LLVM。不要使用来自您的操作系统发行版或 LLVM 网站的预构建 LLVM 二进制文件!版本或构建选项可能不匹配,并且 LLVM 将缺少对 llvmlite 运行至关重要的某些补丁。
先决条件
在构建之前,您必须具备以下条件:
编译 LLVM
如果您可以在 conda 环境中构建 llvmlite,则可以安装预构建的 LLVM 二进制包并跳过此步骤。
conda install -c numba llvmdev
LLVM 构建过程完全由 conda-build 脚本化,而 llvmdev recipe 是为 llvmlite 构建 LLVM 的规范参考。请尽可能使用它!
以下手动说明描述了主要步骤,但有关详细信息请参阅 recipe:
下载 LLVM 源代码。您可以下载完整的“项目”包,或单独下载 llvm、ldd 和 libunwind。
下载或通过 git checkout 获取 llvmlite 源代码。
解压缩 LLVM tar 文件,并从
llvmlite/conda-recipes/
目录应用相应的补丁。您可以使用 Linux 命令patch -p1 -i {patch-file}
应用每个补丁。补丁文件以其干净适用的 LLVM 版本作为前缀。对于 Linux/macOS
export PREFIX=desired_install_location CPU_COUNT=N
(N
是并行编译任务的数量)在 LLVM 源代码目录中,运行 llvmdev conda recipe 中的 build.sh 脚本。
对于 Windows
set PREFIX=desired_install_location
在 LLVM 源代码目录中,运行 llvmdev conda recipe 中的 bld.bat 脚本。
编译 llvmlite
要构建 llvmlite 的 C 封装器(其中嵌入了所需 LLVM 子集的静态链接副本),请在 llvmlite 源代码目录中运行以下命令:
python setup.py build
如果您的 LLVM 安装在非标准位置,请将
LLVM_CONFIG
环境变量设置为相应llvm-config
或llvm-config.exe
可执行文件的位置。此变量必须在 llvmlite 安装过程中持续有效——例如,在 Python 环境中。示例:如果 LLVM 安装在
/opt/llvm/
,且llvm-config
二进制文件位于/opt/llvm/bin/llvm-config
,则设置LLVM_CONFIG=/opt/llvm/bin/llvm-config
。如果您希望针对不受支持的 LLVM 版本进行构建,请将环境变量
LLVMLITE_SKIP_LLVM_VERSION_CHECK
设置为非零值。请注意,这对于测试新版本的 llvmlite 等很有用,但以这种方式构建的 llvmlite 支持有限/llvmlite 完全可能无法按预期工作。另请参阅:为什么 llvmlite 不总是支持最新版本的 LLVM。
安装
要验证您的构建,请通过运行以下命令来运行测试套件:
python runtests.py
或
python -m llvmlite.tests
如果验证成功,请通过运行以下命令进行安装:
python setup.py install
从 sdist 安装
如果您不想对 llvmlite 本身进行任何修改,也可以使用 pip
从最新发布的 sdist 包编译并安装 llvmlite。如果您的 llvm-config
不在 PATH
中,您仍然需要指向它:
LLVM_CONFIG=/path/to/llvm-config pip3 install llvmlite
这应该适用于运行 Python 和 llvm 的任何平台。经观察,它可以在 arm
、ppc64le
以及 arm
上的 pypy3
上运行。
x86 用户需要传递一个额外标志(参见 issue #522):
LLVM_CONFIG=/path/to/llvm-config CXXFLAGS=-fPIC pip3 install llvmlite
已知此方法适用于 Linux x64
上的 pypy3
。
也可以强制 pip
在本地使用自定义版本的 llvm
重新构建 llvmlite
:
LLVM_CONFIG=/path/to/custom/llvm-config CXXFLAGS=-fPIC pip3 install --no-binary :all: llvmlite