Triton教程 -- 利用Triton部署你自己的模型

news2024/11/23 9:38:53

Triton教程—利用Triton部署你自己的模型

给定一个经过训练的模型,我如何使用 Triton 推理服务器以最佳配置大规模部署它? 本文档旨在帮助回答这个问题。

对于那些喜欢高级概述的人,下面是大多数用例的通用流程。

对于那些希望直接进入的人,请跳到端到端示例。

有关其他材料,请参阅 Triton 概念指南教程。

概述

  1. 我的模型与 Triton 兼容吗?

    如果您的模型属于 Triton 支持的后端之一,那么我们可以简单地尝试按照快速入门指南中的描述部署该模型。 对于 ONNXRuntime、TensorFlow SavedModel 和 TensorRT 后端,可以使用 Triton 的自动完成功能从模型中推断出最小模型配置。 这意味着可能仍会提供 config.pbtxt,但不是必需的,除非您想明确设置某些参数。 此外,通过 --log-verbose=1 启用详细日志记录,您可以在服务器日志输出中看到 Triton 在内部看到的完整配置。 对于其他后端,请参阅入门所需的最小模型配置。

    如果您的模型不是来自受支持的后端,您可以查看 Python 后端或编写自定义 C++ 后端来支持您的模型。 Python 后端提供了一个简单的接口来通过通用 python 脚本执行请求,但性能可能不如自定义 C++ 后端。 根据您的用例,Python 后端性能可能是实现简单性的充分折衷。

  2. 我可以在我的服务模型上运行推理吗?

    • 假设您能够在 Triton 上加载模型,下一步是验证我们是否可以运行推理请求并获得模型的基线性能基准。 Triton 的 Perf Analyzer 工具特别适合这个目的。 这是用于演示目的的简化输出:
    # NOTE: "my_model" represents a model currently being served by Triton
    $ perf_analyzer -m my_model
    ...
    
    Inferences/Second vs. Client Average Batch Latency
    Concurrency: 1, throughput: 482.8 infer/sec, latency 12613 usec
    
    • 这为我们提供了一个完整性测试,我们能够成功地形成输入请求并接收输出响应以通过 Triton API 与模型后端进行通信。

    • 如果 Perf Analyzer 无法发送请求并且从错误中不清楚如何继续,那么您可能需要完整性检查您的模型 config.pbtxt 输入/输出是否与模型预期的相匹配。 如果配置正确,请直接使用其原始框架检查模型是否成功运行。 如果您没有自己的脚本或工具来执行此操作,Polygraphy 是一个有用的工具,可以通过各种框架在您的模型上运行样本推理。 目前,Polygraphy 支持 ONNXRuntime、TensorRT 和 TensorFlow 1.x。

    • “表现良好”的定义可能因用例而异。 一些常见指标是吞吐量、延迟和 GPU 利用率。 有许多变量可以在您的模型配置 (config.pbtxt) 中进行调整以获得不同的结果。

    • 随着模型、配置或用例的发展,Perf Analyzer 是快速验证模型功能和性能的绝佳工具。

  3. 如何提高我的模型性能?

    • 为了进一步了解您可以为您的用例提供给 Triton 的最佳模型配置,Triton 的模型分析器工具可以提供帮助。 模型分析器可以自动或手动搜索配置组合,以找到满足您的约束条件的最佳 triton 配置。 在运行模型分析器为您的模型/用例找到最佳配置后,您可以将生成的配置文件传输到您的模型存储库。 Model Analyzer 提供了一个快速入门指南,其中包含一些示例。

    • 使用模型分析器找到的新优化配置文件为模型提供服务并再次运行 Perf Analyzer 后,与默认配置相比,您应该期望在大多数情况下找到更好的性能数字。

    • 一些可以为模型调整的参数可能不会暴露给模型分析器的自动搜索,因为它们并不适用于所有模型。 例如,后端可以公开特定于后端的配置选项,这些选项也可以进行调整。 例如,ONNXRuntime 后端有几个参数会影响在模型上执行推理时的并行化级别。 如果默认值不能提供足够的性能,这些特定于后端的选项可能值得研究。 为了调整自定义参数集,模型分析器支持手动配置搜索。

    • 要了解有关模型配置进一步优化的更多信息,请参阅优化文档。

