使用perf_analyzer和model-analyzer测试tritonserver的模型性能超详细完整版

news2025/6/13 18:42:33

导读

当我们在使用tritonserver部署模型之后,通常需要测试一下模型的服务QPS的能力,也就是1s我们的模型能处理多少的请求,也被称为吞吐量。

测试tritonserver模型服务的QPS通常有两种方法,一种是使用perf_analyzer 来测试,另一种是通过model-analyzer来获取更为详细的模型服务启动的参数,使得模型的QPS达到最大,下面我们将分别来介绍如何通过这两种工具来测试tritonserver模型服务的吞吐量

环境准备

使用docker镜像来进行测试非常的方便,一般对应版本的tritonserver都会有一个tritonserver-sdk的版本,例如21.10需要准备的镜像如下

nvcr.io/nvidia/tritonserver:21.10-py3
nvcr.io/nvidia/tritonserver:21.10-py3-sdk
nvcr.io/nvidia/tensorrt:21.10-py3

  • tritonserver:tritonserver模型启动服务所需要的镜像
  • tritonserver-py3-sdk:包含perf_analyzer model-analyzer可以用于做性能测试的镜像
  • tensorrt:包含与tritonserver镜像中一样的tensorrt版本,该镜像主要用来将onnx模型转换为engine用于tritonserver启动模型服务时所需要的模型文件

:不同版本的版本的镜像所需要的nvidia-driver的版本不一样,21.10所需要的nvida-driver版本为>=470.82(cuda11.4),如果低于该版本时,在启动镜像的时候会提示不兼容。在准备上面镜像的时候tritonservertensorrt版本一定要一致,因为不同的版本依赖库以及tensorrt的版本可能会不一样,导致模型可能无法通用

perf_analyzer

  1. 启动tritonserver模型服务
docker run --gpus all --rm -p8000:8000 -p8001:8001 -p8002:8002 -v triton_models:/models nvcr.io/nvidia/tritonserver:21.10-py3 tritonserver --model-repository=/models
  • –gpus:表示启动tritonserver服务是否使用gpu
  • –rm:当退出容器的时候会自动删除容器
  • -p:用于容器内和宿主机之间的端口映射
  • –model-repository:指定tritonserver运行的时候所需要的模型文件
    在这里插入图片描述
    启动之后输出上面的信息就表示tritonserver模型服务启动成功
  1. 运行tritonserver-sdk镜像
docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:21.10-py3-sdk

因为这里我们只是使用了perf_analyzer性能测试工具,所以其他的启动参数可以不用管
3. 性能测试

perf_analyzer -m resnet34 --percentile=95 --concurrency-range 100
  • -m:指定测试的模型
  • –percentile:以百分位数表示置信度值用于确定测量结果是否稳定
  • –concurrency-range:指定并发量参数,还可以使用,100:120:10表示并发量在100到120之间以10作为间隔测试所有并发量情况下的吞吐量
  • -b:指定请求的batch-size,默认为1
  • -i:指定请求所使用的协议,参数可以为httpgrpc

其他更多的参数可以通过perf_analyzer -h查看

执行成功之后会输出模型所能承受的吞吐量以及时延

*** Measurement Settings ***
Batch size: 1
Using “time_windows” mode for stabilization
Measurement window: 5000 msec
Using synchronous calls for inference
Stabilizing using p95 latency

Request concurrency: 100
Client:
Request count: 11155
Throughput: 2231 infer/sec
p50 latency: 43684 usec
p90 latency: 61824 usec
p95 latency: 67900 usec
p99 latency: 76275 usec
Avg HTTP time: 45183 usec (send/recv 161 usec + response wait 45022 usec)
Server:
Inference count: 13235
Execution count: 722
Successful request count: 722
Avg request latency: 29032 usec (overhead 629 usec + queue 11130 usec + compute input 7317 usec + compute infer 9889 usec + compute output 67 usec)

Inferences/Second vs. Client p95 Batch Latency
Concurrency: 100, throughput: 2231 infer/sec, latency 67900 usec

在使用http协议进行测试的时候,可能会存在比较大的波动,小伙伴们可以多测试几组来取平均值,grpc协议相对来说更加稳定一些。

我们最重要的是关注最后一行的输出信息,表示在100并发的请求下,tritonserver的吞吐量可以达到2231请求/s,时延是67900微秒。可以看出tritonserver模型服务的推理能力还是很强的,显卡是RTX3090,在只使用了一个count的情况下ResNet34可以达到2200FPS

model-analyzer

  1. 启动tritonserver-sdk
docker run --gpus 1 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -ti -v /var/run/docker.sock:/var/run/docker.sock --net host --privileged --rm -v /home/***/triton_models:/models -v /data/reports:/data/reports nvcr.io/nvidia/tritonserver:21.10-py3-sdk bash

