如何从入门到精通使用Nvidia Triton?

2026-05-25 18:451阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1760个文字,预计阅读时间需要8分钟。

如何从入门到精通使用Nvidia Triton?

Nvidia Triton 使用教程入门篇,相关预备知识:模型及参数:包含大量参数的网络(参数+结构),体量10MB-10GB不等,模型格式:相同模型可能不同存储格式(如音频、视频文件),主流格式。

Nvidia Triton使用教程 1 相关预备知识
  • 模型:包含了大量参数的一个网络(参数+结构),体积10MB-10GB不等
  • 模型格式:相同的模型可以有不同的存储格式(可类比音视频文件),目前主流有torch、tf、onnx和trt,其中tf又包含了三种格式
  • 模型推理:输入和网络中的参数进行各种运算从而得到一个输出,计算密集型任务且需要GPU加速
  • 模型推理引擎:模型推理工具,可以让模型推理速度变快,使用该工具往往需要特定的模型格式,现在主流推理引擎有trt和ort
  • 模型推理框架:对模型推理的过程进行了封装,使之新增、删除、替换模型更方便,更高级的框架还会有负载均衡、模型监控、自动生成grpc、localhost:8000/v2/models/fc_model_pt/versions/1/infer",json=request_data).json() print(res)

    执行代码后会得到相应的输出:

    { 'model_name': 'fc_model_pt', 'model_version': '1', 'outputs': [{ 'name': 'output__0', 'datatype': 'FP32', 'shape': [2, 3, 4], 'data': [1.152763843536377, 1.1349767446517944, -0.6294105648994446, 0.8846281170845032, 0.059508904814720154, -0.06066855788230896, -1.497096061706543, -1.192716121673584, 0.7339693307876587, 0.28189709782600403, 0.3425392210483551, 0.08894850313663483, 0.48277992010116577, 0.9581012725830078, 0.49371692538261414, -1.0144696235656738, -0.03292369842529297, 0.3465275764465332, -0.5444514751434326, -0.6578375697135925, 1.1234807968139648, 1.1258794069290161, -0.24797165393829346, 0.4530307352542877] }, { 'name': 'output__1', 'datatype': 'FP32', 'shape': [2, 3, 8], 'data': [-0.28994596004486084, 0.0626179575920105, -0.018645435571670532, -0.3376324474811554, -0.35003775358200073, 0.2884367108345032, -0.2418503761291504, -0.5449661016464233, -0.48939061164855957, -0.482677698135376, -0.27752232551574707, -0.26671940088272095, -0.2171783447265625, 0.025355860590934753, -0.3266356587409973, -0.06301657110452652, -0.1746724545955658, -0.23552510142326355, 0.10773542523384094, -0.4255935847759247, -0.47757795453071594, 0.4816707670688629, -0.16988427937030792, -0.35756853222846985, -0.06549499928951263, -0.04733048379421234, -0.035484105348587036, -0.4210450053215027, -0.07763291895389557, 0.2223128080368042, -0.23027443885803223, -0.4195460081100464, -0.21789231896400452, -0.19235755503177643, -0.16810789704322815, -0.34017443656921387, -0.05121977627277374, 0.08258339017629623, -0.2775516211986542, -0.27720844745635986, -0.25765007734298706, -0.014576494693756104, 0.0661710798740387, -0.38623639941215515, -0.45036202669143677, 0.3960753381252289, -0.20757021009922028, -0.511818528175354] }] }

    不知道是不是我的用法有问题,就使用体验来看,这个推理接口有些让我不适应:

    1. 明明在config.pbtxt里指定了datatype,但是输入的时候还需要指定,不指定就会报错
    2. 输入的shape也需要指定,那不然也会报错
    3. datatype的值和config.pbtxt里不统一,如果datatype设为TYPE_INT64,则会报错,必须为INT64
    4. 输出里的data是个1维数组,需要根据返回的shape自动reshape成对应的array

    除了像我这样直接写代码调用,还可以使用他们提供的官方库pip install tritonclient[github.com/triton-inference-server/client。

    3 从黄金到王者:使用triton的高级特性

    上一小节的教程只是用到了triton的基本功能,所以段位只能说是个黄金,下面介绍下一些triton的高级特性。

    如何从入门到精通使用Nvidia Triton?

    3.1 模型并行

    模型并行可以指同时启动多个模型或单个模型的多个实例。实现起来并不复杂,通过修改配置参数就可以。在默认情况下,triton会在每个可用的gpu上都部署一个该模型的实例从而实现并行。
    接下来我会对多种情况进行测试,以让你们清楚模型并行所带来的效果,本人的配置是2块3060(租的)用于测试多模型的情况。
    压测命令使用ab -k -c 5 -n 500 -p ipt.json localhost:8000/v2/models/fc_model_pt/versions/1/infer
    这条命令的意思是5个进程反复调用接口共500次。
    测试配置及对应的QPS如下:

    • 共1个卡;每个卡运行1个实例:QPS为603
    • 共2个卡;每个卡运行1个实例:QPS为1115
    • 共2个卡;每个卡运行2个实例:QPS为1453
    • 共2个卡;每个卡运行2个实例;同时在CPU上放2个实例:QPS为972

    结论如下:多卡性能有提升;多个实例能进一步提升并发能力;加入CPU会拖累速度,主要是因为CPU速度太慢。

    下面是上述测试对应的配置项,直接复制了放到config.pbtxt中就行

    #共2个卡;每个卡运行2个实例 instance_group [ { count: 2 kind: KIND_GPU gpus: [ 0 ] }, { count: 2 kind: KIND_GPU gpus: [ 1 ] } ] # 共2个卡;每个卡运行2个实例;同时在CPU上放2个实例 instance_group [ { count: 2 kind: KIND_GPU gpus: [ 0 ] }, { count: 2 kind: KIND_GPU gpus: [ 1 ] }, { count: 2 kind: KIND_CPU } ]

    至于选择使用几张卡,则通过创建容器时的--gpus来指定

    3.2 动态batch

    动态batch的意思是指, 对于一个请求,先不进行推理,等个几毫秒,把这几毫秒的所有请求拼接成一个batch进行推理,这样可以充分利用硬件,提升并行能力,当然缺点就是个别用户等待时间变长,不适合低频次请求的场景。使用动态batch很简单,只需要在config.pbtxt加上 dynamic_batching { },具体参数细节大家可以去看文档,我的这种简单写法,组成的bsz上限就是max_batch_size,本人压测的结果是约有50%QPS提升,反正就是有效果就对了。

    PS:这种优化方式对于压测来说简直就是作弊。。。

    3.3 自定义backend

    所谓自定义backend就是自己写推理过程,正常情况下整个推理过程是通过模型直接解决的,但是有一些推理过程还会包含一些业务逻辑,比如:整个推理过程需要2个模型,其中要对第一个模型的输出结果做一些逻辑判断然后修改输出才能作为第二个模型的输入,最简单的做法就是我们调用两次triton服务,先调用第一个模型获取输出然后进行业务逻辑判断和修改,然后再调用第二个模型。不过在triton中我们可以自定义一个backend把整个调用过程写在里面,这样就简化调用过程,同时也避免了一部分localhost:8000/v2/models/fc_model_pt/versions/1/infer",json=request_data).json() print(res) res = requests.post(url="localhost:8000/v2/models/custom_model/versions/1/infer",json=request_data).json() print(res)

    运行结果可以发现2次的输出中,ouput__0是不一样,而output__1是一样的,这和咱们写的model.py的逻辑有关系,我这里就不多解释了。

    PS:自定义backend避免了需要反复调用NLG模型进行生成而产生的传输时延

    4 总结

    如果上面的教程你完整的走了一遍,相信你对triton的使用方法和相关特性会有一个大概的了解,王者不敢保证,黄金段位肯定是有了,后面去学习使用triton的其他特性想必也会非常顺利.
    如果你在使用过程中遇到了问题可以私信或者评论,我们一起学习交流。
    最后如果有需要租用GPU机器的同学,可以考虑featurize,我做的实验就是在这上面租了机器,大家如果需要租用请使用我的邀请链接,也算是给我做实验回本了,谢谢各位,注册链接:featurize.cn?s=7b59a59ea4574318b0504dff01728f95

    文章同步发与知乎和公众号,欢迎关注:
    www.zhihu.com/people/zdd-44-59

本文共计1760个文字,预计阅读时间需要8分钟。

如何从入门到精通使用Nvidia Triton?

Nvidia Triton 使用教程入门篇,相关预备知识:模型及参数:包含大量参数的网络(参数+结构),体量10MB-10GB不等,模型格式:相同模型可能不同存储格式(如音频、视频文件),主流格式。

Nvidia Triton使用教程 1 相关预备知识
  • 模型:包含了大量参数的一个网络(参数+结构),体积10MB-10GB不等
  • 模型格式:相同的模型可以有不同的存储格式(可类比音视频文件),目前主流有torch、tf、onnx和trt,其中tf又包含了三种格式
  • 模型推理:输入和网络中的参数进行各种运算从而得到一个输出,计算密集型任务且需要GPU加速
  • 模型推理引擎:模型推理工具,可以让模型推理速度变快,使用该工具往往需要特定的模型格式,现在主流推理引擎有trt和ort
  • 模型推理框架:对模型推理的过程进行了封装,使之新增、删除、替换模型更方便,更高级的框架还会有负载均衡、模型监控、自动生成grpc、localhost:8000/v2/models/fc_model_pt/versions/1/infer",json=request_data).json() print(res)

    执行代码后会得到相应的输出:

    { 'model_name': 'fc_model_pt', 'model_version': '1', 'outputs': [{ 'name': 'output__0', 'datatype': 'FP32', 'shape': [2, 3, 4], 'data': [1.152763843536377, 1.1349767446517944, -0.6294105648994446, 0.8846281170845032, 0.059508904814720154, -0.06066855788230896, -1.497096061706543, -1.192716121673584, 0.7339693307876587, 0.28189709782600403, 0.3425392210483551, 0.08894850313663483, 0.48277992010116577, 0.9581012725830078, 0.49371692538261414, -1.0144696235656738, -0.03292369842529297, 0.3465275764465332, -0.5444514751434326, -0.6578375697135925, 1.1234807968139648, 1.1258794069290161, -0.24797165393829346, 0.4530307352542877] }, { 'name': 'output__1', 'datatype': 'FP32', 'shape': [2, 3, 8], 'data': [-0.28994596004486084, 0.0626179575920105, -0.018645435571670532, -0.3376324474811554, -0.35003775358200073, 0.2884367108345032, -0.2418503761291504, -0.5449661016464233, -0.48939061164855957, -0.482677698135376, -0.27752232551574707, -0.26671940088272095, -0.2171783447265625, 0.025355860590934753, -0.3266356587409973, -0.06301657110452652, -0.1746724545955658, -0.23552510142326355, 0.10773542523384094, -0.4255935847759247, -0.47757795453071594, 0.4816707670688629, -0.16988427937030792, -0.35756853222846985, -0.06549499928951263, -0.04733048379421234, -0.035484105348587036, -0.4210450053215027, -0.07763291895389557, 0.2223128080368042, -0.23027443885803223, -0.4195460081100464, -0.21789231896400452, -0.19235755503177643, -0.16810789704322815, -0.34017443656921387, -0.05121977627277374, 0.08258339017629623, -0.2775516211986542, -0.27720844745635986, -0.25765007734298706, -0.014576494693756104, 0.0661710798740387, -0.38623639941215515, -0.45036202669143677, 0.3960753381252289, -0.20757021009922028, -0.511818528175354] }] }

    不知道是不是我的用法有问题,就使用体验来看,这个推理接口有些让我不适应:

    1. 明明在config.pbtxt里指定了datatype,但是输入的时候还需要指定,不指定就会报错
    2. 输入的shape也需要指定,那不然也会报错
    3. datatype的值和config.pbtxt里不统一,如果datatype设为TYPE_INT64,则会报错,必须为INT64
    4. 输出里的data是个1维数组,需要根据返回的shape自动reshape成对应的array

    除了像我这样直接写代码调用,还可以使用他们提供的官方库pip install tritonclient[github.com/triton-inference-server/client。

    3 从黄金到王者:使用triton的高级特性

    上一小节的教程只是用到了triton的基本功能,所以段位只能说是个黄金,下面介绍下一些triton的高级特性。

    如何从入门到精通使用Nvidia Triton?

    3.1 模型并行

    模型并行可以指同时启动多个模型或单个模型的多个实例。实现起来并不复杂,通过修改配置参数就可以。在默认情况下,triton会在每个可用的gpu上都部署一个该模型的实例从而实现并行。
    接下来我会对多种情况进行测试,以让你们清楚模型并行所带来的效果,本人的配置是2块3060(租的)用于测试多模型的情况。
    压测命令使用ab -k -c 5 -n 500 -p ipt.json localhost:8000/v2/models/fc_model_pt/versions/1/infer
    这条命令的意思是5个进程反复调用接口共500次。
    测试配置及对应的QPS如下:

    • 共1个卡;每个卡运行1个实例:QPS为603
    • 共2个卡;每个卡运行1个实例:QPS为1115
    • 共2个卡;每个卡运行2个实例:QPS为1453
    • 共2个卡;每个卡运行2个实例;同时在CPU上放2个实例:QPS为972

    结论如下:多卡性能有提升;多个实例能进一步提升并发能力;加入CPU会拖累速度,主要是因为CPU速度太慢。

    下面是上述测试对应的配置项,直接复制了放到config.pbtxt中就行

    #共2个卡;每个卡运行2个实例 instance_group [ { count: 2 kind: KIND_GPU gpus: [ 0 ] }, { count: 2 kind: KIND_GPU gpus: [ 1 ] } ] # 共2个卡;每个卡运行2个实例;同时在CPU上放2个实例 instance_group [ { count: 2 kind: KIND_GPU gpus: [ 0 ] }, { count: 2 kind: KIND_GPU gpus: [ 1 ] }, { count: 2 kind: KIND_CPU } ]

    至于选择使用几张卡,则通过创建容器时的--gpus来指定

    3.2 动态batch

    动态batch的意思是指, 对于一个请求,先不进行推理,等个几毫秒,把这几毫秒的所有请求拼接成一个batch进行推理,这样可以充分利用硬件,提升并行能力,当然缺点就是个别用户等待时间变长,不适合低频次请求的场景。使用动态batch很简单,只需要在config.pbtxt加上 dynamic_batching { },具体参数细节大家可以去看文档,我的这种简单写法,组成的bsz上限就是max_batch_size,本人压测的结果是约有50%QPS提升,反正就是有效果就对了。

    PS:这种优化方式对于压测来说简直就是作弊。。。

    3.3 自定义backend

    所谓自定义backend就是自己写推理过程,正常情况下整个推理过程是通过模型直接解决的,但是有一些推理过程还会包含一些业务逻辑,比如:整个推理过程需要2个模型,其中要对第一个模型的输出结果做一些逻辑判断然后修改输出才能作为第二个模型的输入,最简单的做法就是我们调用两次triton服务,先调用第一个模型获取输出然后进行业务逻辑判断和修改,然后再调用第二个模型。不过在triton中我们可以自定义一个backend把整个调用过程写在里面,这样就简化调用过程,同时也避免了一部分localhost:8000/v2/models/fc_model_pt/versions/1/infer",json=request_data).json() print(res) res = requests.post(url="localhost:8000/v2/models/custom_model/versions/1/infer",json=request_data).json() print(res)

    运行结果可以发现2次的输出中,ouput__0是不一样,而output__1是一样的,这和咱们写的model.py的逻辑有关系,我这里就不多解释了。

    PS:自定义backend避免了需要反复调用NLG模型进行生成而产生的传输时延

    4 总结

    如果上面的教程你完整的走了一遍,相信你对triton的使用方法和相关特性会有一个大概的了解,王者不敢保证,黄金段位肯定是有了,后面去学习使用triton的其他特性想必也会非常顺利.
    如果你在使用过程中遇到了问题可以私信或者评论,我们一起学习交流。
    最后如果有需要租用GPU机器的同学,可以考虑featurize,我做的实验就是在这上面租了机器,大家如果需要租用请使用我的邀请链接,也算是给我做实验回本了,谢谢各位,注册链接:featurize.cn?s=7b59a59ea4574318b0504dff01728f95

    文章同步发与知乎和公众号,欢迎关注:
    www.zhihu.com/people/zdd-44-59