其他有趣的问题

  1. 我的模型在首次被 Triton 加载时执行缓慢(冷启动惩罚),我该怎么办?

    • Triton 公开了在首次加载模型时运行 ModelWarmup 请求的能力,以确保模型在被标记为“就绪”以进行推理之前已充分预热。
  2. 为什么我的模型在 GPU 上的执行速度没有显着提高?

    • Triton 支持的大多数官方后端都针对 GPU 推理进行了优化,应该在开箱即用的 GPU 上表现良好。

    • Triton 为您提供了在 GPU 上进一步优化模型的选项。 Triton 的 Framework Specific Optimizations 进一步详细介绍了这个主题。

    • 将您的模型完全转换为完全针对 GPU 推理优化的后端(例如 TensorRT)可能会提供更好的结果。 您可以在 TensorRT 后端找到更多关于 TensorRT 的特定于 Triton 的详细信息。

    • 如果以上都不能帮助您的模型获得足够的 GPU 加速性能,则该模型可能更适合 CPU 执行,而 OpenVINO 后端可能有助于进一步优化您的 CPU 执行。

端到端示例

注意如果您以前从未使用过 Triton,您可能有兴趣先查看快速入门示例。 对 Triton 的一些基本了解可能对下一节有用,但这个示例意味着在没有经验的情况下足够简单。

让我们以 ONNX 模型为例,因为 ONNX 被设计为一种可以从大多数其他框架轻松导出的格式。

  1. 创建模型存储库并将我们的示例 densenet_onnx 模型下载到其中。
# Create model repository with placeholder for model and version 1
mkdir -p ./models/densenet_onnx/1