这里需要注意的是,我们在这里不需要再去启动tritonserver模型服务了,但是启动的参数多了很多,上面这些参数都是必要的

  • v指定docker.sock是让容器能够启动tritonser模型服务容器
  • /data/reports:/data/reports:指定模型测试报告存储的路径,这里容器内外的路径需要保持一致,否则后面再使用model-analyzer的时候会报错
  1. 创建tritonserver可执行文件
touch /opt/tritonserver
chmod +x /opt/tritonserver
  1. 启动model-analyzer测试
model-analyzer profile --model-repository /models --profile-models resnet34 --run-config-search-max-concurrency 2 --run-config-search-max-instance-count 2 --gpus '0' --triton-launch-mode=docker --output-model-repository=/data/reports/resnet34 --triton-server-path=/opt/tritonserver --override-output-model-repository
  • profile:
  • model-repository:指定模型保存的目录,这里可以是包含多个模型的目录
  • profile-models :指定测试模型的名字
  • run-config-search-max-concurrency:最大的并发数
  • run-config-search-max-instance-count:最大的count也就是模型实例数
  • triton-launch-mode:docker或local,如果是local的时候需要容器内安装tritonserver,这里使用的是docker
  • output-model-repository:测试报告保存的目录
  • override-output-model-repository:每次测试的时候都会覆盖之前的测试报告

为了加快测试的速度,这里我将count设置为2,concurrency 也设置为2,在实际使用的过程中小伙伴们可以设置一个范围,使用min和max来进行控制,而不要直接固定住这些参数。因为我们最终需要的是得到countconcurrencybatch-size这些参数的最优值。

注:需要注意triton-model-analyzer的版本,不同的版本指定的参数会不一样,这里triton-model-analyzer==1.9.0,小伙伴们可以通过model-analyzer -h来查看参数。
在这里插入图片描述
执行成功之后我们会得到一个ckpt的文件

  1. 导出模型的性能报告
mkdir analysis_results
model-analyzer analyze --analysis-models resnet34 -e analysis_results

在这里插入图片描述
5. 查看结果
拷贝报告,将容器内的报告拷贝到宿主机上,通过docker ps -a来查看容器的id

docker cp 5610298c2c93:/workspace/analysis_results ./

/analysis_results/reports/summaries/resnet34目录下有一个result_summary.pdf文件里面记录了模型的性能参数
在这里插入图片描述
这里吞吐量低的主要原因是因为我们把最大的并发数设置为2了,大家在使用的时候可以设置大一点,参数搜索的范围越大所需要的时间就会越长

相关错误以及解决办法

  1. 启动tritonserver服务失败

I0903 13:53:33.877351 1 server.cc:233] Waiting for in-flight requests to complete.
I0903 13:53:33.877375 1 server.cc:248] Timeout 30: Found 0 live models and 0 in-flight non-inference requests
error: creating server: Internal - failed to load all models

模型服务启动失败时,注意看前面的错误信息,前面会有显示每个模型的加载状态以及加载失败的原因
在这里插入图片描述
上面错误的原因是因为在转换启动模型文件的时候,所使用的tensorrt版本与容器内tensorrt的版本不一致导致加载失败,通过使用与tritonserver版本一致的tensorrt进行将onnx模型重新转换一下即可。
2. Failed to set the value for field “triton_server_path”

2023-09-03 14:45:35.892 ERROR[entrypoint.py:214] Model Analyzer encountered an error: Failed to set the value for field “triton_server_path”. Error: Either the binary ‘tritonserver’ is not on the PATH, or Model Analyzer does not have permissions to execute os.stat on this path.

touch /opt/tritonserver
chmod +x /opt/tritonserver
  1. OSError: [Errno 16] Device or resource busy: ‘/data/reports’
    在执行model-analyzer的时候提示resource busy,详细错误信息如下

