Откройте новую яму! Готов начать беседу о тритоне.
Лао Пан использует тритон более двух лет и всегда хотел написать руководство для всех. Я, кстати, учился и учился сам, промедлив и промедлив, наконец-то получил возможность написать это, воспользовавшись возможностью изменить версию.
tritonкакNVIDIAоткрытый исходный кодКоммерческий классструктура обслуживания,Лично думаюОчень полезно и стабильно,Интерфейс API не сильно изменился.,Я перешёл с 20.06 2020 года на 22.06 2022 года.,Переключение между двумя основными версиями,Некоторые инженерные изменения, связанные с кодом, минимальны.,Вы можете повторно использовать его напрямую с небольшими изменениями.,Очень удобно.
Версия, описанная в этой серии, также основана на 22.06.
В центре внимания этой серии объясненийВ сочетании с реальными сценариями применения и анализом исходного кода.,А также написание некоторых плагинов и интеграций вокруг Triton. Не по-быстрому,Подходит для друзей, которые тоже любят углубляться.
Многие люди, должно быть, задаются вопросом, что делает тритон и какая польза от его изучения? Вот краткое объяснение:
Уведомление,Есть еще один с таким же названиемtritonдаGPUязык программирования,TVMscript, похожий на TVM,Нужно различать,Тритон в этой статье относится к серверу вывода Triton.
Заимствование официальных фотографий,Структура сценария использования тритонаследующее
Что касается эксплуатации и обслуживания, то я мало что знаю об этом. После выбрасывания K8S конструкция становится чище.
С помощью двух приведенных выше структурных схем,Примерно могу знатьtritonнекоторые изФункции и возможности:
Когда я начал учиться два года назад, официальной информации было относительно мало. Ознакомиться с ним можно только посмотрев исходный кодtritonКак использовать,К счастью, на Чжиху есть статья оTensorRT servingхорошийУчебное пособие,Прочитав несколько статей, у меня появилось общее понимание.tritonрамная конструкция。Это будетtritonназываетсяTensorRT Серверная платформа Serving, разработанная специально для TensorRT, позже стала Triton для поддержки других бэкэндов вывода.
Учебное Тритона сейчас пособие比较много了,Официальные документы более подробные.,В выпуске также приведены различные варианты использования для справки.,B站上也有视频Учебное пособие,Экология намного лучше, чем была два года назад.
Конечно, самое главное — начать его использовать, затем прочитать исходный код и затем настроить.
Вы можете узнать из исходного кода triton:
Подожди, подожди, подожди.,Больше не указан,для программистов,Хороший исходный код — хороший учебный материал。конечно,Вы также можете посмотреть Лао Статья Пана.
Я также напишу несколько статей в серии, посвященной тритону. Текущие планы следующие:
Вообще говоря,Если вы хотите быстро использовать тритон,Используйте напрямуюОфициальное изображениесамый быстрый。 但да官方зеркало有个尴尬点,那就дакомпилироватьхорошее зеркалоТребуемая среда обычно является последней и может не совпадать с вашей.。
Например, для образа версии 22.09 требуется драйвер видеокарты версии 520 и выше.,Если ты хочешьЧтобы настроить собственный драйвер видеокарты, вам необходимо Скомпилировать себя.。 Чиновник также предусматривает использование зеркал.Быстрый метод:
# Первый шаг – создать model repository
git clone -b r22.09 https://github.com/triton-inference-server/server.git
cd server/docs/examples
./fetch_models.sh
# Второй шаг — от NGC Triton container Загрузите последнее изображение и запустите его.
docker run --gpus=1 --rm --net=host -v ${PWD}/model_repository:/models nvcr.io/nvidia/tritonserver:22.09-py3 tritonserver --model-repository=/models
# Третий шаг — отправить
# In a separate console, launch the image_client example from the NGC Triton SDK container
docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:22.09-py3-sdk
/workspace/install/bin/image_client -m densenet_onnx -c 3 -s INCEPTION /workspace/images/mug.jpg
# Inference should return the following
Image '/workspace/images/mug.jpg':
15.346230 (504) = COFFEE MUG
13.224326 (968) = CUP
10.422965 (505) = COFFEEPOT
Два года назад у Triton был только один большой склад. tensorrt_backend также был в основном хранилище triton, но теперь tensorrt_backend был разделен. Очевидно, что triton поддерживает множество других бэкендов в дополнение к tensorrt.
Вот некоторые из репозиториев, которые в настоящее время включены в triton:
Вначале репозитории кода сервера, ядра, общего и бэкэнда были объединены, но позже они были разделены, что повысило гибкость Triton.
Например, вышеупомянутое основное хранилище может независимо предоставлять cAPI в качестве библиотеки динамической компоновки для вызова других программ, удаляя внешние интерфейсы запросов http и grpc и вызывая ее напрямую за один шаг.
Вообще говоря, мы начинаем компиляцию с основного сервера. При компиляции мы связываем код в ядре, общем и бэкэнде. Для этого другие пользовательские бэкэнды (например, tensorrt_backend) также должны включать в себя общий, основной и бэкэнд. три склада, мы можем найти эти связи из соответствующего CMakeList.
Если вы хотите изучить исходный код,Изменить исходный код для настройки,Так что скомпилируйте себя является обязательным.
Скомпилировать и установить Triton на самом деле очень просто.,唯一из难点就даНужно ускориться,Потому что triton клонирует многие сторонние библиотеки при запуске компиляции.,Сторонние библиотеки также клонируют нужные им сторонние библиотеки.,Конечно, все эти библиотеки зарубежные.,Поэтому важно иметь хорошее сетевое окружение.
Например, при компиляции тритона вам необходимо скачать библиотеку grpc. grpc использует множество сторонних библиотек. Если сеть не в порядке, вы часто будете сталкиваться со следующими проблемами:
Failed to recurse into submodule path 'third_party/bloaty'
CMake Error at /tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/tmp/grpc-repo-gitclone.cmake:52 (message):
Failed to update submodules in:
'/tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/src/grpc'
make[3]: *** [_deps/repo-third-party-build/CMakeFiles/grpc-repo.dir/build.make:99: _deps/repo-third-party-build/grpc-repo/src/grpc-repo-stamp/grpc-repo-download] Error 1
make[3]: Leaving directory '/tmp/tritonbuild/tritonserver/build'
make[2]: *** [CMakeFiles/Makefile2:590: _deps/repo-third-party-build/CMakeFiles/grpc-repo.dir/all] Error 2
make[2]: Leaving directory '/tmp/tritonbuild/tritonserver/build'
make[1]: *** [CMakeFiles/Makefile2:145: CMakeFiles/server.dir/rule] Error 2
make[1]: Leaving directory '/tmp/tritonbuild/tritonserver/build'
Включение ускорения — лучший способ. Будь то пользовательский интерфейс или командная строка, доступно соответствующее программное обеспечение, например Clash.
Если ваш сервер действительно не может включить ускорение,Есть и другие способы,То есть заменить все git-адреса большинства тяжеловесных библиотек в библиотеке тритона на отечественные.。
Как его заменить, синхронизирую склад на гитхабе в гитее, например основной склад тритона. После синхронизации могу использовать внутренний адрес.
Разумеется, библиотеки в подмодулях этих библиотек тоже необходимо модифицировать под отечественные исходники. Например, библиотека grpc опирается на множество сторонних библиотек. При клонировании их необходимо скачивать по одной:
Менять немного хлопотно, но также нужно обратить внимание на изменение git-адреса конкретной ветки коммита:
Если некоторые сторонние библиотеки загружаются слишком медленно и их невозможно загрузить,,Мы можем ввести вручную/tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/src/grpc/third_part
каталог, затем вручнуюgit clone xxx
,Затем выполните егоgit submodule init / git submodule update
Вниз就可以带进идти。
Пример:
root@64da25af2629:/tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/src/grpc# git submodule init
root@64da25af2629:/tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/src/grpc# git submodule update
Submodule path 'third_party/googletest': checked out 'c9ccac7cb7345901884aabf5d1a786cfa6e2f397'
Это слишком хлопотно, но это действительно способ сделать это.
Еще одна вещь,Тритон будет клонироваться каждый раз, когда он будет построен.,дапотому что其用了cmakeвExternalProject_Add
инструкция,Если мы уже скачали grpc,Так直接替换到server/build/_deps/repo-third-party-build/grpc-repo/src
Генерал-лейтенант/data/oldpan/software/server/build/_deps/repo-third-party-src/CMakeLists.txt
:
Закомментируйте часть загрузки git и измените локальную версию. Вам не нужно каждый раз клонировать ее.
#
# Get the protobuf and grpc source used for the GRPC endpoint. We must
# use v1.25.0 because later GRPC has significant performance
# regressions (e.g. resnet50 bs128).
#
ExternalProject_Add(grpc-repo
PREFIX grpc-repo
# GIT_REPOSITORY "https://gitee.com/Oldpann/grpc.git"
# GIT_TAG "v1.25.x"
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/grpc-repo/src/grpc"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
PATCH_COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/tools/install_src.py --src <SOURCE_DIR> ${INSTALL_SRC_DEST_ARG} --dest-basename=grpc_1.25.0
)
Сказав так много,Суммируя,最ХОРОШО办法конечно还даОткройте науку, и общая ситуация будет в порядке, что избавит вас от многих проблем.
После решения сетевой проблемы скомпилировать тритон будет очень просто!
git clone --recursive https://github.com/triton-inference-server/server.git
cd server
python build.py --enable-logging --enable-stats --enable-tracing --enable-gpu --endpoint=http --repo-tag=common:r22.06 --repo-tag=core:r22.06 --repo-tag=backend:r22.06 --repo-tag=thirdparty:r22.06 --backend=ensemble --backend=tensorrt
Просто выполните указанную выше команду в каталоге клонированного сервера (ниже приведены мои настройки, мы можем изменить их в соответствии с нашими потребностями).
После выполнения этой командыtritonпостроюdocker
существоватьdockerсерединакомпилировать,В конечном итоге будут созданы 3 изображения:
финальныйкомпилировать ХОРОШОtritonserver_buildbase:latest
зеркало,где мы можем развиваться,Потому что окружающая среда была организована с помощью,Просто выполните команду компилировать еще раз.,Просто скомпилировать,Мы также можем настроить исходный код для разработки персонализированных функций.
нужно внимание,При использовании компилировать вам необходимо получить официальный образ по умолчанию.,Это изображение ограничено драйвером видеокарты.,напримерr22.06
Требуемая версия драйвера видеокарты:470。
Товарищи, посмотрите драйвера вашей видеокарты. Если не установить, то пользоваться не получится ххх.
может пройтиистория зеркала тритона查看зеркало版本要求:
Продолжая, мы не скомпилировали образ тритона, а можем напрямую войти в него и развить:
docker run -v/home/oldpan/code:/code -v/home/oldpan/software:/software -d tritonserver_buildbase:latest /usr/bin/sh -c "while true; do echo hello world; sleep 20;done"
Измените исходный код triton в докере.,Продолжайте выполнять следующую команду для компиляции,и之前из区别就да加了--no-container-build
параметр。
python build.py --enable-logging --enable-stats --enable-tracing --enable-gpu --endpoint=http --repo-tag=common:r22.06 --repo-tag=core:r22.06 --repo-tag=backend:r22.06 --repo-tag=thirdparty:r22.06 --backend=ensemble --no-container-build --build-dir=./build
Если нам нужна отладочная версия triton,可以существовать命令середина添加:--build-type=Debug
。
Кроме того, tensorrt уже включен в исходный образ тритона. Если вы хотите изменить версию, вы можете удалить старый tensorrt в исходном докере и установить новый tensorrt самостоятельно:
Поговорив о предзнаменованиях, давайте вкратце поговорим о процессе операции.
Вот краткое изложение кодаtritonбегатьизОбщий процесс и последующие конкретные детали будут объяснены в следующих главах.。
первый старт,main函数существоватьservers/main.cc
Вниз,При запуске Triton выполнит следующие функции:
// src/servers/main.cc Упрощенный
int
main(int argc, char** argv)
{
// Параметры анализа
TRITONSERVER_ServerOptions* server_options = nullptr;
if (!Parse(&server_options, argc, argv)) {
exit(1);
}
...
// Создать сервер здесь
TRITONSERVER_Server* server_ptr = nullptr;
FAIL_IF_ERR(
TRITONSERVER_ServerNew(&server_ptr, server_options), "creating server"); // Создать сервер здесь
FAIL_IF_ERR(
TRITONSERVER_ServerOptionsDelete(server_options),
"deleting server options");
std::shared_ptr<TRITONSERVER_Server> server(
server_ptr, TRITONSERVER_ServerDelete);
...
// Запустите HTTP, GRPC, И порт статистики производительности
if (!StartEndpoints(server, trace_manager, shm_manager)) {
exit(1);
}
// Trap SIGINT and SIGTERM to allow server to exit gracefully
signal(SIGINT, SignalHandler);
signal(SIGTERM, SignalHandler);
// Подождите, пока зона сигнала уничтожения закроет Тритон.
while (!exiting_) {
...
// Выполните некоторые операции, чтобы отслеживать, изменился ли склад Модели.
}
// Закройте тритон изящно
TRITONSERVER_Error* stop_err = TRITONSERVER_ServerStop(server_ptr);
// Если его невозможно завершить корректно, просто выйдите напрямую.
if (stop_err != nullptr) {
LOG_TRITONSERVER_ERROR(stop_err, "failed to stop server");
exit(1);
}
// Прекратить мониторинг http и grpc
StopEndpoints();
...
return 0;
}
TRITONSERVER_ServerNew
这个函数середина,встреча:
InferenceServer
объектInit
Служить,Инициализируйте статус службы здесь,Проверить параметрыTritonBackendManager
а также Модельуправление складомModelRepositoryManager
Самое важное в процессе запуска — это склад моделей. Конечно, для запуска тритона нужна модель, иначе зачем ее открывать?
Структура каталогов хранилища моделей, которую я здесь использую, следующая (это hrnet, который распознает позы. hrnet официально имеет множество предварительно обученных моделей, а также его очень просто преобразовать в tensorrt):
debug目录Вниз有один Модельпапканазываетсяhrnet-pose-estimate-debug
из Модельпапка,Этот адрес папки (/path/to/hrnet-pose-estimate-debug) необходимо передать в командную строку запуска triton.,Четыре подпапки внутри папки Модель.,будут обнаружены тритоном и загружены один за другим.
нужно вниманиеизда,Кромеhrnet_pose_estimate
这个其余三个существовать目录из1
子目录Вниз有个so
илиmodel.plan
,Это означаетhrnet-trt-static
иimage_preprocess
кромеpose_postprocess
**Все принадлежатmodel,Используемый бэкэнд,**бэкенд будет указан в соответствующей конфигурации:
name: "hrnet-trt-static"
backend: "tensorrt"
потому чтоhrnet-trt-static
даtensorrtиз Модель,Итак, бэкэнд настроен на tensorrt,model.plan — это движок tensorrt. Я поместил серверный файл so в другое место (его также можно разместить в том же каталоге, что и model.plan),Два других бэкэнда предварительной и постобработки размещаются в хранилище моделей.,也就даlibtorch_image_preprocess.so
иlibtriton_pose_postprocess
,Содержит ваш серверный код,Инкапсулировано так, чтобы Тритон мог позвонить
Что касается взаимосвязи между бэкендом, моделью и modelinstanc, то, честно говоря, тут немного сложнее. У каждой есть полный жизненный цикл. документируйте заранее:
Тогда приступим к тритону!
# Выполните следующую функцию, каталог модели пройдет --model-repository обозначение Бэкэнд-проходы tensorrt --backend-directory обозначение
./tritonserver --model-repository=/path/to/hrnet-pose-estimate-debug --backend-directory=/workspace/backends/tensorrt_backend/
После успешной загрузки модели будет выведено:
...
I1016 08:25:37.952055 51771 server.cc:587]
+------------------+----------------------------------------------------------------+----------------------------------------------------------------+
| Backend | Path | Config |
+------------------+----------------------------------------------------------------+----------------------------------------------------------------+
| image_preprocess | /workspace/triton-models/debug/hrnet-pose-estimate-debug/image | {"cmdline":{"auto-complete-config":"false","min-compute-capabi |
| | _preprocess/1/libtriton_image_preprocess.so | lity":"6.000000","backend-directory":"/workspace/backends/tens |
| | | orrt_backend/","default-max-batch-size":"4"}} |
| | | |
| pose_postprocess | /workspace/triton-models/debug/hrnet-pose-estimate-debug/pose_ | {"cmdline":{"auto-complete-config":"false","min-compute-capabi |
| | postprocess/1/libtriton_pose_postprocess.so | lity":"6.000000","backend-directory":"/workspace/backends/tens |
| | | orrt_backend/","default-max-batch-size":"4"}} |
| | | |
| tensorrt | /workspace/backends/tensorrt_backend/li | {"cmdline":{"auto-complete-config":"false","min-compute-capabi |
| | btriton_tensorrt.so | lity":"6.000000","backend-directory":"/workspace/backends/tens |
| | | orrt_backend/","default-max-batch-size":"4"}} |
| | | |
+------------------+----------------------------------------------------------------+----------------------------------------------------------------+
I1016 08:25:37.952252 51771 server.cc:630]
+---------------------+---------+--------+
| Model | Version | Status |
+---------------------+---------+--------+
| hrnet-trt-static | 1 | READY |
| hrnet_pose_estimate | 1 | READY |
| image_preprocess | 1 | READY |
| pose_postprocess | 1 | READY |
+---------------------+---------+--------+
I1016 08:25:38.051742 51771 metrics.cc:650] Collecting metrics for GPU 0: NVIDIA GeForce RTX 3080
I1016 08:25:38.055197 51771 tritonserver.cc:2159]
+----------------------------------+------------------------------------------------------------------------------------------------------------------+
| Option | Value |
+----------------------------------+------------------------------------------------------------------------------------------------------------------+
| server_id | triton |
| server_version | 2.23.0 |
| server_extensions | classification sequence model_repository model_repository(unload_dependents) schedule_policy model_configuration |
| | system_shared_memory cuda_shared_memory binary_tensor_data statistics trace |
| model_repository_path[0] | /workspace/triton-models/debug/hrnet-pose-estimate-debug |
| model_control_mode | MODE_NONE |
| strict_model_config | 1 |
| rate_limit | OFF |
| pinned_memory_pool_byte_size | 268435456 |
| cuda_memory_pool_byte_size{0} | 300021772 |
| response_cache_byte_size | 0 |
| min_supported_compute_capability | 6.0 |
| strict_readiness | 1 |
| exit_timeout | 30 |
+----------------------------------+------------------------------------------------------------------------------------------------------------------+
I1016 08:25:38.055627 51771 http_server.cc:3303] Started HTTPService at 0.0.0.0:8000
I1016 08:25:38.097213 51771 http_server.cc:178] Started Metrics Service at 0.0.0.0:8001
После загрузки мы открыли http-порт, номер порта 8000, а другой — метрический интерфейс, номер порта 8001.
На этом этапе вы можете попробовать использовать http-запросы.
Для запросов есть протоколы http и grpc. Мне больше знаком протокол http, поэтому буду использовать http.
Также предоставляется официальный клиент, доступны как C++, так и Python. Вы можете использовать официальный клиент напрямую или создать свой собственный клиент в соответствии с официальным протоколом http. Если вы можете создать тело, все очень просто.
Протокол запроса можно найти у официального представителя:
Здесь мы используемpython简单构造одинbody
:
# Создайте входное тело тритона
json_buf = b'{\"inputs\":[{\"name\":\"INPUT\",\"datatype\":\"BYTES\",\"shape\":[1],\"parameters\":{\"binary_data_size\":' + \
bytes(str(len(data)), encoding = "utf8") + b'}}],\"outputs\":[{\"name\":\"RESULT\",\"parameters\":{\"binary_data\":true}}]}'
push_data = json_buf + data
print("Inference-Header-Content-Length ",str(len(json_buf)), " Content-Length ",str(len(data) + len(json_buf)))
# Построить тритон-заголовок
header = {"Content-Type": "application/octet-stream", "Accept": "*/*",
"Inference-Header-Content-Length":str(len(json_buf)),
"Content-Length":str(len(data) + len(json_buf))}
server_url = "127.0.0.1:8000"
model_name = "hrnet_pose_estimate"
# просить
response = post('http://' + server_url + '/v2/models/' + model_name + '/infer', data=push_data, headers=header)
Вы можете отправить запрос, и результат будет отправлен обратно в ответ. Мы также можем использовать команду curl для прямой передачи созданного тела (это тело может записывать приведенные выше push_data локально):
[oldpan@have-fun client]$ curl -v --max-time 1 --request POST 'http://192.168.1.102:9006/v2/models/hrnet_pose_estimate/infer' --header 'Inference-Header-Content-Length: 230' --header 'Content-Type: application/octet-stream' --data-binary '@data.txt' --output temp_res
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 192.168.1.102:9006...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 172.29.210.105 (172.29.210.105) port 9006 (#0)
> POST /v2/models/aocr_cnprint_trt8p/infer HTTP/1.1
> Host: 192.168.1.102:9006
> User-Agent: curl/7.71.1
> Accept: */*
> Inference-Header-Content-Length: 230
> Content-Type: application/octet-stream
> Content-Length: 1573102
> Expect: 100-continue
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 100 Continue
} [56480 bytes data]
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Inference-Header-Content-Length: 394
< Content-Length: 6794
<
{ [6794 bytes data]
100 1542k 100 6794 100 1536k 127k 28.8M --:--:-- --:--:-- --:--:-- 28.9M
Результат не будет опубликован, проблем с проверкой нет.
Что касается того, как использовать Curl для прямого запроса Triton, для справки есть несколько связанных ссылок:
Это считается новая яма для тритона. У меня уже есть черновики и файлы заполняются:
Сервер вывода triton — очень полезная сервисная платформа с открытым исходным кодом, бесплатная, проверенная крупными производителями, и при использовании в производственных средах проблем не возникает. Если вы обеспокоены тем, что производительность flask недостаточно хороша или встроенная сервисная структура не полностью функциональна, вы можете попробовать triton, Лао Пан настоятельно рекомендует это сделать.