网易首页 > 网易号 > 正文 申请入驻

NVIDIA Triton 系列文章(8):用户端其他特性

0
分享至

前面文章用 Triton 开源项目提供的 image_client.py 用户端作示范,在这个范例代码里调用大部分 Triton 用户端函数,并使用多种参数来配置执行的功能,本文内容就是简单剖析 image_client.py 的代码,为读者提供撰写 Triton 用户端的流程

  • 指定通信协议

为了满足大部分网路环境的用户端请求,Triton 在服务器与用户端之间提供 HTTP 与 gRPC 两种通信协议,如下架构图所示:

当我们启动 Triton 服务器之后,最后状态会停留在如下截屏的地方:

显示的信息表示,系统提供 8001 端口给 gRPC 协议使用、提供 8000 端口给 HTTP 协议使用。此时服务器处于接收用户端请求的状态,因此“指定通信协议”是执行 Triton 用户端的第一个工作。

这个范例支持两种通信协议,一开始先导入tritonclient.httptritonclient.grpc两个模块,如下:

import tritonclient.grpc as grpcclientimport tritonclient.http as httpclient

代码使用“-i”或“--protocal”其中一种参数指定“HTTP”或“gRPC”协议类型,如果不指定就使用“HTTP”预设值。再根据协议种类调用 httpcclient.InferenceServerClient() 或 grpcclient.InferenceServerClient() 函数创建triton_client对象,如下所示:

try: if FLAGS.protocol.lower() == "grpc": # Create gRPC client for communicating with the server triton_client = grpcclient.InferenceServerClient( url=FLAGS.url, verbose=FLAGS.verbose) else: # Specify large enough concurrency to handle the # the number of requests. concurrency = 20 if FLAGS.async_set else 1 triton_client = httpclient.InferenceServerClient( url=FLAGS.url, verbose=FLAGS.verbose, concurrency=concurrency)

最后启用 triton_client.infer() 函数对 Triton 服务器发出推理要求,当然得将所需要的参数提供给这个函数,如下所示:

responses.append( triton_client.infer(FLAGS.model_name, inputs, request_id=str(sent_count), model_version=FLAGS.model_version, outputs=outputs))

不过 image_client.py 代码中并未设定 gRPC 所需要的 8001 端口,因此使用这个通讯协议时,需要用“-u”参数设定“IP:端口”,例如下面指令:

$ python3 image_client.py -m inception_graphdef -s INCEPTION VGG ${HOME}/images/mug.jpg -i GRPC -u <服务器IP>:8001

在 examples 范例目录下还有 20 个基于 gRPC 协议的范例以及 10 个基于 HTTP 协议的范例,则是在代码内直接指定个别通信协议与端口号的范例,读者可以根据需求去修改特定的范例代码。

  • 调用异步模式(async mode)与数据流(streaming)

大部分读者比较熟悉的并行计算模式,就是在同一个时钟脉冲(clock puls)让不同计算核执行相同的工作,也就是所谓的 SIMD(单指令多数据)并行计算,通常适用于数据量大而且持续的密集型计算任务。

对 Triton 推理服务器而言,并不能确认所收到的推理要求是否为密集型的计算。事实上很大比例的推理要求是属于零碎型计算,这种状况下调用“异步模式”会让系统更加有效率,因为它允许不同计算核(线程)在同一个时钟脉冲段里执行不同指令,这样能大大提高执行弹性进而优化计算性能。

当 Triton 服务器端启动之后,就能接收来自用户端的“异步模式”请求,不过在 HTTP 协议与 gRPC 协议的处理方式不太一样。

在代码中用httpclient.InferenceServerClient()函数创建 HTTP 的 triton_client 对象时,需要给定“concurrnecy(并发数量)”参数,而创建 gRPC 的用户端时就不需要这个参数。

调用异步模式有时会需要搭配数据流(stream)的处理器(handle),因此在实际推理的函数就有triton_client.async_infer()triton_client.async_stream_infer()两种,使用 gRPC 协议创建的triton_client,在调用无 stream 模式的async_infer()函数进行推理时,需要提供partial(completion_callback, user_data)参数。

由于异步处理与数据流处理有比较多底层线程管理的细节,初学者只需要范例目录下的代码,包括 image_client.py 与两个 simple_xxxx_async_infer_client.py 的代码就可以,细节部分还是等未来更熟悉系统之后再进行深入。

  • 使用共享内存(share memory)

如果发起推理请求的 Triton 用户端与 Triton 服务器在同一台机器时,就可以使用共享内存的功能,这包含一般系统内存与 CUDA 显存两种,这项功能可以非常高效地降低数据传输的开销,对提升推理性能有明显的效果。