2023-09-04 02:52:07.192 ERROR[entrypoint.py:214] Model Analyzer encountered an error: Failed to set the value for field “triton_server_path”. Error: Either the binary ‘/opt/tritonserver’ is not on the PATH, or Model Analyzer does not have permissions to execute os.stat on this path.
root@zhouwen3090:/workspace# touch /opt/tritonserver
root@zhouwen3090:/workspace# chmod +x /opt/tritonserver
root@zhouwen3090:/workspace# model-analyzer profile --model-repository /models --profile-models resnet34 --run-config-search-max-concurrency 1 --run-config-search-max-instance-count 1 --gpus ‘0’ --triton-launch-mode=docker --output-model-repository=/data/models/reports --triton-server-path=/opt/tritonserver --override-output-model-repository
2023-09-04 02:52:22.668 INFO[gpu_device_factory.py:50] Initiliazing GPUDevice handles…
2023-09-04 02:52:23.764 INFO[gpu_device_factory.py:246] Using GPU 0 NVIDIA GeForce RTX 3090 with UUID GPU-82eb2e4d-c579-7908-39c9-92201438f73c
Traceback (most recent call last):
File “/usr/local/bin/model-analyzer”, line 8, in
sys.exit(main())
File “/usr/local/lib/python3.8/dist-packages/model_analyzer/entrypoint.py”, line 289, in main
create_output_model_repository(config)
File “/usr/local/lib/python3.8/dist-packages/model_analyzer/entrypoint.py”, line 249, in create_output_model_repository
os.mkdir(config.output_model_repository_path)
FileNotFoundError: [Errno 2] No such file or directory: ‘/data/models/reports’
root@zhouwen3090:/workspace# model-analyzer profile --model-repository /models --profile-models resnet34 --run-config-search-max-concurrency 1 --run-config-search-max-instance-count 1 --gpus ‘0’ --triton-launch-mode=docker --output-model-repository=/data/reports --triton-server-path=/opt/tritonserver --override-output-model-repository
2023-09-04 02:53:38.665 INFO[gpu_device_factory.py:50] Initiliazing GPUDevice handles…
2023-09-04 02:53:39.750 INFO[gpu_device_factory.py:246] Using GPU 0 NVIDIA GeForce RTX 3090 with UUID GPU-82eb2e4d-c579-7908-39c9-92201438f73c
Traceback (most recent call last):
File “/usr/local/lib/python3.8/dist-packages/model_analyzer/entrypoint.py”, line 249, in create_output_model_repository
os.mkdir(config.output_model_repository_path)
FileExistsError: [Errno 17] File exists: ‘/data/reports’

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/local/bin/model-analyzer”, line 8, in
sys.exit(main())
File “/usr/local/lib/python3.8/dist-packages/model_analyzer/entrypoint.py”, line 289, in main
create_output_model_repository(config)
File “/usr/local/lib/python3.8/dist-packages/model_analyzer/entrypoint.py”, line 258, in create_output_model_repository
shutil.rmtree(config.output_model_repository_path)
File “/usr/lib/python3.8/shutil.py”, line 722, in rmtree
onerror(os.rmdir, path, sys.exc_info())
File “/usr/lib/python3.8/shutil.py”, line 720, in rmtree
os.rmdir(path)
OSError: [Errno 16] Device or resource busy: ‘/data/reports’

只需要修改一下--output-model-repository=/data/reports指定的路径即可,在后面增加一个模型的名称修改为--output-model-repository=/data/reports/resnet34
4. /usr/bin/wkhtmltopdf: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory

strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5

参考

  1. https://github.com/triton-inference-server/client/blob/main/src/c%2B%2B/perf_analyzer/docs/cli.md
  2. https://github.com/triton-inference-server/model_analyzer/tree/main/docs
  3. https://github.com/triton-inference-server/model_analyzer/blob/main/docs/quick_start.md
  4. https://github.com/triton-inference-server/model_analyzer/blob/main/docs/install.md
  5. https://github.com/triton-inference-server/model_analyzer/issues/120

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

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

相关文章

递归/回溯/动规

1 动规-打家劫舍一 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家;如果偷了第二…

计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

Dubbo2.0

前置 衡量网站性能指标: 响应时间:一次请求花费时间并发数:同时处理请求数 并发连接数:每秒建立总TCP数量请求数:QPS一秒请求数并发用户数:单位时间用户 吞吐量:单位时间处理请求数 QPS&#…

Web前端自动化测试Cypress实践总结

本文主要首先主要介绍了什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中。 一、自动化测试概述 为了保障软件质量,并减少重复性的测试工作,自动化测…

GaussDB数据库SQL系列-层次递归查询

目录 一、前言 二、GuassDB数据库层次递归查询概念 三、GaussDB数据库层次递归查询实验示例 1、创建实验表 2、sys_connect_by_path(col, separator) 3、connect_by_root(col) 4、WITH RECURSIVE 四、递归查询的优缺点 1、优点 2、缺点 五、总结 一、前言 层次递归…

中使用pack局管理器:管理器布置小部件

一、说明 在本教程中,我们将了解如何制作登录 UI。今天的教程将重点介绍如何使用 Tkinter 的pack布局管理器。 二、设计用户界面 什么是布局管理器?创建图形界面时,窗口中的小部件必须具有相对于彼此排列的方式。例如,可以使用微件…

Yolov5的tensorRT加速(python)

地址:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5 下载yolov5代码 方法一:使用torch2trt 安装torch2trt与tensorRT 参考博客:https://blog.csdn.net/dou3516/article/details/124538557 先从github拉取torch2trt源码 ht…

