目录

1 自定义C++backend

1.1 需要实现八个api

1.2 backend/examples/backends/recommended/src/recommended.cc

1.3 定义自己的backend

1.3.1 复制文件夹以及重命名文件

1.3.2  修改backend/examples/backends/cumtchw/CMakeLists.txt

1.3.3 编译

1.3.4 模型目录名字、后端名字、后端SO库放哪里的问题

1.3.5 构建我的模型目录

1.3.6 利用docker测试自定义的backend

1.3.7 中间遇到的几个错误

参考文献:


1 自定义C++backend

1.1 需要实现八个api

由前面的分析,我们要想实现一个自己的backend,那么需要实现那8个api,

  • TRITONBACKEND_Initialize

  • TRITONBACKEND_Finalize

  • TRITONBACKEND_ModelInitialize

  • TRITONBACKEND_ModelFinalize

  • TRITONBACKEND_ModelInstanceInitialize

  • TRITONBACKEND_ModelInstanceFinalize

  • TRITONBACKEND_ModelInstanceExecute

  • TRITONBACKEND_BackendControl (可选)

1.2 backend/examples/backends/recommended/src/recommended.cc

在这个文件里面有英伟达给的参考demo相当于,然后如果我们想实现自己的后端,可以直接参考这个文件,然后我把这个recommanded.cc完整的看了一遍,我发现他这个文件大约有这些特点

  • 实现了那8个api
  • 还实现了一个class ModelState,表示一个模型级别的状态,负责加载模型配置(如 model_config.pbtxt),管理模型的一些信息。
  • 还实现了一个class ModelInstanceState,表示模型的每个实例,通常与推理执行相关联,负责处理具体推理请求。
  • 里面包含了很多的英文注释进行了详细的说明
  • 这个demo还不支持GPU的,只是cpu的。
  • 很多函数基本都是只有基本框架,并没有真正完整具体功能,比如推理函数也没有模型推理,直接将输入的tensor赋值给了输出,这个demo就是用来讲清楚框架和流程。

1.3 定义自己的backend

这里我的backend名字命名为cumtchw(我的网名)

1.3.1 复制文件夹以及重命名文件

执行下面的命令

cp -drf backend/examples/backends/recommended backend/examples/backends/cumtchw
mv  backend/examples/backends/cumtchw/src/recommended.cc   backend/examples/backends/cumtchw/src/cumtchw.cc
mv backend/examples/backends/cumtchw/src/libtriton_recommended.ldscript   backend/examples/backends/cumtchw/src/libtriton_cumtchw.ldscript
mv backend/examples/backends/cumtchw/cmake/TutorialRecommendedBackendConfig.cmake.in  mv backend/examples/backends/cumtchw/TutorialCumtchwBackendConfig.cmake.in

1.3.2  修改backend/examples/backends/cumtchw/CMakeLists.txt

要把cmakelists.txt中的一些名字也都修改成cumtchw,为了加快速度,可以在vscode中当前文件中使用ctrl+h进行替换,替换的时候不要一次直接点全替换,要一个一个的确认进行替换,要是着急直接全替换后面出错了更耽误时间

  • triton-recommended-backend → 替换成 triton-cumtchw-backend

  • triton_recommended → 替换成 triton_cumtchw

  • recommended → 替换成 cumtchw

  • TutorialRecommendedBackend → 替换成 TutorialCumtchwBackend

1.3.3 编译

cd backend/examples/backends/cumtchw/
mkdir build
cd build/
cmake ..

报错

CMake Error at build/_deps/repo-common-src/CMakeLists.txt:48 (find_package):
  Could not find a package configuration file provided by "RapidJSON" with
  any of the following names:

    RapidJSONConfig.cmake
    rapidjson-config.cmake

用下面命令安装,    

sudo yum install epel-release -y
sudo yum install rapidjson-devel -y

然后重新cmake以及make

cmake ..
make -j10