在 image_client.py 范例中并未提供这项功能,在 Python 范例下有 6 个带有“shm”文件名的代码,就是支持共享内存调用的范例,其中 simple_http_shm_client.py 与 simple_grpc_shm_client.py 为不同通信协议提供了使用共享系统内存的代码,下面以 simple_grpc_shm_client.py 内容为例,简单说明一下主要执行步骤:

# 1.为两个输入张量创建数据:第1个初始化为一整数、第2个初始化为所有整数 input0_data = np.arange(start=0, stop=16, dtype=np.int32) input1_data = np.ones(shape=16, dtype=np.int32) input_byte_size = input0_data.size * input0_data.itemsize output_byte_size = input_byte_size# 2. 为输出创建共享内存区域,并存储共享内存管理器 shm_op_handle = shm.create_shared_memory_region("output_data", "/output_simple", output_byte_size * 2)# 3.使用Triton Server注册输出的共享内存区域 triton_client.register_system_shared_memory("output_data", "/output_simple", output_byte_size * 2)# 4. 将输入数据值放入共享内存 shm_ip_handle = shm.create_shared_memory_region("input_data", "/input_simple", input_byte_size * 2)# 5. 将输入数据值放入共享内存 shm.set_shared_memory_region(shm_ip_handle, [input0_data]) shm.set_shared_memory_region(shm_ip_handle, [input1_data], offset=input_byte_size)# 6. 使用Triton Server注册输入的共享内存区域 triton_client.register_system_shared_memory("input_data", "/input_simple", input_byte_size * 2)# 7. 设置参数以使用共享内存中的数据 inputs = [] inputs.append(grpcclient.InferInput('INPUT0', [1, 16], "INT32")) inputs[-1].set_shared_memory("input_data", input_byte_size) inputs.append(grpcclient.InferInput('INPUT1', [1, 16], "INT32")) inputs[-1].set_shared_memory("input_data", input_byte_size, offset=input_byte_size) outputs = [] outputs.append(grpcclient.InferRequestedOutput('OUTPUT0')) outputs[-1].set_shared_memory("output_data", output_byte_size) outputs.append(grpcclient.InferRequestedOutput('OUTPUT1')) outputs[-1].set_shared_memory("output_data", output_byte_size, offset=output_byte_size) results = triton_client.infer(model_name=model_name, inputs=inputs, outputs=outputs)# 8. 从共享内存读取结果 output0 = results.get_output("OUTPUT0")

至于范例中有两个simple_xxxx_cudashm_client.py这是针对 CUDA 显存共享的返利代码,主要逻辑与上面的代码相似,主要将上面“shm.”开头的函数改成“cudashm.”开头的函数,当然处理流程也更加复杂一些,需要有足够 CUDA 编程基础才有能力驾驭,因此初学者只要大致了解流程就行。

以上就是 Triton 用户端会用到的基本功能,不过缺乏足够的说明文件,因此其他功能函数的内容必须自行在开源文件内寻找,像 C++ 版本的功能得在 src/c++/library 目录下的 common.h、grpc_client.h 与 http_client.h 里找到细节,Python 版本的函数分别在 src/python/library/triton_client 下的 grpc、http、utils 下的 __init__.py 代码内,获取功能与函数定义的细节。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
姐妹,咱俩都是一样的成熟,怎么看着你比我大呀?

姐妹,咱俩都是一样的成熟,怎么看着你比我大呀?

飛娱日记
2026-05-02 08:41:31
带队一年双冠,私生活毁掉一切:中国篮坛最可惜的天才

带队一年双冠,私生活毁掉一切:中国篮坛最可惜的天才

酷侃体坛
2026-05-29 10:01:58
法官问为何不交物业费,业主反问:不交税违法,不交费违法吗

法官问为何不交物业费,业主反问:不交税违法,不交费违法吗

蜉蝣说
2026-02-03 16:31:54
夏天吃鱼,这3种鱼再贵也要买,比鲫鱼鲜,比鲈鱼有营养,好吃

夏天吃鱼,这3种鱼再贵也要买,比鲫鱼鲜,比鲈鱼有营养,好吃

阿龙美食记
2026-06-11 18:59:35
全国倒查整治持续升级,退休干部也被追责,人情办事时代落幕了吗

全国倒查整治持续升级,退休干部也被追责,人情办事时代落幕了吗

复转这些年
2026-06-12 18:23:32
根本不提吴艳妮!日媒沸腾了,福部真子自称发挥糟糕仍创亚洲第一

根本不提吴艳妮!日媒沸腾了,福部真子自称发挥糟糕仍创亚洲第一

杨华评论
2026-06-12 20:33:42
18名印度人因缺少返程机票及相关证明文件 在曼谷机场被拒绝登机前往老挝