【C++ 二叉搜索树】

目录 1.什么是二叉搜索树2.构建二叉搜索树2.1首先搭建树的框架2.2搭建搜索树的框架 3.二叉搜索树的插入3.1非递归式插入3.2递归式插入 4.二叉搜索树的查找4.1非递归查找4.2递归查找 5.二叉搜索树的删除5.1非递归删除5.2递归删除 6.整个代码实现 1.什么是二叉搜索树 简单来讲就…

WebDAV之π-Disk派盘 + 小书匠

小书匠是一款功能丰富,强大的知识管理工具。全平台覆盖,离线数据存储,自定义数据服务器,所见即所得的 markdown 编辑体验。 小书匠提供了多种实用的编辑模式,例如:栏编辑、双栏编辑、三栏编辑、全屏写作、全屏阅读等。并且该软件还提供了许多有用的扩展语法,比如Latex公…

【前端demo】CSVJSON转换器 原生实现:CSV转换为JSON,JSON转换为CSV

文章目录 效果过程textareaTooltip提示工具按钮的min-width判断输入是否是CSV或JSONJSON与CSV样例JSON转为CSVCSV转为JSON不足之处 代码HTMLCSSJS 其他demo 效果 效果预览:CSV&JSON Converter (codepen.io) 参照的预览:JSV Converter(gpaiva00.git…

地毯16 CFR 1630/1631安全防火性易燃性测试

地毯的16 CFR 1630/1631安全防火性易燃性测试是一项重要的产品检测认证标准。该测试旨在评估地毯材料的防火性能,以确保其在使用过程中不会引发火灾或加剧火势。测试过程包括对地毯样品进行燃烧测试和燃烧后的评估。 根据16 CFR 1630标准,地毯样品将被暴…

检漏仪和高真空度控制技术在热管漏率和内部真空度测量中的应用

摘要:大量MEMS真空密封件具有小体积、高真空和无外接通气接口的特点,现有的各种检漏技术无法对其进行无损形式的漏率和内部真空度测量。基于压差法和高真空度恒定控制技术,本文提出了解决方案。方案的具体内容是将被测封装器件放置在一个比器…

elementui表格自定义表头的两种方法

表格自定义表头的方式 多选框表头换文字 请查看上篇博客:http://t.csdn.cn/69De2 文字换按钮 render-header render-header方法详情 Table-column Attributes 参数说明类型可选值默认值render-header列标题 Label 区域渲染使用的 FunctionFunction(h, { column, $in…

恒运资本:北向资金流出一定会跌吗?股票涨跌与什么有关?

北向资金被认为是A股商场的风向标,它的动向往往会影响投资者的心情。那么北向资金流出一定会跌吗?股票涨跌与什么有关?恒运资本也为大家准备了相关内容,以供参阅。 北向资金流出一定会跌吗? 北向资金流出并不一定意味…

快速解决 adb server version doesn‘t match this client

这个问题是由于电脑上安装了多个版本的adb工具,客户端和服务端的版本不一致,无法正常通信导致。最快的解决方法就是将Android SDK中adb复制到系统目录下。 操作步骤如下: 1. 查看adb版本和路径 执行adb version,如下&#xff0…

手机无人直播软件在苹果iOS系统中能使用吗?

在现代社交媒体的时代,直播带货已经成为了一种热门的销售途径。通过直播,人们可以远程分享自己的商品,与观众进行互动,增强沟通和参与感。而如今,手机无人直播软件更是成为了直播带货领域的一项火爆的技术。那么&#…

渗透测试——安全漏洞扫描工具APPScan的安装与基本使用步骤

前言 HCL AppScan Standard是安全专家和渗透测试者设计的动态应用程序安全测试工具,AppScan使用强大的扫描引擎,会自动检索目标应用程序并测试漏洞。测试结果按优先级排列,允许操作员快速分类问题、发现最关键的漏洞。每个检测到的问题都可以…

Python 自学:使用线程模块同时运行代码 Threading

1. 以下代码中,程序会等一个函数执行完毕才执行下一个函数。 import timestart time.perf_counter()def do_something():print(Sleeping 1 second...)time.sleep(1)print(Done Sleeping...)do_something() do_something()finish time.perf_counter()print(fFinis…

惠普NS1005 NS1020打印机如何判断是不是该加粉了

惠普 Laser NS MFP 1005 1020系列智能闪充加粉式多功能一体机的耗材余量指示灯显示“1” “2” “2”时,就是在“说”:快没有墨粉了; 耗材余量指示灯和充粉口指示灯 在不同的状态下代表不同的意思,当耗材余量指示灯显示“1” “2”…

2023年9月上海/广州/深圳CSPM-3国标项目管理中级认证招生

CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要…