从源码安装
本文档介绍如何从源代码构建和安装 TVM 软件包。
目录
步骤 1:安装依赖项
Apache TVM 需要以下依赖项:
- CMake (>= 3.24.0)
- LLVM (建议 >= 15)
- Git
- 至少支持 C++ 17 标准的最新 C++ 编译器
- GCC 7.1
- Clang 5.0
- Apple Clang 9.3
- Visual Studio 2019 (v16.7)
- Python (>= 3.8)
- (可选) Conda (强烈推荐)
- CMake(>= 3.24.0)
- LLVM(推荐 >= 15)
- Git
- 支持 C++ 17 的现代 C++ 编译器(最低要求)
- GCC 7.1
- Clang 5.0
- Apple Clang 9.3
- Visual Studio 2019(v16.7)
- Python(>= 3.8)
- (可选)Conda(强烈推荐)
使用 Conda 是管理依赖项的最简单方式,它提供了跨平台的工具链(包括 LLVM)。要创建包含这些构建依赖项的环境,可以运行以下命令:
# 确保从一个干净的环境开始
conda env remove -n tvm-build-venv
# 创建包含构建依赖项的 Conda 环境
conda create -n tvm-build-venv -c conda-forge \
"llvmdev>=15" \
"cmake>=3.24" \
git \
python=3.11
# 进入构建环境
conda activate tvm-build-venv
步骤 2:从 GitHub 获取源码
你也可以选择从 GitHub 克隆源码仓库:
git clone --recursive https://github.com/apache/tvm tvm
克隆 TVM 仓库时,必须使用 --recursive
标志,这会自动克隆子模块。如果忘记使用此标志,可以在 TVM 仓库的根目录中运行以下命令手动克隆子模块:
git submodule update --init --recursive
步骤 3:配置与构建
创建一个构建目录并运行 CMake 进行配置。以下示例展示了如何构建:
cd tvm
rm -rf build && mkdir build && cd build
# 通过 CMake 选项指定构建配置
cp ../cmake/config.cmake .
可以通过在配置文件末尾追加以下标志来调整配置:
# 控制默认编译标志(可选值:Release、Debug、RelWithDebInfo)
echo "set(CMAKE_BUILD_TYPE RelWithDebInfo)" >> config.cmake
# LLVM 是编译器端的必需依赖项
echo "set(USE_LLVM \"llvm-config --ignore-libllvm --link-static\")" >> config.cmake
echo "set(HIDE_PRIVATE_SYMBOLS ON)" >> config.cmake
# GPU SDK,按需启用
echo "set(USE_CUDA OFF)" >> config.cmake
echo "set(USE_METAL OFF)" >> config.cmake
echo "set(USE_VULKAN OFF)" >> config.cmake
echo "set(USE_OPENCL OFF)" >> config.cmake
# 支持 cuBLAS、cuDNN、cutlass,按需启用
echo "set(USE_CUBLAS OFF)" >> config.cmake
echo "set(USE_CUDNN OFF)" >> config.cmake
echo "set(USE_CUTLASS OFF)" >> config.cmake
HIDE_PRIVATE_SYMBOLS
是一个配置选项,用于启用 -fvisibility=hidden
标志。该标志可以避免 TVM 与 PyTorch 之间的符号冲突(由于两者可能使用不同版本的 LLVM)。
CMAKE_BUILD_TYPE 控制默认编译标志:
Debug
设置为-O0 -g
RelWithDebInfo
设置为-O2 -g -DNDEBUG
(推荐)Release
设置为-O3 -DNDEBUG
编辑完 config.cmake
后,运行以下命令开始构建:
cmake .. && cmake --build . --parallel $(nproc)
nproc
可能在某些系统中不可用,请替换为你的系统核心数。
构建成功后,会在 build/
目录下生成 libtvm
和 libtvm_runtime
。
退出构建环境 tvm-build-venv
后,可以通过以下两种方式将构建结果安装到你的环境中:
- 通过环境变量安装:
export TVM_HOME=/path-to-tvm
export PYTHONPATH=$TVM_HOME/python:$PYTHONPATH
- 通过 pip 安装本地项目:
conda activate your-own-env
conda install python # 确保已安装 Python
export TVM_LIBRARY_PATH=/path-to-tvm/build
pip install -e /path-to-tvm/python
步骤 4:验证安装
由于 TVM 是一个支持多语言绑定的编译器基础设施,安装过程中容易出错。因此,强烈建议在使用前验证安装。
步骤 1:定位 TVM Python 包
以下命令可以确认 TVM 是否已正确安装为 Python 包,并显示其位置:
>>> python -c "import tvm; print(tvm.__file__)"
/some-path/lib/python3.11/site-packages/tvm/__init__.py
步骤 2:确认使用的 TVM 库
当维护多个 TVM 构建或安装时,需要确认 Python 包是否使用了正确的 libtvm
:
>>> python -c "import tvm; print(tvm._ffi.base._LIB)"
<CDLL '/some-path/lib/python3.11/site-packages/tvm/libtvm.dylib', handle 95ada510 at 0x1030e4e50>
步骤 3:检查 TVM 构建选项
如果下游应用出现问题,可能是由于错误的 TVM 提交或构建标志。以下命令可以帮助排查:
>>> python -c "import tvm; print('\n'.join(f'{k}: {v}' for k, v in tvm.support.libinfo().items()))"
... # 省略部分不相关选项
GIT_COMMIT_HASH: 4f6289590252a1cf45a4dc37bce55a25043b8338
HIDE_PRIVATE_SYMBOLS: ON
USE_LLVM: llvm-config --link-static
LLVM_VERSION: 15.0.7
USE_VULKAN: OFF
USE_CUDA: OFF
CUDA_VERSION: NOT-FOUND
USE_OPENCL: OFF
USE_METAL: ON
USE_ROCM: OFF
步骤4. 检查设备检测
可以通过以下命令了解 TVM 是否能够检测到您的设备
>>> python -c "import tvm; print(tvm.metal().exist)"
True # or False
>>> python -c "import tvm; print(tvm.cuda().exist)"
False # or True
>>> python -c "import tvm; print(tvm.vulkan().exist)"
False # or True
请注意,上述命令验证的是本地机器上实际设备的存在情况,供 TVM 运行时(而非编译器)正确执行。然而,TVM 编译器可以在不需要物理设备的情况下执行编译任务。只要具备必要的工具链(如 NVCC),TVM 就支持在没有实际设备的情况下进行交叉编译。
步骤 5. 额外 Python 依赖项
从源代码构建不会自动安装所有必要的 Python 依赖项。可以使用以下命令安装额外的 Python 依赖项:
- 必要依赖项:
pip3 install numpy
- 如需使用 RPC Tracker:
pip3 install tornado
- 如需使用自动调优模块:
pip3 install tornado psutil 'xgboost>=1.1.0' cloudpickle
高级构建配置
Ccache
在支持的平台上,Ccache 编译器包装器 可以显著减少 TVM 的构建时间(尤其是构建 cutlass 或 flashinfer 时)。启用 Ccache 的方式如下:
- Leave
USE_CCACHE=AUTO
inbuild/config.cmake
. CCache will be used if it is found. - 在
build/config.cmake
中保留USE_CCACHE=AUTO
。如果找到 Ccache,则会自动使用。 - 启用 Ccache 的 Masquerade 模式(通常在安装 Ccache 时配置)。只需在配置 TVM 构建时指定 C/C++ 编译器路径即可,例如:
cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...
。 - 将 Ccache 作为 CMake 的 C++ 编译器前缀。配置时设置
CMAKE_CXX_COMPILER_LAUNCHER
,例如:cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ...
。
在 Windows 上构建
TVM 支持通过 MSVC 和 CMake 在 Windows 上构建。你需要安装 Visual Studio 编译器(最低要求:Visual Studio Enterprise 2019)。我们测试了 GitHub Actions 的 Windows 2019 Runner 的配置,可访问该页面获取全部细节。
推荐按照 步骤 1:安装依赖项 获取依赖项并激活 tvm-build 环境后,运行以下命令构建:
mkdir build
cd build
cmake ..
cd ..
以上命令会在 build 目录下生成解决方案文件,接着运行以下命令完成构建:
cmake --build build --config Release -- /m
构建 ROCm 支持
目前,ROCm 仅支持 Linux 平台。以下是配置步骤:
- 设置
set(USE_ROCM ON)
,并将 ROCM_PATH 设置为正确的路径。 - 安装 ROCm 的 HIP 运行时,确保系统已正确安装 ROCm。
- 安装最新稳定版的 LLVM(如 v6.0.1)和 LLD,确保
ld.lld
可通过命令行调用。
启用 C++ 测试
TVM 使用 Google Test 驱动 C++ 测试,最简单的安装方式是从源码构建:
git clone https://github.com/google/googletest
cd googletest
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
安装 GTest 后,可以通过 ./tests/scripts/task_cpp_unittest.sh
运行 C++ 测试,或通过 make cpptest
仅构建测试。