18名印度人因缺少返程机票及相关证明文件 在曼谷机场被拒绝登机前往老挝

曼谷陈大叔
2026-06-11 16:50:19
世界杯D组美国VS巴拉圭!美国硬仗实力一般,巴拉圭有望制造惊喜

世界杯D组美国VS巴拉圭!美国硬仗实力一般,巴拉圭有望制造惊喜

体育吐槽
2026-06-12 16:23:35
中学生深夜看色情网站 上千部隐晦内容已吸引上亿次观看!

中学生深夜看色情网站 上千部隐晦内容已吸引上亿次观看!

闪电新闻
2026-06-12 07:10:35
马科斯怎么都料不到!在仁爱礁坐滩27年的破船,却意外助力中国了

马科斯怎么都料不到!在仁爱礁坐滩27年的破船,却意外助力中国了

共工之锚
2026-06-10 00:41:05
重庆一男子带茅台乘高铁被安检拦下,3分钟内豪饮整瓶,妻子回应:丈夫酒量尚可,喝完有点微醺,下车后又与朋友继续喝酒

重庆一男子带茅台乘高铁被安检拦下,3分钟内豪饮整瓶,妻子回应:丈夫酒量尚可,喝完有点微醺,下车后又与朋友继续喝酒

潇湘晨报
2026-06-12 16:20:20
LABUBU世界杯联名款火了:限购2个上架就售罄,有平台已售上万件

LABUBU世界杯联名款火了:限购2个上架就售罄,有平台已售上万件

新京报
2026-06-12 20:57:41
这组全是许晴年轻旧照!

这组全是许晴年轻旧照!

草莓解说体育
2026-06-05 14:04:24
一份摆在美国情报部门案头的报告:中国到底在等什么

一份摆在美国情报部门案头的报告:中国到底在等什么

民间胡扯老哥
2026-06-08 07:20:06
向太曝刘亦菲陈金飞真实关系:成也干爹败也干爹

向太曝刘亦菲陈金飞真实关系:成也干爹败也干爹

悠悠说世界
2026-06-10 09:20:39
窦骁拥抱刘浩存的这段戏,在全网火了,张艺谋的话终于有人信了!

窦骁拥抱刘浩存的这段戏,在全网火了,张艺谋的话终于有人信了!

动物奇奇怪怪
2026-06-12 16:14:16
为什么那么多酒店都倒闭了?网友:高铁+腾讯会议,干掉了90%酒店

为什么那么多酒店都倒闭了?网友:高铁+腾讯会议,干掉了90%酒店

夜深爱杂谈
2026-06-12 19:56:05
港星廖启智结发妻子突然病逝,终年65岁,网友感叹:家人天上团聚

港星廖启智结发妻子突然病逝,终年65岁,网友感叹:家人天上团聚

蜜桔娱乐
2026-06-12 17:12:39
李刚仁身价又涨了 马竞又加价了!洪明甫太有魄力 一语维护孙兴慜

李刚仁身价又涨了 马竞又加价了!洪明甫太有魄力 一语维护孙兴慜

刀锋体育
2026-06-12 17:32:11
阿根廷左路塌了!主力左后卫伤缺首战,3大备选谁能顶得上?

阿根廷左路塌了!主力左后卫伤缺首战,3大备选谁能顶得上?

春日筆記
2026-06-13 01:51:46
2026-06-13 03:48:49
NVIDIA英伟达中国 incentive-icons
NVIDIA英伟达中国
英伟达(中国)官方账号
3570文章数 1459关注度
往期回顾 全部

科技要闻

刚刚,人类历史上首位万亿美元富豪诞生!

头条要闻

美加墨世界杯第二场比赛就现空座 英媒:尴尬

头条要闻

美加墨世界杯第二场比赛就现空座 英媒:尴尬

体育要闻

欧洲恐韩?肉德维德?

娱乐要闻

一天4个瓜,肖战热巴最意外

财经要闻

万亿美元顺差背后,透露这些信号

汽车要闻

标配激光雷达/双动力可选 昊铂S600限时售17.99万起

态度原创

教育
时尚
艺术
游戏
亲子

教育要闻

家长成了“疯女人”,被女儿作业搞崩溃,网友:太真实

夏天别总穿一身白或一身黑!试试一半彩色、一半基础色,高级亮眼

艺术要闻

砸了640亿,再赔160亿!沙特“The Line”项目彻底凉了?

索尼PS国区运营神了!玩梗《黑袍》:我会玩你的游戏

亲子要闻

给孩子报个幼儿园还要工资流水?难道这就是传说中的“因财施教”

无障碍浏览 进入关怀版