在公眾號(hào)|計(jì)算機(jī)視覺工坊,后臺(tái)回復(fù) 「資料」,即可下載 計(jì)算機(jī)視覺干貨資料,涉及相機(jī)標(biāo)定、三維重建、立體視覺、SLAM、深度學(xué)習(xí)、點(diǎn)云后處理、姿態(tài)估計(jì)、多視圖幾何、多傳感器融合等方向。
內(nèi)容一覽:TVM 共有三種安裝方法:從源碼安裝、使用 Docker 鏡像安裝和 NNPACK Contrib 安裝。本文重點(diǎn)介紹如何通過源碼安裝 TVM。 關(guān)鍵詞:TVM 快速上手 源碼安裝
在之前的文章《TVM 中文站正式上線!最全機(jī)器學(xué)習(xí)模型部署「參考書」它來了》中,我們整體介紹了 TVM 的重要作用,以及如何借助 TVM 中文文檔,開啟機(jī)器學(xué)習(xí)編譯器的探索之路。
接下來,我們將以系列教程的形式,詳細(xì)講解 TVM 從入門到精通的學(xué)習(xí)路徑,希望每位開發(fā)者都能成為優(yōu)秀的機(jī)器學(xué)習(xí)編譯工程師!
本篇文章中,我們將介紹「打地基」的關(guān)鍵步驟--安裝 TVM。
TVM 的安裝可通過 3 種途徑實(shí)現(xiàn):
1. 從源碼安裝
2. Docker 鏡像
3. NNPACK Contrib 安裝
作為安裝 TVM 教程的 (Part 1),本文將詳細(xì)講解從源碼安裝的最佳實(shí)踐,并進(jìn)行最大限度地靈活配置和編譯。
在各種系統(tǒng)中從 0 到 1 構(gòu)建和安裝 TVM 軟件包包括兩個(gè)步驟:
1. 從 C++ 代碼中構(gòu)建共享庫
2.為編程語言包進(jìn)行設(shè)置(如 Python 包)
下載 TVM 源代碼,請(qǐng)?jiān)L問:
https://tvm.apache.org/download
從 GitHub 上克隆源碼倉庫,請(qǐng)使用 --recursive 選項(xiàng)來克隆子模塊。
git clone --recursive https://github.com/apache/tvm tvm
Windows 用戶可以打開 Git shell,并輸入以下命令:
git submodule init
git submodule update
我們的目標(biāo)是構(gòu)建共享庫:
目標(biāo)庫是 libtvm.so 和 libtvm_runtime.so
目標(biāo)庫是 libtvm.dylib 和 libtvm_runtime.dylib
目標(biāo)庫是 libtvm.dll 和 libtvm_runtime.dll
也可以只構(gòu)建運(yùn)行時(shí)庫:
https://tvm.hyper.ai/docs/how_to/deploy/
TVM 庫的最低構(gòu)建要求是:
* 支持 C++17 的最新 C++ 編譯器
* CMake 3.10 或更高版本
* 推薦使用 LLVM 構(gòu)建 TVM 庫以啟用所有功能。
* 如需使用 CUDA,請(qǐng)確保 CUDA 工具包的版本至少在 8.0 以上。
注意:CUDA 舊版本升級(jí)后,請(qǐng)刪除舊版本并重新啟動(dòng)。
* macOS 可安裝 Homebrew 以方便安裝和管理依賴。
* Python:推薦使用 3.7.X+ 和 3.8.X+ 版本,3.9.X+ 暫時(shí)不支持。
在 Ubuntu/Debian 等 Linux 操作系統(tǒng)上,要安裝這些依賴環(huán)境,請(qǐng)?jiān)诮K端執(zhí)行:
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
TVM 的配置可以通過編輯 config.cmake 和/或在命令行傳遞 cmake flags 來修改:
mkdir build
cp cmake/config.cmake build
- 對(duì)于 macOS 某些版本的 Xcode,需要在 LDFLAGS 中添加 -lc++abi,以免出現(xiàn)鏈接錯(cuò)誤
- 將 set(USE_CUDA OFF) 改為 set(USE_CUDA ON) 以啟用 CUDA 后端。對(duì)其他你想構(gòu)建的后端和庫(OpenCL,RCOM,METAL,VULKAN......)做同樣的處理。
- 為了便于調(diào)試,請(qǐng)確保使用 set(USE_GRAPH_EXECUTOR ON) 和 set(USE_PROFILER ON) 啟用嵌入式圖形執(zhí)行器 (embedded graph executor) 和調(diào)試功能。
- 如需用 IR 調(diào)試,可以設(shè)置 set(USE_RELAY_DEBUG ON),同時(shí)設(shè)置環(huán)境變量 TVM_LOG_DEBUG。
export TVM_LOG_DEBUG="ir/transform.cc=1;relay/ir/transform.cc=1"
- 使用 LLVM 構(gòu)建時(shí)需要 LLVM 4.0 或更高版本。注意,默認(rèn)的 apt 中的 LLVM 版本可能低于 4.0。
- 由于 LLVM 從源碼構(gòu)建需要很長時(shí)間,推薦從 LLVM 下載頁面 下載預(yù)構(gòu)建版本。
1. 解壓縮到某個(gè)特定位置,修改 build/config.cmake 以添加 set(USE_LLVM /path/to/your/llvm/bin/llvm-config)
2. 或直接設(shè)置 set(USE_LLVM ON),利用 CMake 搜索一個(gè)可用的 LLVM 版本。
- 也可以使用 LLVM Ubuntu 每日構(gòu)建
注意 apt-package 會(huì)在 llvm-config 中附加版本號(hào)。例如,如果你安裝了 LLVM 10 版本,則設(shè)置 set(USE_LLVM llvm-config-10)
- PyTorch 的用戶建議設(shè)置 set(USE_LLVM "/path/to/llvm-config --link-static") 和 set(HIDE_PRIVATE_SYMBOLS ON) 以避免 TVM 和 PyTorch 使用的不同版本的 LLVM 之間潛在的符號(hào)沖突。
- 某些支持平臺(tái)上,Ccache 編譯器 Wrapper 可幫助減少 TVM 的構(gòu)建時(shí)間。在 TVM 構(gòu)建中啟用 CCache 的方法包括:
1. Ccache 的 Masquerade 模式。通常在 Ccache 安裝過程中啟用。要讓 TVM 在 masquerade 中使用 Ccache,只需在配置 TVM 的構(gòu)建系統(tǒng)時(shí)指定適當(dāng)?shù)?C/C++ 編譯器路徑。例如:cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...
2. Ccache 作為 CMake 的 C++ 編譯器前綴。在配置 TVM 的構(gòu)建系統(tǒng)時(shí),將 CMake 變量 CMAKE_CXX_COMPILER_LAUNCHER 設(shè)置為一個(gè)合適的值。例如:cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ...
cd build
cmake ..
make -j4
- 可以使用 Ninja 來加速構(gòu)建
cd build
cmake .. -G Ninja
ninja
在 TVM 的根目錄下也有一個(gè) Makefile,它可以自動(dòng)完成其中的幾個(gè)步驟:創(chuàng)建構(gòu)建目錄,將默認(rèn)的 config.cmake 復(fù)制到該構(gòu)建目錄下,運(yùn)行 cmake,并運(yùn)行 make。
構(gòu)建目錄可以用環(huán)境變量 TVM_BUILD_PATH 來指定。如果 TVM_BUILD_PATH 沒有設(shè)置,Makefile 就會(huì)假定應(yīng)該使用 TVM 里面的 build 目錄。由 TVM_BUILD_PATH 指定的路徑可以是絕對(duì)路徑,也可以是相對(duì)于 TVM 根目錄的路徑。如果 TVM_BUILD_PATH 被設(shè)置為一個(gè)以空格分隔的路徑列表,則將創(chuàng)建所有列出的路徑。
如果使用另一個(gè)構(gòu)建目錄,那么應(yīng)該在運(yùn)行時(shí)設(shè)置環(huán)境變量 TVM_LIBRARY_PATH,它指向編譯后的 libtvm.so 和 libtvm_runtime.so 的位置。如果沒有設(shè)置,TVM 將尋找相對(duì)于 TVM Python 模塊的位置。與 TVM_BUILD_PATH 不同,這必須是一個(gè)絕對(duì)路徑。
# 在 "build" 目錄下構(gòu)建
make
# 替代位置,"build_debug"
TVM_BUILD_PATH=build_debug make
# 同時(shí)構(gòu)建 "build_release" 和 "build_debug"
TVM_BUILD_PATH="build_debug build_release" make
# 使用調(diào)試構(gòu)建
TVM_LIBRARY_PATH=~/tvm/build_debug python3
如果一切順利,我們就可以去查看 Python 包的安裝了。
Conda 可以用來獲取運(yùn)行 TVM 所需的必要依賴。如果沒有安裝 Conda,請(qǐng)參照 Conda 安裝指南來安裝 Miniconda 或 Anaconda。在 Conda 環(huán)境中運(yùn)行以下命令:
# 用 yaml 指定的依賴創(chuàng)建 Conda 環(huán)境
conda env create --file conda/build-environment.yaml
# 激活所創(chuàng)建的環(huán)境
conda activate tvm-build
上述命令將安裝所有必要的構(gòu)建依賴,如 CMake 和 LLVM。接下來可以運(yùn)行上一節(jié)中的標(biāo)準(zhǔn)構(gòu)建過程。
在 Conda 環(huán)境之外使用已編譯的二進(jìn)制文件,可將 LLVM 設(shè)置為靜態(tài)鏈接模式 set(USE_LLVM "llvm-config --link-static")。這樣一來,生成的庫就不會(huì)依賴于 Conda 環(huán)境中的動(dòng)態(tài) LLVM 庫。
以上內(nèi)容展示了如何使用 Conda 提供必要的依賴,從而構(gòu)建 libtvm。如果已經(jīng)使用 Conda 作為軟件包管理器,并且希望直接將 TVM 作為 Conda 軟件包來構(gòu)建和安裝,可以按照以下指導(dǎo)進(jìn)行:
conda build --output-folder=conda/pkg conda/recipe
# 在啟用 CUDA 的情況下運(yùn)行 conda/build_cuda.sh 來構(gòu)建
conda install tvm -c ./conda/pkg
TVM 支持通過 MSVC 使用 CMake 構(gòu)建。需要有一個(gè) Visual Studio 編譯器。VS 的最低版本為 Visual Studio Enterprise 2019
注意:查看針對(duì) GitHub Actions 的完整測試細(xì)節(jié),請(qǐng)?jiān)L問 Windows 2019 Runner,官方推薦使用 Conda 環(huán)境進(jìn)行構(gòu)建,以獲取必要的依賴及激活的 tvm-build 環(huán)境。
運(yùn)行以下命令行:
mkdir build
cd build
cmake -A x64 -Thost=x64 ..
cd ..
上述命令在構(gòu)建目錄下生成了解決方案文件。接著運(yùn)行:
cmake --build build --config Release -- /m
目前,ROCm 只在 Linux 上支持,因此所有教程均以 Linux 為基礎(chǔ)編寫的。
- 設(shè)置 set(USE_ROCM ON),將 ROCM_PATH 設(shè)置為正確的路徑。
- 需要先從 ROCm 中安裝 HIP runtime。確保安裝系統(tǒng)中已經(jīng)安裝了 ROCm。
- 安裝 LLVM 的最新穩(wěn)定版本(v6.0.1),以及 LLD,確保 ld.lld 可以通過命令行獲取。
本部分介紹利用 virtualenv 或 conda 等虛擬環(huán)境和軟件包管理器,來管理 Python 軟件包和依賴的方法。
Python 包位于 tvm/python。安裝方法有兩種:
本方法適用于有可能修改代碼的開發(fā)者。
設(shè)置環(huán)境變量 PYTHONPATH,告訴 Python 在哪里可以找到這個(gè)庫。例如,假設(shè)我們?cè)?/path/to/tvm 目錄下克隆了 tvm,我們可以在 ~/.bashrc 中添加以下代碼:這使得拉取代碼及重建項(xiàng)目時(shí),無需再次調(diào)用 setup,這些變化就會(huì)立即反映出來。
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
通過 setup.py 安裝 TVM 的 Python 綁定:
# 為當(dāng)前用戶安裝 TVM 軟件包
# 注意:如果你通過 homebrew 安裝了 Python,那么在安裝過程中就不需要 --user
# 它將被自動(dòng)安裝到你的用戶目錄下。
# 在這種情況下,提供 --user 標(biāo)志可能會(huì)在安裝時(shí)引發(fā)錯(cuò)誤。
export MACOSX_DEPLOYMENT_TARGET=10.9 # 這是 mac 所需要的,以避免與 libstdc++ 的符號(hào)沖突
cd python; python setup.py install --user; cd ..
注意,如果你想要安裝到一個(gè)受管理的本地環(huán)境,如 virtualenv,則不需要 --user 標(biāo)志。
pip3 install --user numpy decorator attrs
pip3 install --user tornado
pip3 install --user tornado psutil xgboost cloudpickle
注意:在搭載 M1 芯片的 Mac 上,安裝 xgboost / scipy 時(shí)可能遇到一些問題。scipy 和 xgboost 需要安裝 openblas 等額外依賴。運(yùn)行以下命令行,安裝 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
NNPACK Contrib 安裝
可以用 Google Test 來驅(qū)動(dòng) 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 來構(gòu)建和啟動(dòng) C++ 測試,或者直接用 make cpptest 構(gòu)建。
以上就是本期教程--安裝 TVM 的 Part 1 部分,在 Part 2 中,我們將繼續(xù)講解另外兩種 TVM 安裝方法:Docker 鏡像安裝以及 NNPACK Contrib 安裝。
歡迎大家持續(xù)關(guān)注 tvm.hyper.ai,了解 TVM 中文的最新進(jìn)展!
—— 完 ——