# Download model and place it in model repository
wget -O models/densenet_onnx/1/model.onnx 
https://contentmamluswest001.blob.core.windows.net/content/14b2744cf8d6418c87ffddc3f3127242/9502630827244d60a1214f250e3bbca7/08aed7327d694b8dbaee2c97b8d0fcba/densenet121-1.2.onnx
  1. ./models/densenet_onnx/config.pbtxt 的模型存储库中为 densenet_onnx 模型创建最小模型配置。

    注意这是另一个示例配置的稍微简化的版本,它使用了本示例不需要的其他模型配置功能。

    name: "densenet_onnx"
    backend: "onnxruntime"
    max_batch_size: 0
    input: [
      {
        name: "data_0",
        data_type: TYPE_FP32,
        dims: [ 1, 3, 224, 224]
      }
    ]
    output: [
      {
        name: "prob_1",
        data_type: TYPE_FP32,
        dims: [ 1, 1000, 1, 1 ]
      }
    ]
    

    注意 从 22.07 版本开始,Triton 和模型分析器都支持完全自动完成支持它的后端的配置文件。 因此,对于 ONNX 模型,除非您想显式设置某些参数,否则可以跳过此步骤。

  2. 在后台启动服务器和客户端容器

    这些容器可以以交互方式启动,但为了演示,更清楚的是在后台启动这些容器,并根据需要执行以下步骤的 docker exec 到它们中。

    # Start server container in the background
    docker run -d --gpus=all --network=host -v $PWD:/mnt --name triton-server nvcr.io/nvidia/tritonserver:23.05-py3 
    
    # Start client container in the background
    docker run -d --gpus=all --network=host -v $PWD:/mnt --name triton-client nvcr.io/nvidia/tritonserver:23.05-py3-sdk
    

    注意 -v $PWD:/mnt 将主机上的当前目录挂载到容器内的 /mnt 目录中。 因此,如果您在 $PWD/models 中创建了模型存储库,您将在 /mnt/models 的容器中找到它。 您可以根据需要更改这些路径。 有关其工作原理的更多信息,请参阅 docker volume 文档。

  3. 使用 Triton 为模型服务

    为了服务我们的模型,我们将使用我们已经启动的服务器容器,它预装了一个 tritonserver 二进制文件。

    # Enter server container interactively
    docker exec -ti triton-server bash
    
    # Start serving your models
    tritonserver --model-repository=/mnt/models
    

    要检查模型是否加载成功,我们希望在上一个命令的输出中看到我们的模型处于 READY 状态:

    ...
    I0802 18:11:47.100537 135 model_repository_manager.cc:1345] successfully loaded 'densenet_onnx' version 1
    ...
    +---------------+---------+--------+
    | Model         | Version | Status |
    +---------------+---------+--------+
    | densenet_onnx | 1       | READY  |
    +---------------+---------+--------+
    ...
    
  4. 验证模型可以运行推理

    为了验证我们的模型可以执行推理,我们将使用我们已经启动的 triton-client 容器,它预装了 perf_analyzer。

    在一个单独的 shell 中,我们使用 Perf Analyzer 来完整性检查我们是否可以运行推理并获得我们期望从该模型获得的性能的基线。

    在下面的示例中,Perf Analyzer 正在向同一台机器上服务的模型发送请求(通过 --network=host 来自服务器容器的 localhost)。 但是,您也可以通过设置 -u 标志(例如 perf_analyzer -m densenet_onnx -u 127.0.0.1:8000)来测试在某些 <IP>:<PORT> 远程服务的模型。

    # Enter client container interactively
    docker exec -ti triton-client bash
    
    # Benchmark model being served from step 3
    perf_analyzer -m densenet_onnx --concurrency-range 1:4
    
    ...
    Inferences/Second vs. Client Average Batch Latency
    Concurrency: 1, throughput: 265.147 infer/sec, latency 3769 usec
    Concurrency: 2, throughput: 890.793 infer/sec, latency 2243 usec
    Concurrency: 3, throughput: 937.036 infer/sec, latency 3199 usec
    Concurrency: 4, throughput: 965.21 infer/sec, latency 4142 usec
    
  5. 运行模型分析器为我们的模型找到最佳配置

    虽然模型分析器预安装在 SDK(客户端)容器中,并支持连接到 Triton 服务器的各种模式,但为简单起见,我们将在我们的服务器容器中安装模型分析器以使用本地(默认)模式。 要了解有关将模型分析器连接到正在运行的 Triton 服务器的其他方法的更多信息,请参阅 --triton-launch-mode 模型分析器标志。

    # Enter server container interactively
    docker exec -ti triton-server bash
    
    # Stop existing tritonserver process if still running
    # because model-analyzer will start its own server
    SERVER_PID=`ps | grep tritonserver | awk '{ printf $1 }'`
    kill ${SERVER_PID}
    
    # Install model analyzer
    pip install --upgrade pip 
    pip install triton-model-analyzer wkhtmltopdf
    
    # Profile the model using local (default) mode
    # NOTE: This may take some time, in this example it took ~10 minutes
    model-analyzer profile \
      --model-repository=/mnt/models \
      --profile-models=densenet_onnx \
      --output-model-repository-path=results
    
    # Summarize the profiling results
    model-analyzer analyze --analysis-models=densenet_onnx
    

    示例模型分析器输出摘要:

    在 6 种配置的 51 次测量中,densenet_onnx_config_3 提供了最佳吞吐量:323 infer/sec。

    在给定的约束下,这比默认配置(168 次推断/秒)提高了 92%。

    在这里插入图片描述

    在上表中,我们看到将 GPU 实例计数设置为 4 可以让我们在该系统上实现最高的吞吐量和几乎最低的延迟。

    另请注意,此 densenet_onnx 模型具有在输入/输出 dims 的第一个维度中明确指定的固定批量大小,因此 max_batch_size 参数设置为 0,如此处所述。 对于支持动态批量大小的模型,模型分析器还会调整 max_batch_size 参数。

    警告 这些结果特定于运行 Triton 服务器的系统,因此,例如,在较小的 GPU 上,我们可能看不到增加 GPU 实例数带来的改进。 通常,在具有不同硬件(CPU、GPU、RAM 等)的系统上运行相同的配置可能会提供不同的结果,因此在准确反映您将在何处部署模型以供使用的系统上分析您的模型非常重要。

  6. 从模型分析器结果中提取最佳配置

    在我们上面的示例中,densenet_onnx_config_3 是最佳配置。 因此,让我们提取 config.pbtxt 并将其放回我们的模型存储库中以备将来使用。

    # (optional) Backup our original config.pbtxt (if any) to another directory
    cp /mnt/models/densenet_onnx/config.pbtxt /tmp/original_config.pbtxt
    
    # Copy over the optimal config.pbtxt from Model Analyzer results to our model repository
    cp ./results/densenet_onnx_config_3/config.pbtxt /mnt/models/densenet_onnx/
    
    

    现在我们有了优化的模型配置,我们已准备好将我们的模型用于部署。 如需进一步手动调整,请阅读模型配置和优化文档以了解有关 Triton 完整功能集的更多信息。

    在这个例子中,我们碰巧从相同的配置中获得了最高的吞吐量和几乎最低的延迟,但在某些情况下,这是必须做出的权衡。 某些模型或配置可能会实现更高的吞吐量,但也会导致更高的延迟。 值得全面检查模型分析器生成的报告,以确保您的模型性能满足您的要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ceph分布式存储实战

