前言
這段時間一直在學習如何使用 Triton,期間也是一直在嘗試構建 Triton Inference Server。這構建的過程感覺特別的痛苦,一方面是網絡問題導致的構建速度慢、構建失敗的問題,另一方面是 Triton 提供的構建腳本在我這兒並不有效,需要自己想一個辦法。
按照官方的文檔,我們有兩種構建的方式。一種是在 Docker 內構建,另一種是在裸機上構建。
回想起來,這段時間構建的過程似乎沒有做什么事情,就是在重復網絡中斷、構建失敗、重試的這樣一個過程。所以是痛苦的,因為時間是最寶貴的東西。
我嘗試了如下四種方法來構建。
- 官方推薦的 docker 內構建,使用 build.py 構建;失敗,因為 apt 安裝依賴失敗了(hash mismatch
- 裸機構建;(忘了有沒有嘗試,需要的依賴 TensorRT 都沒有裝,應該不行
- 進入 docker 中,手動安裝依賴,然后假裝裸機構建。(成功,只運行命令,可以;指定了模型倉庫,core dump
- 將 build.py 執行的 CMake 命令導出來,裸機構建(試了,還沒成功
上面的第三個方法是可行的,因為 core dump 的原因是我沒有注意看 Triton 的默認配置導致的,我需要去做好配置才可以不會 core dump。其實除了第一個方法,其他幾個方法應該都可以。
下面將會展開為構建和調試兩個部分。
構建
構建的命令如下,按照下面的命令逐個執行就可以了。基本上就是下載代碼、拉鏡像、進入鏡像、安裝依賴、設置代理、調用腳本開始構建。
如果你需要在 docker 內構建 backend,那么你還要在 docker 里面安裝一個 docker 🤣(即使你指定了 no-container-build 選項,這個構建腳本構建 backend 的時候還是要下載 docker。理由很簡單,因為 pytorch 的依賴,當前的 docker 里沒有。
git clone https://github.com/triton-inference-server/server
git checkout r21.10
docker pull nvcr.io/nvidia/tritonserver:21.10-py3
docker run --gpus=all --network=host --shm-size=2g -v/home/percent1/triton-build:/code -it nvcr.io/nvidia/tritonserver:21.10-py3 # 進入 docker
pip install docker
apt update
apt install libssl-dev libonig-dev zlib1g-dev libboost-all-dev libre2-dev libb64-dev rapidjson-dev -y
wget -O cmake.tar.gz https://github.com/Kitware/CMake/releases/download/v3.21.4/cmake-3.21.4-linux-x86_64.tar.gz
tar -zxvf cmake.tar.gz
export PATH=/code/cmake-3.21.4-linux-x86_64/bin/:$PATH
export http_proxy=socks5://172.17.0.1:1080
export https_proxy=socks5://172.17.0.1:1080
git config --global https.proxy http://172.17.0.1:1080
git config --global https.proxy https://172.17.0.1:1080
./build.py --cmake-dir=/code/server/build --build-dir=/tmp/citritonbuild --enable-logging --enable-stats --enable-tracing --enable-metrics --enable-gpu-metrics --enable-gpu --endpoint=http --endpoint=grpc --repo-tag=common:r21.10 --repo-tag=core:r21.10 --repo-tag=backend:r21.10 --repo-tag=thirdparty:r21.10 --backend=ensemble --no-container-build --build-type=Debug
core dump 的原因
運行 tritonserver 的結果:
# /tmp/citritonbuild/opt/tritonserver/bin/tritonserver --model-repository=/tmp/models
I1110 05:29:40.618876 19418 metrics.cc:298] Collecting metrics for GPU 0: GeForce RTX 2080 Ti
I1110 05:29:40.619735 19418 metrics.cc:298] Collecting metrics for GPU 1: GeForce RTX 2080 Ti
I1110 05:29:40.619904 19418 metrics.cc:298] Collecting metrics for GPU 2: GeForce RTX 2080 Ti
I1110 05:29:40.620003 19418 metrics.cc:298] Collecting metrics for GPU 3: GeForce RTX 2080 Ti
I1110 05:29:40.913877 19418 libtorch.cc:1092] TRITONBACKEND_Initialize: pytorch
I1110 05:29:40.913931 19418 libtorch.cc:1102] Triton TRITONBACKEND API version: 1.6
I1110 05:29:40.913945 19418 libtorch.cc:1108] 'pytorch' TRITONBACKEND API version: 1.6
Segmentation fault (core dumped)
仔細思考,就會發覺奇怪,為什么啟動的時候會用到 libtorch 的東西呢,我明明沒有指定 torch 相關的模型,也沒有指定相關的 backend。當時沒有發現問題的來源,后來是在看啟動選項的時候發現的,原來是 --backend-directory 選項的問題:
--backend-directory <string>
The global directory searched for backend shared libraries.
Default is '/opt/tritonserver/backends'.
--repoagent-directory <string>
The global directory searched for repository agent shared
libraries. Default is '/opt/tritonserver/repoagents'.
因為我沒有指定 backends 的目錄,所以會用 docker 自帶的 backends。這其實也暴露了 Triton 的一個問題,backend 並非完全獨立於 tritonserver 的,不然用了 torch backend 就啟動不了呢?backend 的設計應該是完全解耦於 tritonserver 的,不過可能是因為為了擴展一些功能,所以才會在 tritonserver 中加入了相關的代碼。
調試
安裝 ssh,用 root 用戶登錄到 docker 里面。
apt install ssh
vim /etc/ssh/sshd_config # 修改 port,允許 root 登錄
/etc/init.d/ssh restart
passwd # 修改密碼,用於登錄
ps -e | grep ssh # 有輸出則啟動成功
apt install gdb
之后用 vscode 打開項目,安裝 C++ 插件,然后按 F5,添加 launch.json。我的內容如下所示,之后就可以使用 gdb 進行調試啦。我們需要在 args 里面指定啟動參數,指定 backend 目錄,指定模型倉庫。
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 啟動",
"type": "cppdbg",
"request": "launch",
"program": "/tmp/citritonbuild/tritonserver/install/bin/tritonserver",
"args": [
"--backend-directory",
"/opt/tritonserver/backends1/",
"--model-store",
"/code/models/"
],
"stopAtEntry": true,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
好耶!可以開心的調試了。不過仍然沒有代碼提示,即使在 CMake 構建的選項中加了 compile commands 那個選項也沒用... 這個后續在看看。