从源码安装

本页提供从源代码构建和安装TVM软件包的指导说明。

步骤1. 安装依赖项

Apache TVM 需要以下依赖项:

  • CMake (>= 3.24.0)

  • LLVM (推荐版本 >= 15)

  • Git

  • A recent C++ compiler supporting C++ 17, at the minimum
    • GCC 7.1

    • Clang 5.0

    • Apple Clang 9.3

    • Visual Studio 2019 (v16.7)

  • Python (>= 3.8)

  • (可选) Conda (强烈推荐)

管理依赖项最简单的方式是通过conda,它维护了一套跨平台的工具链,包括LLVM。要创建这些构建依赖项的环境,只需使用:

# make sure to start with a fresh environment
conda env remove -n tvm-build-venv
# create the conda environment with build dependency
conda create -n tvm-build-venv -c conda-forge \
    "llvmdev>=15" \
    "cmake>=3.24" \
    git \
    python=3.11
# enter the build environment
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
# Specify the build configuration via CMake options
cp ../cmake/config.cmake .

我们希望通过将这些标志附加到配置文件末尾来专门调整以下标志:

# controls default compilation flags (Candidates: Release, Debug, RelWithDebInfo)
echo "set(CMAKE_BUILD_TYPE RelWithDebInfo)" >> config.cmake

# LLVM is a must dependency for compiler end
echo "set(USE_LLVM \"llvm-config --ignore-libllvm --link-static\")" >> config.cmake
echo "set(HIDE_PRIVATE_SYMBOLS ON)" >> config.cmake

# GPU SDKs, turn on if needed
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 support, turn on if needed
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/目录下生成libtvmlibtvm_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 # make sure python is installed
export TVM_LIBRARY_PATH=/path-to-tvm/build
pip install -e /path-to-tvm/python

步骤4. 验证安装

使用具有多语言绑定的编译器基础设施可能会容易出错。因此,强烈建议在使用前验证Apache TVM的安装。

步骤1. 定位TVM Python包。 以下命令可以帮助确认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()))"
... # Omitted less relevant options
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跟踪器

pip3 install tornado
  • 如果你想使用自动调优模块

pip3 install tornado psutil 'xgboost>=1.1.0' cloudpickle

高级构建配置

Ccache

在支持的平台上,使用Ccache编译器包装器可能有助于减少TVM的构建时间,特别是在使用cutlassflashinfer进行构建时。 有几种方法可以在TVM构建中启用CCache:

  • build/config.cmake中保留USE_CCACHE=AUTO。如果找到CCache,将会使用它。

  • Ccache的伪装模式。这通常在Ccache安装过程中启用。要让TVM在伪装模式下使用Ccache,只需在配置TVM构建系统时指定适当的C/C++编译器路径。例如: cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...

  • 将ccache作为CMake的C++编译器前缀。在配置TVM的构建系统时,将CMake变量CMAKE_CXX_COMPILER_LAUNCHER设置为适当的值。例如:cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ...

在Windows上构建

TVM支持通过MSVC使用cmake进行构建。您需要获取Visual Studio编译器。 最低要求的VS版本是Visual Studio Enterprise 2019(注意:我们基于GitHub Actions的Windows 2019 Runner进行测试,详情请参阅该页面。 建议按照步骤1. 安装依赖项获取必要依赖并激活tvm-build环境。之后可以运行以下命令进行构建

mkdir build
cd build
cmake ..
cd ..

上述命令会在构建目录下生成解决方案文件。然后您可以运行以下命令进行构建

cmake --build build --config Release -- /m

构建 ROCm 支持

目前,ROCm仅在Linux系统上受支持,因此所有说明都是基于Linux环境编写的。

  • 设置 set(USE_ROCM ON),并将ROCM_PATH设置为正确的路径。

  • 您需要首先从ROCm安装HIP运行时。确保安装系统已安装ROCm。

  • 安装最新稳定版本的LLVM (v6.0.1)和LLD,确保命令行可以使用ld.lld

启用C++测试

我们使用Google Test来驱动TVM中的C++测试。安装GTest最简单的方式是从源码编译。

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进行构建。