ceph分布式存储实战 分布式存储系统简介 性能与优势对比 虚拟机安装ceph集群 ceph存储系统简介 分布式存储概述 ceph基础 高可用ceph分布式存储系统部署 部署ceph集群 节点管理 ceph使用基础及数据存储案例 PG状态、数据读写流程及存储池操作 mon服务器的高可用: # apt in…

天线设计中的磁介质材料 探索可重构潜力

​from&#xff1a;IEEE Antennas & Propagation Magazine (Vol. 61 / No. 1 / Feb. 2019, pp:29-40) -- 文 前 -- 这篇文章针对铁氧体在外置磁场下磁导率发生变化这个特点&#xff0c;探讨铁氧体在可重构天线中的应用。文中对铁氧体材料的选择&#xff0c;磁导率数学模型…

C++ Builder XE AdvStringGrid的表格画线显示隐藏经典实例

源码实例下载&#xff1a;https://download.csdn.net/download/lzksword/87904787 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //----------------------------…

linuxOPS基础_yum详解

yum是如何安装软件的 yum仓库&#xff08;也称yum源&#xff09;用于存放各种rpm的软件包以及软件包之间的依赖关系&#xff08;repodata目录&#xff09;需要安装软件的计算机连接到指定yum仓库来安装软件包 yum源作用 软件包管理器&#xff0c;类似Windows下的软件管家 yu…

屋大维和王莽,同时同路不同命的双雄

汉朝与罗马&#xff0c;虽然他们相隔万里分布在欧亚大陆东西两端&#xff0c;但他们几乎同时成为世界性文明&#xff0c;分别都是当时世界上东西方最强大的所在。公元元年前后&#xff0c;这两个庞然大物内部都发生了一次巨变&#xff0c;罗马由共和制变为了元首制。而汉朝也由…

ThreadLocal引发的内存泄漏分析

预备知识&#xff08;引用&#xff09; Object o new Object(); 这个o&#xff0c;我们可以称之为对象引用&#xff0c;而new Object()我们可以称之为在内存中产生了一个对象实例。 当写下 onull时&#xff0c;只是表示o不再指向堆中object的对象实例&#xff0c;不代表这个…

chatgpt赋能python:Python在SEO排名中的重要性

Python在SEO排名中的重要性 Python作为一种开源、高级程序设计语言&#xff0c;在Web开发、科学计算、人工智能等领域得到了广泛应用。它的发展速度快、可扩展性强、易于学习和使用等特点&#xff0c;使得Python越来越受到开发者的欢迎&#xff0c;成为重要的编程语言之一。在…

Question Log(★ > 使用VsCode构建Unity 开发环境 )

★ > 使用VsCode构建Unity 开发环境 配置Vscode Unity 环境 官方文档 Unity Development with VS Code 1.The .NET Core SDK cannot be located: A valid dotnet installation could not be found. .NET Core debugging will not be enabled. Make sure the .NET Core SDK …

CVE-2023-0215