得到如下结果

1.3.4 模型目录名字、后端名字、后端SO库放哪里的问题

 在https://github.com/triton-inference-server/backend 上面有文件夹目录的说明,

For a model, M that specifies backend B, Triton searches for the backend shared library in the following places, in this order:

  • <model_repository>/M/<version_directory>/libtriton_B.so

  • <model_repository>/M/libtriton_B.so

  • <global_backend_directory>/B/libtriton_B.so

解释一下就是,假设你有一个模型 M,它在 config.pbtxt 里设置了

name:"M"      #模型目录的名字

backend:"B"  #后端的名字

Triton 会按如下顺序去相应的目录中找 libtriton_B.so

  1. <model_repository>/M/<version_directory>/libtriton_B.so

  2. <model_repository>/M/libtriton_B.so

  3. <global_backend_directory>/B/libtriton_B.so

    • 默认的 <global_backend_directory> 是:/opt/tritonserver/backends/

    • 但可以用启动参数 --backend-directory 自定义

1.3.5 构建我的模型目录

首先在server/docs/examples/model_repository/下面新建cumtchw文件夹

在cumtchw文件夹下面新建一个1文件夹,也就是版本号文件夹

然后把我编译出来的libtriton_cumtchw.so库拷贝进去server/docs/examples/model_repository/cumtchw/

然后创建一个config.pbtxt,在里面写入如下内容,我其实就是修改了name和backend,其他的都没动。

name: "cumtchw"
backend: "cumtchw"

dynamic_batching {
  max_queue_delay_microseconds: 5000000
}
input [
  {
    name: "IN0"
    data_type: TYPE_INT32
    dims: [ 4 ]
  }
]
output [
  {
    name: "OUT0"
    data_type: TYPE_INT32
    dims: [ 4 ]
  }
]
instance_group [
  {
    kind: KIND_CPU
  }
]

然后目录下如

login cumtchw]$ tree
.
├── 1
│   └── libtriton_cumtchw.so
└── config.pbtxt

1 directory, 2 files

 等会启动docker的时候把model_repository目录映射进去,这样我的cumtchw也就在里面了。

1.3.6 利用docker测试自定义的backend

在终端的examples路径下运行下面的命令

docker run --rm -it \
  -p18000:8000 -p18001:8001 -p18002:8002 \
  -v ${PWD}/model_repository:/models \
  nvcr.io/nvidia/tritonserver:25.05-py3 \
  bash

然后再运行

tritonserver --model-repository=/models

然后有如下结果

1.3.7 中间遇到的几个错误

上面几个步骤都是修改后的正确步骤,但是中间还遇到了几个错误。

Invalid model name: Could not determine backend for model 'cumtchw' with no backend in model configuration.
Expected model name of the form 'model.<backend_name>'.

这是刚开始只是创建了config.pbtxt,忘记在里面写东西了。

failed to load model 'cumtchw': at least one version must be available under the version policy of model 'cumtchw'

这个错误是因为最开始在cumtchw下面没有创建1文件夹作为版本文件夹。

| cumtchw              | 1       | UNAVAILABLE: Unsupported: reshape not supported for input tensor 

这是自定义的backend不支持reshape,所以修改config.pbtxt把这个reshape先去掉。

参考文献:

https://github.com/triton-inference-server/server

https://github.com/triton-inference-server/backend  

Triton中文社区

https://github.com/triton-inference-server/backend/tree/main#backends

tritonserver学习之五:backend实现机制_triton backend-CSDN博客

tritonserver学习之三:tritonserver运行流程_trition-server 使用教程-CSDN博客

Triton Server 快速入门_tritonserver-CSDN博客

 深度学习部署神器-triton inference server第一篇 - Oldpan的个人博客

tritonserver学习之六:自定义c++、python custom backend实践_triton c++-CSDN博客

Logo

欢迎来到由智源人工智能研究院发起的Triton中文社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