共计 5919 个字符,预计需要花费 15 分钟才能阅读完成。
内容一览:TVM 共有三种装置办法:从源码装置、应用 Docker 镜像装置和 NNPACK Contrib 装置。本文重点介绍如何通过源码装置 TVM。
关键词:TVM 疾速上手 源码装置
在之前的文章《TVM 中文站正式上线!最全机器学习模型部署「参考书」它来了》中,咱们整体介绍了 TVM 的重要作用,以及如何借助 TVM 中文文档,开启机器学习编译器的摸索之路。
接下来,咱们将以系列教程的模式, 具体解说 TVM 从入门到精通的学习门路,心愿每位开发者都能成为优良的机器学习编译工程师!
本篇文章中,咱们将介绍「打地基」的关键步骤 – 装置 TVM。
TVM 的装置可通过 3 种路径实现:
- 从源码装置
- Docker 镜像
- NNPACK Contrib 装置
作为装置 TVM 教程的 (Part 1),本文将具体解说从源码装置的最佳实际, 并进行最大限度地灵便配置和编译。
逐渐解说如何从源码装置 TVM
在各种零碎中从 0 到 1 构建和装置 TVM 软件包包含两个步骤:
- 从 C++ 代码中构建共享库
- Linux:libtvm.so
- macOS:libtvm.dylib
- Windows:libtvm.dll
2. 为编程语言包进行设置(如 Python 包)
下载 TVM 源代码,请拜访:https://tvm.apache.org/download
开发者:从 GitHub 获取源代码
从 GitHub 上克隆源码仓库,请应用 –recursive 选项来克隆子模块。
git clone --recursive https://github.com/apache/tvm tvm
Windows 用户能够关上 Git shell,并输出以下命令:
git submodule init
git submodule update
构建共享库
咱们的指标是构建共享库:
- 在 Linux 上
指标库是 libtvm.so 和 libtvm_runtime.so - 在 MacOS 上
指标库是 libtvm.dylib 和 libtvm_runtime.dylib - 在 Windows 上
指标库是 libtvm.dll 和 libtvm_runtime.dll
也能够只构建运行时库:
https://tvm.hyper.ai/docs/how_to/deploy/
TVM 库的最低构建要求是:
- 反对 C++17 的最新 C++ 编译器
GCC 7.1
Clang 5.0
Apple Clang 9.3
Visual Stuio 2019 (v16.7) - CMake 3.10 或更高版本
- 举荐应用 LLVM 构建 TVM 库以启用所有性能。
- 如需应用 CUDA,请确保 CUDA 工具包的版本至多在 8.0 以上。
留神:CUDA 旧版本升级后,请删除旧版本并重新启动。 - macOS 可装置 Homebrew 以不便装置和治理依赖。
- Python:举荐应用 3.7.X+ 和 3.8.X+ 版本,3.9.X+ 临时不反对。
在 Ubuntu/Debian 等 Linux 操作系统上,要装置这些依赖环境,请在终端执行:
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
用 Homebrew 为搭载 Intel 或 M1 芯片的 macOS 装置所需的依赖,需遵循 Homebrew 指定的装置步骤,以保障正确装置和配置这些依赖:
brew install gcc git cmake
brew install llvm
brew install python@3.8
应用 cmake 来构建库
TVM 的配置能够通过编辑 config.cmake 和 / 或在命令行传递 cmake flags 来批改:
- 如果没有装置 cmake,可拜访以下官网下载最新版本 https://cmake.org/download/
- 创立一个构建目录,将 cmake/config.cmake 复制到该目录
mkdir build
cp cmake/config.cmake build
-
编辑
build/config.cmake
自定义编译选项- 对于 macOS 某些版本的 Xcode,须要在 LDFLAGS 中增加
-lc++abi
,免得呈现链接谬误 - 将
set(USE_CUDA OFF)
改为set(USE_CUDA ON)
以启用 CUDA 后端。对其余你想构建的后端和库(OpenCL,RCOM,METAL,VULKAN……)做同样的解决。 - 为了便于调试,请确保应用
set(USE_GRAPH_EXECUTOR ON)
和set(USE_PROFILER ON)
启用嵌入式图形执行器 (embedded graph executor) 和调试性能。 - 如需用 IR 调试,能够设置
set(USE_RELAY_DEBUG ON)
,同时设置环境变量 TVM_LOG_DEBUG。
- 对于 macOS 某些版本的 Xcode,须要在 LDFLAGS 中增加
-
TVM 须要 LLVM 用于 CPU 代码生成工具 (Codegen)。举荐应用 LLVM 构建。
- 应用 LLVM 构建时须要 LLVM 4.0 或更高版本。留神,默认的 apt 中的 LLVM 版本可能低于 4.0。
-
因为 LLVM 从源码构建须要很长时间,举荐从 LLVM 下载页面 下载预构建版本。
- 解压缩到某个特定地位,批改
build/config.cmake
以增加set(USE_LLVM /path/to/your/llvm/bin/llvm-config)
- 或间接设置
set(USE_LLVM ON)
,利用 CMake 搜寻一个可用的 LLVM 版本。
- 解压缩到某个特定地位,批改
- 也能够应用 LLVM Ubuntu 每日构建
留神 apt-package 会在 llvm-config 中附加版本号。例如,如果你装置了 LLVM 10 版本,则设置 set(USE_LLVM llvm-config-10)
- PyTorch 的用户倡议设置
set(USE_LLVM "/path/to/llvm-config --link-static")
和set(HIDE_PRIVATE_SYMBOLS ON)
以防止 TVM 和 PyTorch 应用的不同版本的 LLVM 之间潜在的符号抵触。 -
某些反对平台上,Ccache 编译器 Wrapper 可帮忙缩小 TVM 的构建工夫。在 TVM 构建中启用 CCache 的办法包含:
- Ccache 的 Masquerade 模式。通常在 Ccache 装置过程中启用。要让 TVM 在 masquerade 中应用 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 ...
- Ccache 的 Masquerade 模式。通常在 Ccache 装置过程中启用。要让 TVM 在 masquerade 中应用 Ccache,只需在配置 TVM 的构建零碎时指定适当的 C/C++ 编译器门路。例如:
-
构建 TVM 及相干库:
cd build cmake .. make -j4
能够应用 Ninja 来减速构建
cd build
cmake .. -G Ninja
ninja
在 TVM 的根目录下也有一个 Makefile,它能够主动实现其中的几个步骤: 创立构建目录,将默认的 config.cmake
复制到该构建目录下,运行 cmake,并运行 make。
构建目录能够用环境变量 TVM_BUILD_PATH
来指定。如果 TVM_BUILD_PATH
没有设置,Makefile 就会假设应该应用 TVM 外面的 build 目录。由 TVM_BUILD_PATH
指定的门路能够是绝对路径,也能够是绝对于 TVM 根目录的门路。如果 TVM_BUILD_PATH
被设置为一个以空格分隔的门路列表,则将创立所有列出的门路。
如果应用另一个构建目录,那么应该在运行时设置环境变量 TVM_LIBRARY_PATH,它指向编译后的 libtvm.so
和 libtvm_runtime.so
的地位。如果没有设置,TVM 将寻找绝对于 TVM Python 模块的地位。与 TVM_BUILD_PATH
不同,这必须是一个绝对路径。
# 在 "build" 目录下构建
make
# 代替地位,"build_debug"
TVM_BUILD_PATH=build_debug make
# 同时构建 "build_release" 和 "build_debug"
TVM_BUILD_PATH="build_debug build_release" make
# 应用调试构建
TVM_LIBRARY_PATH=~/tvm/build_debug python3
如果一切顺利,咱们就能够去查看 Python 包的装置了。
应用 Conda 环境进行构建
Conda 能够用来获取运行 TVM 所需的必要依赖。 如果没有装置 Conda,请参照 Conda 装置指南 来装置 Miniconda 或 Anaconda。在 Conda 环境中运行以下命令:
# 用 yaml 指定的依赖创立 Conda 环境
conda env create --file conda/build-environment.yaml
# 激活所创立的环境
conda activate tvm-build
上述命令将装置所有必要的构建依赖,如 CMake 和 LLVM。 接下来能够运行上一节中的规范构建过程。
在 Conda 环境之外应用已编译的二进制文件,可将 LLVM 设置为动态链接模式 set(USE_LLVM "llvm-config --link-static")
。这样一来,生成的库就不会依赖于 Conda 环境中的动静 LLVM 库。
以上内容展现了如何应用 Conda 提供必要的依赖,从而构建 libtvm。如果曾经应用 Conda 作为软件包管理器,并且心愿间接将 TVM 作为 Conda 软件包来构建和装置,能够依照以下领导进行:
conda build --output-folder=conda/pkg conda/recipe
# 在启用 CUDA 的状况下运行 conda/build_cuda.sh 来构建
conda install tvm -c ./conda/pkg
在 Windows 上构建
TVM 反对通过 MSVC 应用 CMake 构建。 须要有一个 Visual Studio 编译器。VS 的最低版本为 Visual Studio Enterprise 2019
留神:查看针对 GitHub Actions 的残缺测试细节,请拜访 Windows 2019 Runner:
https://github.com/actions/vi…
官网举荐应用 Conda 环境进行构建,以获取必要的依赖及激活的 tvm-build 环境。
运行以下命令行:
mkdir build
cd build
cmake -A x64 -Thost=x64 ..
cd ..
上述命令在构建目录下生成了解决方案文件。接着运行:
cmake --build build --config Release -- /m
构建 ROCm 反对
目前,ROCm 只在 Linux 上反对,因而所有教程均以 Linux 为根底编写的。
- 设置 set(USE_ROCM ON),将 ROCM_PATH 设置为正确的门路。
- 须要先从 ROCm 中装置 HIP runtime。确保装置零碎中曾经装置了 ROCm。
- 装置 LLVM 的最新稳固版本(v6.0.1),以及 LLD,确保 ld.lld 能够通过命令行获取。
Python 包的装置
TVM 包
本局部介绍利用 virtualenv 或 conda 等虚拟环境和软件包管理器,来治理 Python 软件包和依赖的办法。
Python 包位于 tvm/python。装置办法有两种:
- 办法 1
本办法实用于有可能批改代码的开发者。
设置环境变量 PYTHONPATH,通知 Python 在哪里能够找到这个库。例如,假如咱们在 /path/to/tvm
目录下克隆了 tvm,咱们能够在 ~/.bashrc
中增加以下代码:这使得拉取代码及重建我的项目时,无需再次调用 setup,这些变动就会立刻反映进去。
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
- 办法 2
通过 setup.py 装置 TVM 的 Python 绑定:
# 为以后用户装置 TVM 软件包
# 留神:如果你通过 homebrew 装置了 Python,那么在装置过程中就不须要 --user
# 它将被主动装置到你的用户目录下。# 在这种状况下,提供 --user 标记可能会在装置时引发谬误。export MACOSX_DEPLOYMENT_TARGET=10.9 # 这是 mac 所须要的,以防止与 libstdc++ 的符号抵触
cd python; python setup.py install --user; cd ..
Python 依赖
留神,如果你想要装置到一个受治理的本地环境,如 virtualenv
,则不须要 --user
标记。
- 必要的依赖:
pip3 install --user numpy decorator attrs
- 应用 RPC 跟踪器
pip3 install --user tornado
- 应用 auto-tuning 模块
pip3 install --user tornado psutil xgboost cloudpickle
留神:在搭载 M1 芯片的 Mac 上,装置 xgboost / scipy
时可能遇到一些问题。scipy 和 xgboost 须要装置 openblas 等额定依赖。运行以下命令行,装置 scipy 和 xgboost 以及所需的依赖和配置:
brew install openblas gfortran
pip install pybind11 cython pythran
export OPENBLAS=/opt/homebrew/opt/openblas/lib/
pip install scipy --no-use-pep517
pip install xgboost
装置 Contrib 库
NNPACK Contrib 装置,查看
https://tvm.hyper.ai/docs/ins…
启用 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
装置胜利后,能够用 ./tests/scripts/task_cpp_unittest.sh
来构建和启动 C++ 测试,或者间接用 make cpptest
构建。
以上就是本期教程 – 装置 TVM 的 Part 1 局部,在 Part 2 中,咱们将持续解说另外两种 TVM 装置办法:Docker 镜像装置以及 NNPACK Contrib 装置。
欢送大家继续关注 tvm.hyper.ai,理解 TVM 中文的最佳停顿!
—— 完 ——