mysql 安全漏洞 生产版本&#xff1a;5.5 漏洞编号&#xff1a; CVE编号 CVE-2023-0215 CNNVD编号 CNNVD-202302-521 另外还有以下其他漏洞&#xff1a; 解决办法&#xff1a; 1.下载补丁需要CSI,买了oracle服务才可能会有这个认证码&#xff1b; 2.没有这个认证码&#…

从reflect?metadata理解Nest实现原理

目录 正文入口Module 引入模块CatsService操作数据库Reflect Metadata那元数据存在哪呢&#xff1f;nest 的源码&#xff1a;总结 正文 Nest 是 Node.js 的服务端框架&#xff0c;它最出名的就是 IOC&#xff08;inverse of control&#xff09; 机制了&#xff0c;也就是不需…

Mocha Pro:Track 模块

Track&#xff08;跟踪&#xff09;模块中提供了几组选项&#xff0c;进行适当设置之后再实施跟踪&#xff0c;可以得到更好的跟踪结果。 ◆ ◆ ◆ 模块选项说明 Input 输入 Clip 剪辑 选择要跟踪的素材。 --Input 输入 --Layer Below 图层下方 Track Individual Fields 跟…

零基础想转行做python爬虫及数据分析方向的程序员,有哪些书可以推荐?

学习Python语言是一个不错的选择&#xff0c;一方面Python的应用广泛&#xff0c;在大数据、人工智能、Web开发等领域有大量的使用&#xff0c;另一方面Python语言本身比较简单&#xff0c;非常适合初学者。 Python是完全可以自学的&#xff0c;如果英语基础还可以的话&#x…

有什么软件可以翻译文档?这几款文本翻译软件效果不错

随着世界的全球化&#xff0c;我们越来越需要通过语言进行跨文化交流。但是&#xff0c;不同国家和地区使用的语言却存在差异&#xff0c;这就需要我们掌握一些文本翻译技巧。那么&#xff0c;你是否想过如何实现文本翻译呢&#xff1f;在本文中&#xff0c;我们将给你介绍一些…

Linux:vi编辑器

Vi/vim是visual interface的缩写&#xff0c;是Linux中的文本编辑器&#xff0c;vim相当于是vi的加强版。 1、vi/vim编辑器的三种工作模式&#xff1a; 命令模式&#xff1a;连按两次y键&#xff0c;再按p键&#xff0c;表示复制粘贴当前行的内容&#xff1b;连按两次d键&#…

MySQL数据库---库基本操作 以及 表结构的操作(DDL)

目录 前言 一.数据库的操作 1.1显示当前数据库 1.2创建数据库 1.3使用数据库 1.4删除数据库 二.数据类型 2.1数值类型 2.2字符串类型 2.3日期类型 三.数据表的操作 3.1 创建表结构。 3.2查看数据库中拥有的数据表 3.3查看指定的表结构 3.4修改表结构 3.3删除表结构 …

2023-6-10-第五式原型模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

vue3-实战-09-管理后台-SKU模块开发

目录 1-需求原型分析 2-功能模块开发 2.1-列表页面数据获取和展示 2.2-上架下架sku 2.3-更新sku信息 2.4-查看sku详情 2.5-删除sku 1-需求原型分析 列表页面就是el-card里面放置el-table结构&#xff0c;下面有个el-pagination组件显示分页器。点击查看详情的时候有个抽…

java SSM 学生住宿管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 学生住宿管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

【指针数组】

指针数组 1. 指针运算1.1 指针-整数1.2 指针-指针1.3 指针的关系运算 2. 指针和数组3. 二级指针4. 指针数组 1. 指针运算 指针 整数 指针-指针 指针的关系运算 1.1 指针整数 #define N_VALUES 5 float values[N_VALUES]; float *vp; //指针-整数&#xff1b;指针的关系运算 …

基于Python的招聘信息可视化系统,附源码

文章目录 1 简介2 技术栈3 总体设计3.1 系统结构3.2 数据库设计3.2.1 数据库实体3.2.2 数据库表设计 4 运行设计4.1 招聘热门行业分析4.2热门岗位分析界面4.3招聘岗位学历分析界面4.4岗位分布分析界面 5 源码下载 1 简介 基于Python的招聘信息可视化系统,通过对招聘数据进行分…