当前位置: 首页 > article >正文

【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始

模型部署系列文章

  • 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结
  • 前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比
  • 【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程
  • 【保姆级教程附代码(二)】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程细化
  • 前面介绍了模型从 PyTorch 到 TensoRT 转化的过程(属于整体流程图的 Model Repo 那部分),接下来几篇则是将重点放到 client-server 之间的部分,需要我们加深对 triton_client 以及不同的 triton inference server 的理解。
  • 【Triton Inference Server 多输入|多输出|无输出】如何用 triton_client.infer 调用多输入、多输出的模型进行推理呢?
  • 本篇重点是解释如何使用 Python 库与 Triton 通信执行推理任务,参考官方 repo。

文章目录

  • 模型部署系列文章
  • Client-Server 整体流程
      • 关键步骤
  • 一、前置特性了解
  • 二、创建模型存储库
  • 三、启动 Triton(docker)
  • 四、Client 发送推理请求


Client-Server 整体流程

在这里插入图片描述

关键步骤

  1. Creating a Model Repository / 创建模型存储库
  2. Launching Triton / 启动 Triton
  3. Send an Inference Request / 发送推理请求

一、前置特性了解

  1. Python 客户端库使用 numpy 来表示输入和输出张量。

    • 其它框架(如 PyTorch)支持张量,其中张量中的每个元素都位于 可变长度二进制数据。
    • 每个元素可以包含一个字符串或 任意字节序列。
    • 在客户端上,此数据类型为 BYTES(请参阅 数据类型 有关支持的数据类型的信息)。
  2. 在某些情况下,使用系统共享内存在客户端库和 Triton 之间通信张量可以显著提高性能。

    • Python 示例应用程序 simple_http_shm_client.py 和 simple_grpc_shm_client.py 中演示了如何使用系统共享内存。
    • Python 没有分配和访问共享内存的标准方法,因此举个例子,一个简单的系统共享内存模块 提供了,可以与 Python 客户端库一起使用来创建, 设置和销毁系统共享内存。
  3. 在某些情况下,使用 CUDA 共享内存在客户端库和 Triton 之间传递张量可以显著提高性能。

    • Python 示例应用程序 simple_http_cudashm_client.py 和 simple_grpc_cudashm_client.py 中演示了如何使用 CUDA 共享内存。
    • Python 没有分配和访问共享内存的标准方法,因此举个例子,一个简单的 CUDA 共享内存模块 提供了,可以与 Python 客户端库一起使用来创建, 设置和销毁 CUDA 共享内存。该模块目前支持 numpy 数组(示例用法)和 DLPack 张量(示例用法)。

正式动手,以👉快速开始为案例。

二、创建模型存储库

  • 可以在示例中下载模型来进行尝试
cd docs/examples
./fetch_models.sh
  • 本文这里只下载了 densenet 作为尝试
# ONNX densenet
mkdir -p model_repository/densenet_onnx/1
wget -O model_repository/densenet_onnx/1/model.onnx \
     https://github.com/onnx/models/raw/main/validated/vision/classification/densenet-121/model/densenet-7.onnx

三、启动 Triton(docker)

docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v $(pwd)/densenet_onnx:/models/densenet_onnx docker.io/xxx:v1 tritonserver --model-repository=/models
  1. 启动特定 Triton 的 docker 时过程中遇到了: Error response from daemon: could not select device driver “” with capabilities,参考方案得到了解决。
  2. 启动时要注意所在的路径和 docker 命令对应上。
    • 如下 -v $(pwd)/densenet_onnx:/models/densenet_onnx:这部分将当前工作目录下的 densenet_onnx 目录挂载到容器内的 /models/densenet_onnx 目录。
    • 那么当前目录下就需要有以下的结构才行。
      在这里插入图片描述
  3. 验证 Triton 是否正确运行
    • 正常运行后会有以下提示,可以看到模型是处于 READY 状态。
      在这里插入图片描述
    • 新开一个 terminal 后输入以下 curl 的语句。
    • 用 Triton 的就绪端点来验证服务器和模型是否已准备好进行推理。
    • 从主机系统使用curl 访问指示服务器状态的HTTP 端点。
curl -v localhost:8000/v2/health/ready

# 输出为
*   Trying 127.0.0.1:8000...
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET /v2/health/ready HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 0
< Content-Type: text/plain
< 
* Connection #0 to host localhost left intact
  • 这个输出说明 Triton Inference Server 已经准备好(ready)。返回的 200 OK 状态码表示服务器正常运行并能够处理请求。
  • 通过访问 /v2/health/ready 端点,你确认了 Triton Inference Server 的健康状态,表明它已成功启动并准备好接受推理请求。

四、Client 发送推理请求

  • 可以通过 docker 中的客户端来实现。
docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-py3-sdk

docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:24.08-py3-sdk
  • 从 nvcr.io/nvidia/tritonserver:<xx.yy>-py3-sdk 映像中,运行示例图像客户端应用程序,以使用示例 dendensenet_onnx 模型执行图像分类。

  • 要发送 dendensenet_onnx 模型的请求,请使用 /workspace/images 目录中的图像。在本例中,我们要求前 3 个分类。

    $ /workspace/install/bin/image_client -m densenet_onnx -c 3 -s INCEPTION /workspace/images/mug.jpg
    Request 0, batch size 1
    Image '/workspace/images/mug.jpg':
        15.346230 (504) = COFFEE MUG
        13.224326 (968) = CUP
        10.422965 (505) = COFFEEPOT
    

在这里插入图片描述


http://www.kler.cn/a/465005.html

相关文章:

  • 【Vue】<script setup>和 <script>区别是什么?在使用时的写法区别?
  • flutter组件————Row和Column
  • 【sql】CAST(GROUP_CONCAT())实现一对多对象json输出
  • 办公 三之 Excel 数据限定录入与格式变换
  • 机器学习-感知机-神经网络-激活函数-正反向传播-梯度消失-dropout
  • 无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构
  • Windows系统提示ffmpeg.dll丢失怎么解决?
  • 详细讲解外部导入Excel通过命令行形式导数据库中
  • Elasticsearch 在 Java 中的使用教程
  • Golang互斥锁正常模式和饥饿模式的区别
  • 信息科技伦理与道德1:绪论
  • Java的基础概念(二)
  • MySQL中distinct和group by去重的区别
  • 力扣--LCR 167.招式拆解I
  • LeetCode7. 整数反转
  • 基于物联网的冻保鲜运输智能控制系统
  • MySQL实用SQL示例
  • 利用Java爬虫获取亚马逊国际按关键字搜索商品的实践指南
  • SQL偏移类窗口函数—— LAG()、LEAD()用法详解
  • Leetcode 从前序与中序遍历序列构造二叉树