Triton教程---模型设置

news2024/11/27 9:43:06

Triton教程—模型设置

这是您第一次编写配置文件吗? 查看本指南或本示例!
在这里插入图片描述

文章目录

  • Triton教程---模型设置
    • 最小模型配置
    • 名称、平台和后端
    • 模型交互策略
      • 解耦
    • 最大批量大小
    • 输入和输出
    • PyTorch 后端的特殊约定
      • 命名约定:
      • 张量字典作为输入:
    • 自动生成的模型配置
    • 默认最大批处理大小和动态批处理程序
    • 数据类型
    • Reshape
    • 形状张量
    • 版本策略
    • 实例组
    • 多个模型实例
    • CPU型号实例
    • 主机策略
    • 速率限制器配置
      • 资源
      • 优先事项
      • 集成模型实例组
    • CUDA计算能力
    • 调度和批处理
    • 默认调度程序
    • 动态批处理器
    • 推荐配置流程
    • 首选批量大小
    • 延迟批处理
      • 保留顺序
      • 优先级
      • 队列策略
      • 自定义批处理
    • 序列批处理程序
    • 集成调度器
    • 优化策略
    • 模型预热
    • 响应缓存

模型存储库中的每个模型都必须包含一个模型配置,该配置提供有关模型的必需和可选信息。 通常,此配置在指定为 ModelConfig protobuf 的 config.pbtxt 文件中提供。 在某些情况下,如自动生成的模型配置中所述,模型配置可以由 Triton 自动生成,因此不需要明确提供。

本节介绍最重要的模型配置属性,但还应查阅 ModelConfig protobuf 中的文档。

最小模型配置

最小模型配置必须指定平台和/或后端属性、max_batch_size 属性以及模型的输入和输出张量

例如,考虑一个 TensorRT 模型,它有两个输入 input0input1 以及一个输出 output0,所有这些都是 16 dims float32 张量。 最低配置是:

  platform: "tensorrt_plan"
  max_batch_size: 8
  input [
    {
      name: "input0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    },
    {
      name: "input1"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]
  output [
    {
      name: "output0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]

名称、平台和后端

模型配置名称属性是可选的。 如果模型的名称未在配置中指定,则假定它与包含模型的模型存储库目录相同。 如果指定了名称,它必须与包含模型的模型存储库目录的名称相匹配。 后端文档中描述了平台和后端所需的值。

模型交互策略

model_transaction_policy 属性描述了模型预期的交互性质。

解耦

此布尔值设置指示模型生成的响应是否与向其发出的请求分离。 使用解耦意味着模型生成的响应数量可能与发出的请求数量不同,并且响应相对于请求的顺序可能是乱序的。 默认值为 false,这意味着模型将为每个请求生成一个响应。

最大批量大小

max_batch_size 属性指示模型支持的批处理类型的最大批大小,Triton 可以利用这些类型。 如果模型的批次维度是第一个维度,并且模型的所有输入和输出都有这个批次维度,那么 Triton 可以使用其动态批处理程序或序列批处理程序自动对模型使用批处理。 在这种情况下,max_batch_size 应设置为大于或等于 1 的值,表示 Triton 应与模型一起使用的最大批量大小。

对于不支持批处理的模型,或者不支持上述特定方式的批处理,max_batch_size 必须设置为零。

输入和输出

每个模型输入和输出都必须指定名称、数据类型和形状。 为输入或输出张量指定的名称必须与模型预期的名称相匹配。

PyTorch 后端的特殊约定

命名约定:

由于 TorchScript 模型文件中输入/输出的元数据不足,配置中输入/输出的“名称”属性必须遵循特定的命名约定。 这些在下面详述。

  1. [仅适用于输入] 当输入不是张量字典时,配置文件中的输入名称应反映模型定义中前向函数的输入参数名称。

    例如,如果 Torchscript 模型的前向函数定义为 forward(self, input0, input1),则第一个和第二个输入应分别命名为“input0”和“input1”。

  2. <name>__<index>:其中<name>可以是任意字符串,<index>是一个整数索引,表示相应输入/输出的位置。

    这意味着如果有两个输入和两个输出,则第一个和第二个输入可以命名为“INPUT__0”“INPUT__1”,而第一个和第二个输出可以分别命名为“OUTPUT__0”“OUTPUT__1”

  3. 如果所有输入(或输出)不遵循相同的命名约定,那么我们从模型配置中强制执行严格排序,即我们假设配置中输入(或输出)的顺序是这些输入的真实顺序。

张量字典作为输入:

PyTorch 后端支持以张量字典的形式将输入传递给模型。 仅当包含字符串到张量的映射的字典类型模型有单个输入时才支持此功能。 例如,如果有一个模型需要表单的输入:

{'A': tensor1, 'B': tensor2}

这种情况下配置中的输入名称不能遵循上述命名约定<name>__<index>。 相反,在这种情况下,输入的名称必须映射到该特定张量的字符串值“key”。 对于这种情况,输入将是“A”“B”,其中输入“A”是指对应于 tensor1 的值,“B”是指对应于 tensor2 的值。

输入和输出张量允许的数据类型因模型类型而异。 数据类型部分描述了允许的数据类型以及它们如何映射到每个模型类型的数据类型。

输入形状表示模型和 Triton 在推理请求中期望的输入张量的形状。 输出形状指示模型生成并由 Triton 响应推理请求返回的输出张量的形状。 输入和输出形状都必须具有大于或等于 1 的等级,即不允许空形状 [ ]

输入和输出形状由 max_batch_size 和输入或输出 dims 属性指定的尺寸的组合指定。 对于 max_batch_size 大于 0 的模型,完整形状形成为 [ -1 ] + dims。 对于 max_batch_size 等于 0 的模型,完整形状形成为 dims。 例如,对于以下配置,“input0”的形状是 [-1, 16]“output0”的形状是 [-1, 4]

  platform: "tensorrt_plan"
  max_batch_size: 8
  input [
    {
      name: "input0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]
  output [
    {
      name: "output0"
      data_type: TYPE_FP32
      dims: [ 4 ]
    }
  ]

对于除了 max_batch_size 等于 0 之外相同的配置,“input0”的形状为 [16]“output0”的形状为 [4]

  platform: "tensorrt_plan"
  max_batch_size: 0
  input [
    {
      name: "input0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]
  output [
    {
      name: "output0"
      data_type: TYPE_FP32
      dims: [ 4 ]
    }
  ]

对于支持具有可变大小维度的输入和输出张量的模型,这些维度可以在输入和输出配置中列为 -1。 例如,如果模型需要一个二维输入张量,其中第一个维度的大小必须为 4,而第二个维度可以是任何大小,则该输入的模型配置将包括 dims: [ 4, -1 ]。 然后,Triton 将接受推理请求,其中输入张量的第二维是大于或等于 0 的任何值。模型配置可能比底层模型所允许的更具限制性。 例如,即使框架模型本身允许第二个维度为任意大小,模型配置也可以指定为 dims: [ 4, 4 ]。 在这种情况下,Triton 只会接受输入张量的形状恰好为 [ 4, 4 ] 的推理请求。

如果 Triton 在推理请求中收到的输入形状与模型预期的输入形状不匹配,则必须使用 reshape 属性。 同样,如果模型生成的输出形状与 Triton 在对推理请求的响应中返回的形状不匹配,则必须使用重塑属性。

模型输入可以指定 allow_ragged_batch 以指示输入是参差不齐的输入。 该字段与动态批处理程序一起使用,以允许在不强制输入在所有请求中具有相同形状的情况下进行批处理。

自动生成的模型配置

包含所需设置的模型配置文件必须可用于要在 Triton 上部署的每个模型。 在某些情况下,模型配置的所需部分可以由 Triton 自动生成。 模型配置的必需部分是最小模型配置中显示的设置。 默认情况下,Triton 将尝试完成这些部分。 但是,通过使用 --disable-auto-complete-config 选项启动 Triton,可以将 Triton 配置为不在后端自动完成模型配置。 但是,即使使用此选项,Triton 也会使用默认值填充缺少的 instance_group 设置。

Triton 可以为大多数 TensorRT、TensorFlow 保存模型、ONNX 模型和 OpenVINO 模型自动导出所有必需的设置。 对于 Python 模型,可以在 Python 后端实现 auto_complete_config 函数,以使用 set_max_batch_size、add_input 和 add_output 函数提供 max_batch_size、输入和输出属性。 这些属性将允许 Triton 在没有配置文件的情况下使用最小模型配置加载 Python 模型。 所有其他模型类型必须提供模型配置文件。

开发自定义后端时,您可以在配置中填充所需的设置并调用 TRITONBAACKEND_ModelSetConfig API 以使用 Triton 核心更新已完成的配置。 您可以查看 TensorFlow 和 Onnxruntime 后端作为如何实现此目标的示例。 目前,后端只能填充输入、输出、max_batch_size 和动态批处理设置。 对于自定义后端,您的 config.pbtxt 文件必须包含后端字段,或者您的模型名称必须采用 <model_name>.<backend_name> 格式。

您还可以使用模型配置端点查看 Triton 为模型生成的模型配置。 最简单的方法是使用 curl 之类的实用程序:

$ curl localhost:8000/v2/models/<model name>/config

这将返回生成的模型配置的 JSON 表示。 从这里您可以获取 JSON 的 max_batch_size、输入和输出部分并将其转换为 config.pbtxt 文件。 Triton 仅生成模型配置的最小部分。 您仍然必须通过编辑 config.pbtxt 文件来提供模型配置的可选部分。

默认最大批处理大小和动态批处理程序

当模型使用自动完成功能时,可以使用 --backend-config=default-max-batch-size=<int> 命令行参数设置默认的最大批量大小。 这允许所有能够进行批处理并使用自动生成的模型配置的模型都具有默认的最大批处理大小。 默认情况下,此值设置为 4。 后端开发人员可以通过从 TRITONBACKEND_BackendConfig api 获取它来使用这个 default-max-batch-size。 目前,以下使用这些默认批处理值并在其生成的模型配置中打开动态批处理的后端是:

  1. TensorFlow 后端

  2. Onnxruntime后端

  3. TensorRT 后端

    TensorRT 模型显式存储最大批量大小并且不使用 default-max-batch-size 参数。 但是,如果 max_batch_size > 1 且未提供调度程序,则将启用动态批处理调度程序。

如果为模型设置的最大批量大小的值大于 1,则在配置文件中未提供调度程序的情况下将设置 dynamic_batching 配置。

数据类型

下表显示了 Triton 支持的张量数据类型。 第一列显示模型配置文件中出现的数据类型的名称。 接下来的四列显示了支持的模型框架的相应数据类型。 如果模型框架没有给定数据类型的条目,则 Triton 不支持该模型的该数据类型。 第六列,标记为“API”,显示了 TRITONSERVER C API、TRITONBACKEND C API、HTTP/REST 协议和 GRPC 协议的相应数据类型。 最后一列显示了 Python numpy 库的相应数据类型。

Model Config

TensorRT

TensorFlow

ONNX Runtime

PyTorch

API

NumPy

TYPE_BOOL

kBOOL

DT_BOOL

BOOL

kBool

BOOL

bool

TYPE_UINT8

kUINT8

DT_UINT8

UINT8

kByte

UINT8

uint8

TYPE_UINT16

DT_UINT16

UINT16

UINT16

uint16

TYPE_UINT32

DT_UINT32

UINT32

UINT32

uint32

TYPE_UINT64

DT_UINT64

UINT64

UINT64

uint64

TYPE_INT8

kINT8

DT_INT8

INT8

kChar

INT8

int8

TYPE_INT16

DT_INT16

INT16

kShort

INT16

int16

TYPE_INT32

kINT32

DT_INT32

INT32

kInt

INT32

int32

TYPE_INT64

DT_INT64

INT64

kLong

INT64

int64

TYPE_FP16

kHALF

DT_HALF

FLOAT16

FP16

float16

TYPE_FP32

kFLOAT

DT_FLOAT

FLOAT

kFloat

FP32

float32

TYPE_FP64

DT_DOUBLE

DOUBLE

kDouble

FP64

float64

TYPE_STRING

DT_STRING

STRING

BYTES

dtype(object)

TYPE_BF16

BF16

对于 TensorRT,每个值都在 nvinfer1::DataType 命名空间中。 例如,nvinfer1::DataType::kFLOAT 是 32 位浮点数据类型。

对于 TensorFlow,每个值都在 tensorflow 命名空间中。 例如,tensorflow::DT_FLOAT 是 32 位浮点值。

对于 ONNX 运行时,每个值都带有 ONNX_TENSOR_ELEMENT_DATA_TYPE_ 前缀。 例如,ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT 是 32 位浮点数据类型。

对于 PyTorch,每个值都在 torch 命名空间中。 例如,torch::kFloat 是 32 位浮点数据类型。

对于 Numpy,每个值都在 numpy 模块中。 例如,numpy.float32 是 32 位浮点数据类型。

Reshape

模型配置输入或输出上的 ModelTensorReshape 属性用于指示推理 API 接受的输入或输出形状与底层框架模型或自定义后端预期或生成的输入或输出形状不同。

对于输入,Reshape可用于将输入张量Reshape为框架或后端期望的不同形状。 一个常见的用例是支持批处理的模型期望批处理输入具有形状 [ batch-size ],这意味着批处理维度完全描述了形状。 对于推理 API,必须指定等效形状 [ batch-size, 1 ],因为每个输入都必须指定一个非空的 dims。 对于这种情况,输入应指定为:

  input [
    {
      name: "in"
      dims: [ 1 ]
      reshape: { shape: [ ] }
    }

对于输出,Reshape可用于将框架或后端生成的输出张量Reshape为推理 API 返回的不同形状。 一个常见的用例是支持批处理的模型期望批处理输出具有形状 [batch-size],这意味着批处理维度完全描述了形状。 对于推理 API,必须指定等效形状 [ batch-size, 1 ],因为每个输出都必须指定一个非空的 dims。 对于这种情况,输出应指定为:

  output [
    {
      name: "in"
      dims: [ 1 ]
      reshape: { shape: [ ] }
    }

形状张量

对于支持形状张量的模型,必须为充当形状张量的输入和输出适当设置 is_shape_tensor 属性。 下面显示了指定形状张量的示例配置。

  name: "myshapetensormodel"
  platform: "tensorrt_plan"
  max_batch_size: 8
  input [
    {
      name: "input0"
      data_type: TYPE_FP32
      dims: [ 1 , 3]
    },
    {
      name: "input1"
      data_type: TYPE_INT32
      dims: [ 2 ]
      is_shape_tensor: true
    }
  ]
  output [
    {
      name: "output0"
      data_type: TYPE_FP32
      dims: [ 1 , 3]
    }
  ]

如上所述,Triton 假设批处理沿着输入或输出张量 dims 中未列出的第一个维度发生。 但是,对于形状张量,批处理发生在第一个形状值处。 对于上面的示例,推理请求必须提供具有以下形状的输入。

  "input0": [ x, 1, 3]
  "input1": [ 3 ]
  "output0": [ x, 1, 3]

其中 x 是请求的批量大小。 Triton 要求在使用批处理时将形状张量标记为模型中的形状张量。 请注意,“input1”的形状为 [ 3 ] 而不是 [ 2 ],这是模型配置中描述的方式。 由于 myshapetensormodel 模型是批处理模型,因此批处理大小应作为附加值提供。 在发出模型请求之前,Triton 将在批量维度中为“input1”累积所有形状值。

例如,假设客户端使用以下输入向 Triton 发送以下三个请求:

Request1:
input0: [[[1,2,3]]] <== shape of this tensor [1,1,3]
input1: [1,4,6] <== shape of this tensor [3]

Request2:
input0: [[[4,5,6]], [[7,8,9]]] <== shape of this tensor [2,1,3]
input1: [2,4,6] <== shape of this tensor [3]

Request3:
input0: [[[10,11,12]]] <== shape of this tensor [1,1,3]
input1: [1,4,6] <== shape of this tensor [3]

假设这些请求被一起批处理,将被传递给模型:

Batched Requests to model:
input0: [[[1,2,3]], [[4,5,6]], [[7,8,9]], [[10,11,12]]] <== shape of this tensor [4,1,3]
input1: [4, 4, 6] <== shape of this tensor [3]

目前,只有 TensorRT 支持形状张量。 阅读形状张量 I/O 以了解有关形状张量的更多信息。

版本策略

每个模型可以有一个或多个版本。 模型配置的 ModelVersionPolicy 属性用于设置以下策略之一。

  • All:模型存储库中可用的所有模型版本都可用于推理。 version_policy: { all: {}}

  • Latest:只有存储库中模型的最新“n”版本可用于推理。 该模型的最新版本是数字上最大的版本号。 version_policy:{Latest:{num_versions:2}}

  • Specific:仅特定列出的模型版本可用于推理。 version_policy:{Specific:{versions:[1,3]}}

如果未指定版本策略,则默认使用 Latest(n=1),表示 Triton 仅提供模型的最新版本。 在所有情况下,从模型存储库中添加或删除版本子目录都可以更改在后续推理请求中使用的模型版本。

以下配置指定模型的所有版本都可以从服务器获得。

  platform: "tensorrt_plan"
  max_batch_size: 8
  input [
    {
      name: "input0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    },
    {
      name: "input1"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]
  output [
    {
      name: "output0"
      data_type: TYPE_FP32
      dims: [ 16 ]
    }
  ]
  version_policy: { all { }}

实例组

Triton 可以提供模型的多个实例,以便可以同时处理对该模型的多个推理请求。 模型配置 ModelInstanceGroup 属性用于指定应该可用的执行实例的数量以及应该为这些实例使用什么计算资源。

多个模型实例

默认情况下,为系统中可用的每个 GPU 创建模型的单个执行实例。 实例组设置可用于将模型的多个执行实例放置在每个 GPU 上或仅放置在某些 GPU 上。 例如,以下配置会将模型的两个执行实例放置在每个系统 GPU 上可用。

  instance_group [
    {
      count: 2
      kind: KIND_GPU
    }
  ]

并且以下配置将在 GPU 0 上放置一个执行实例,在 GPU 1 和 2 上放置两个执行实例。

  instance_group [
    {
      count: 1
      kind: KIND_GPU
      gpus: [ 0 ]
    },
    {
      count: 2
      kind: KIND_GPU
      gpus: [ 1, 2 ]
    }
  ]

有关使用实例组的更详细示例,请参阅本指南。

CPU型号实例

实例组设置还用于启用在 CPU 上执行模型。 即使系统中有可用的 GPU,模型也可以在 CPU 上执行。 下面将两个执行实例放在 CPU 上。

  instance_group [
    {
      count: 2
      kind: KIND_CPU
    }
  ]

如果没有为 KIND_CPU 实例组指定计数,则所选后端(Tensorflow 和 Onnxruntime)的默认实例计数将为 2。 所有其他后端将默认为 1。

主机策略

实例组设置与主机策略相关联。 以下配置会将实例组设置创建的所有实例与主机策略“policy_0”相关联。 默认情况下,主机策略将根据实例的设备类型进行设置,例如,KIND_CPU 是“cpu”,KIND_MODEL 是“model”,KIND_GPU 是“gpu_<gpu_id>”

  instance_group [
    {
      count: 2
      kind: KIND_CPU
      host_policy: "policy_0"
    }
  ]

速率限制器配置

实例组可以选择指定速率限制器配置,该配置控制速率限制器如何在组中的实例上运行。 如果速率限制关闭,则忽略速率限制器配置。 如果启用了速率限制并且 instance_group 不提供此配置,则属于该组的模型实例的执行将不会以任何方式受到速率限制器的限制。 配置包括以下规格:

资源

执行模型实例所需的资源集。 “name”字段标识资源,“count”字段是指组中的模型实例需要运行的资源副本数。 “全局”字段指定资源是按设备还是在系统中全局共享。 加载的模型不能指定与全局和非全局同名的资源。 如果没有提供资源,那么 triton 会假设模型实例的执行不需要任何资源,并且会在模型实例可用时立即开始执行。

优先事项

优先级用作权重值,用于对所有模型的所有实例进行优先级排序。 优先级为 2 的实例将获得优先级为 1 的实例的 1/2 调度机会。

以下示例指定组中的实例需要四个“R1”和两个“R2”资源才能执行。 资源“R2”是全局资源。 此外,instance_group 的限速器优先级为 2。

  instance_group [
    {
      count: 1
      kind: KIND_GPU
      gpus: [ 0, 1, 2 ]
      rate_limiter {
        resources [
          {
            name: "R1"
            count: 4
          },
          {
            name: "R2"
            global: True
            count: 2
          }
        ]
        priority: 2
      }
    }
  ]

上面的配置创建了 3 个模型实例,每个设备一个(0、1 和 2)。 这三个实例之间不会争用“R1”,因为“R1”对于它们自己的设备是本地的,但是,它们将争用“R2”,因为它被指定为全局资源,这意味着“R2”在整个系统中共享 . 尽管这些实例不会在它们之间竞争“R1”,但它们会与其他模型实例竞争“R1”,这些模型实例在其资源需求中包含“R1”并与它们在同一设备上运行。

集成模型实例组

集成模型是 Triton 用于执行用户定义的模型管道的抽象。 由于没有与集成模型关联的物理实例,因此无法为其指定 instance_group 字段。

但是,构成集成的每个组合模型都可以在其配置文件中指定 instance_group,并在集成接收到多个请求时单独支持并行执行,如上所述。

CUDA计算能力

与 default_model_filename 字段类似,您可以选择指定 cc_model_filenames 字段以在模型加载时将 GPU 的 CUDA 计算能力映射到相应的模型文件名。 这对于 TensorRT 模型特别有用,因为它们通常与特定的计算能力相关联。

cc_model_filenames [
  {
    key: "7.5"
    value: "resnet50_T4.plan"
  },
  {
    key: "8.0"
    value: "resnet50_A100.plan"
  }
]

调度和批处理

Triton 通过允许单个推理请求指定一批输入来支持批量推理。 对一批输入的推理是同时执行的,这对 GPU 尤为重要,因为它可以大大提高推理吞吐量。 在许多用例中,单个推理请求未进行批处理,因此,它们无法从批处理的吞吐量优势中获益。

推理服务器包含多种调度和批处理算法,支持许多不同的模型类型和用例。 有关模型类型和调度程序的更多信息,请参阅模型和调度程序。

默认调度程序

如果在模型配置中未指定任何 scheduling_choice 属性,则默认调度程序用于模型。 默认调度程序只是将推理请求分发到为模型配置的所有模型实例。

动态批处理器

动态批处理是 Triton 的一项功能,它允许服务器组合推理请求,以便动态创建批处理。 创建一批请求通常会导致吞吐量增加。 动态批处理程序应用于无状态模型。 动态创建的批次分发到为模型配置的所有模型实例。

使用模型配置中的 ModelDynamicBatching 属性为每个模型独立启用和配置动态批处理。 这些设置控制动态创建批处理的首选大小、请求在调度程序中可以延迟以允许其他请求加入动态批处理的最长时间,以及队列属性(例如队列大小、优先级和超时) . 有关动态批处理的更详细示例,请参阅本指南。

推荐配置流程

下面详细描述了各个设置。 以下步骤是为每个模型调整动态批处理程序的推荐过程。 还可以使用模型分析器自动搜索不同的动态批处理程序配置。

  • 确定模型的最大批量大小。

  • 将以下内容添加到模型配置中以启用具有所有默认设置的动态批处理程序。 默认情况下,动态批处理程序将创建尽可能大的批次,直至达到最大批次大小,并且在形成批次时不会延迟。

      dynamic_batching { }
    
  • 使用性能分析器确定默认动态批处理程序配置提供的延迟和吞吐量。

  • 如果默认配置导致延迟值在您的延迟预算内,请尝试以下一项或两项操作来权衡增加的延迟以增加吞吐量:

    • 增加最大批量大小。

    • 将批处理延迟设置为非零值。 尝试增加延迟值,直到超过延迟预算以查看对吞吐量的影响。

  • 大多数模型不应使用首选批量大小。 仅当该批次大小导致的性能明显高于其他批次大小时,才应配置首选批次大小。

首选批量大小

preferred_batch_size 属性指示动态批处理程序应尝试创建的批处理大小。 对于大多数模型,不应指定 preferred_batch_size,如推荐配置过程中所述。 一个例外是为不同批量大小指定多个优化配置文件的 TensorRT 模型。 在这种情况下,由于某些优化配置文件可能会比其他优化配置文件提供显着的性能改进,因此使用 preferred_batch_size 来表示那些更高性能的优化配置文件支持的批处理大小可能是有意义的。

以下示例显示了启用首选批大小为 4 和 8 的动态批处理的配置。

  dynamic_batching {
    preferred_batch_size: [ 4, 8 ]
  }

当模型实例可用于推理时,动态批处理程序将尝试根据调度程序中可用的请求创建批处理。 按照收到请求的顺序将请求添加到批处理中。 如果动态批处理程序可以形成一个首选大小的批次,它将创建一个最大可能的首选大小的批次并将其发送以进行推理。 如果动态批处理程序无法形成首选大小的批次(或者如果动态批处理程序未配置任何首选批处理大小),它将发送一个可能小于模型允许的最大批处理大小的最大大小的批处理 (但请参阅下一节以了解更改此行为的延迟选项)。

生成的批次的大小可以使用计数指标进行聚合检查。

延迟批处理

动态批处理程序可以配置为允许请求在调度程序中延迟有限的时间,以允许其他请求加入动态批处理。 例如,以下配置为请求设置了最大延迟时间 100 微秒。

  dynamic_batching {
    max_queue_delay_microseconds: 100
  }

当无法创建最大大小(或首选大小)批处理时,max_queue_delay_microseconds 属性设置会更改动态批处理程序行为。 当无法从可用请求创建最大或首选大小的批处理时,只要没有请求延迟超过配置的 max_queue_delay_microseconds 值,动态批处理程序就会延迟发送批处理。 如果新请求在此延迟期间到达并允许动态批处理程序形成最大或首选批处理大小的批处理,则立即发送该批处理以进行推理。 如果延迟到期,动态批处理程序将按原样发送批处理,即使它不是最大或首选大小。

保留顺序

preserve_ordering 属性用于强制所有响应以与收到请求相同的顺序返回。 有关详细信息,请参阅 protobuf 文档。

优先级

默认情况下,动态批处理程序维护一个队列,其中包含模型的所有推理请求。 请求按顺序处理和批处理。 priority_levels 属性可用于在动态批处理程序中创建多个优先级,以便允许具有较高优先级的请求绕过具有较低优先级的请求。 优先级相同的请求按顺序处理。 未设置优先级的推理请求使用 default_priority_level 属性进行调度。

队列策略

动态批处理程序提供了几个设置来控制请求如何排队等待批处理。

当未定义 priority_levels 时,可以使用 default_queue_policy 设置单个队列的 ModelQueuePolicy。 当定义了 priority_levels 时,每个优先级都可以有不同的 ModelQueuePolicy,由 default_queue_policy 和 priority_queue_policy 指定。

ModelQueuePolicy 属性允许使用 max_queue_size 设置最大队列大小。 timeout_action、default_timeout_microseconds 和 allow_timeout_override 设置允许配置队列,以便在队列中的时间超过指定超时时拒绝或推迟单个请求。

自定义批处理

除了动态批处理程序的指定行为之外,您还可以设置自定义批处理规则。 为此,您将在 tritonbackend.h 中实现五个函数并创建一个共享库。 这些功能如下所述。

Function

Description

TRITONBACKEND_ModelBatchIncludeRequest

Determines whether a request should be included in the current batch

TRITONBACKEND_ModelBatchInitialize

Initializes a record-keeping data structure for a new batch

TRITONBACKEND_ModelBatchFinalize

Deallocates the record-keeping data structure after a batch is formed

TRITONBACKEND_ModelBatcherInitialize

Initializes a read-only data structure for use with all batches

TRITONBACKEND_ModelBatcherFinalize

Deallocates the read-only data structure after the model is unloaded

共享库的路径可以通过参数 TRITON_BATCH_STRATEGY_PATH 传递到模型配置中。 如果未提供,动态批处理程序将在模型版本、模型和后端目录中按顺序查找名为 batchstrategy.so 的自定义批处理策略。 如果找到,它将加载它。 这使您可以轻松地在使用相同后端的所有模型之间共享自定义批处理策略。

有关如何创建和使用自定义批处理库的教程,请参阅后端示例目录。

序列批处理程序

与动态批处理程序一样,序列批处理程序结合了非批处理推理请求,以便动态创建批处理。 与动态批处理程序不同,序列批处理程序应用于有状态模型,其中一系列推理请求必须路由到同一模型实例。 动态创建的批次分发到为模型配置的所有模型实例。

使用模型配置中的 ModelSequenceBatching 属性为每个模型独立启用和配置序列批处理。 这些设置控制序列超时以及配置 Triton 将如何向模型发送控制信号以指示序列开始、结束、就绪和相关 ID。 有关更多信息和示例,请参阅有状态模型。

集成调度器

集成调度程序必须用于集成模型,不能用于任何其他类型的模型。

使用模型配置中的 ModelEnsembleScheduling 属性为每个模型独立启用和配置集成调度程序。 这些设置描述了集成中包含的模型以及模型之间张量值的流动。 有关更多信息和示例,请参阅集成模型。

优化策略

模型配置 ModelOptimizationPolicy 属性用于指定模型的优化和优先级设置。 这些设置控制后端是否/如何优化模型以及 Triton 如何调度和执行模型。 有关当前可用的设置,请参阅 ModelConfig protobuf 和优化文档。

模型预热

当 Triton 加载模型时,相应的后端会为该模型初始化。 对于某些后端,此初始化的部分或全部被推迟,直到模型收到其第一个推理请求(或前几个推理请求)。 因此,由于延迟初始化,第一个(少数)推理请求可能会显着变慢。

为了避免这些初始的、缓慢的推理请求,Triton 提供了一个配置选项,使模型能够“预热”,以便在收到第一个推理请求之前完全初始化。 当模型配置中定义了 ModelWarmup 属性时,Triton 将不会显示模型准备好进行推理,直到模型预热完成。

模型配置 ModelWarmup 用于指定模型的预热设置。 这些设置定义了一系列推理请求,Triton 将创建这些请求来预热每个模型实例。 模型实例只有在成功完成请求后才会被提供。 请注意,预热模型的效果因框架后端而异,并且会导致 Triton 对模型更新的响应较慢,因此用户应该试验并选择适合自己需要的配置。 有关当前可用设置的 ModelWarmup protobuf 文档,以及有关指定不同预热样本变体的示例,请参阅 L0_warmup。

响应缓存

模型配置 response_cache 部分有一个启用布尔值,用于为此模型启用响应缓存。

response_cache {
  enable: true
}

除了在模型配置中启用缓存之外,启动服务器时还必须指定 --cache-config 以在服务器端启用缓存。 有关启用服务器端缓存的更多详细信息,请参阅响应缓存文档。

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

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

相关文章

用CSS3实现边框流动,让你的网页更有创意和个性

前言 边框流动动画是一种非常常见的效果&#xff0c;能够让网页看起来更加生动有趣。通过使用 CSS3&#xff0c;我们可以轻松地实现这种动画效果。本文将介绍如何使用 CSS3 实现边框流动效果&#xff0c;下面一起来看看吧。 实现效果 实现思路 首先我们先创建一个盒子容器&…

ENVI软件的地表温度(LST)反演教程

前言 遥感图像处理平台&#xff08;The Environment for Visualizing Images&#xff09;的软件处理技术覆盖图像数据的输入/输出、图像定标、图像增强、纠正、正射校正、镶嵌、数据融合以及各种变换、信息提取、图像分类、基于知识的决策树分类、与GIS的整合、DEM及地形信息提…

【FPGA入门】第四篇、有限状态机

目录 第一部分、一个关于有限状态机的例子 第二部分、学会有限状态机的准备知识 1、什么是有限状态机&#xff1f; 2、为什么需要状态机&#xff1f; 3、什么是竞争冒险&#xff1f; 3.1、什么情况下会发生竞争冒险&#xff1f; 3.2、为什么组合逻辑电路会产生竞争和冒险…

HBase入门(一)

第1章 HBase简介 1.1 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1.2 HBase数据模型 逻辑上&#xff0c;HBase的数据模型同关系型数据库很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从HBase的底层物理存储结构&#xff08;…

【C语言复习】第四篇、有关C语言数据类型的知识

目录 第一部分、前言 第二部分、初识数据类型 1、C语言为啥要这么多的数据类型&#xff1f; 2、表格中所占内存的大小是如何计算得到的&#xff1f; 2.1、计算机的内数据存储单位 2.2、关键字sizeof的使用说明&#xff08;具体后面会更详细的解释&#xff09; 3、为什么…

【Python 随练】求最大公约数和最小公倍数

题目&#xff1a; 输入两个正整数 m 和 n&#xff0c;求其最大公约数和最小公倍数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个常见的数学问题&#xff1a;求两个正整数的最大公约数和最小公倍数。我们将提供问题的解析&#xff0c;并给出一个完整的代码示例…

【新星计划Linux】——Linux介绍与了解Linux与Windows系统区别

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.Linux系统 1.Linux系统与Windows系统的区别 &#xff08;1&#xff09;性…

【JavaScript】ES6新特性(4)

14. Proxy 代理 Proxy 可以对目标对象的读取、函数调用等操作进行拦截&#xff0c;然后进行操作处理 它不直接操作对象&#xff0c;而是像代理模式&#xff0c;通过对象的代理对象进行操作&#xff0c;在进行这些操作时&#xff0c;可以添加一些需要的额外操作 14.1 Object.d…

2023年DAMA-CDGA/CDGP数据治理工程师认证这里报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

追梅西的少年

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了头条《鼠头和鸭脖——中心化验真的困境》&#xff0c;以及次条《内参&#xff1a;美SEC执法主管表示&#xff0c;DeFi是纯粹的欺诈&#xff01;&#xff1f;&#xff1f;》&#xff0c;欢迎关注…

云安全技术(六)之云架构模型

云架构模型 1.1 舍伍德业务应用安全架构(SABSA) 舍伍德业务应用安全架构(Sherwood Applied Business Security Architecture&#xff0c;SABSA)的官方网站是 。SABSA提供了一组组件&#xff0c;这些组件可部分或全部用作任何系统的安全架构方www.sabsa.org法。如下&#xff1a…

【Flutter】Flutter中如何获取子类Widget并调用它的方法

文章目录 一、前言二、理解 Flutter 中的 Widget三、如何在 Flutter 中获取子类 Widget1. 使用 GlobalKey2. 使用 context.findAncestorWidgetOfExactType 四、如何调用子类 Widget 的方法五、如何在 Flutter 中传递数据六、总结 一、前言 如果你想深入学习 Flutter&#xff0…

如何打造优秀Web3产品

近日&#xff0c;我们采访了Mysten Labs的联合创始人兼首席执行官Evan Cheng&#xff0c;探讨了Web3技术对消费者的价值、Web3行业应该如何更好地自我诠释&#xff0c;以及它对产品开发的影响。 您曾谈到Web3作为一种所有权实验&#xff0c;这种新技术可能会改变消费者的行为。…

Can’t connect to MySql server on ‘localhost’(10038)

一般是一下几个原因&#xff1a; 1、MySQL服务没有启动 2、用户没有权限使用远程连接 3、linux中防火墙中没有配置MySQL端口&#xff08;3306&#xff09; 使用命令service mysqld status 或者service mysql status 命令来查看mysql的启动状态 启动MySQL命令&#xff1a; …

±0.1℃精度、超低功耗的高精度数字模拟混合信号温度传感芯片

温度芯片感温原理基于CMOS半导体PN节温度与带隙电压的特性关系&#xff0c;经过小信号放大、模数转换数字校准补偿后&#xff0c;数字总线输出&#xff0c;具有精度高、一致性好、测温快、功耗低、可编程配置灵活、寿命长等优点。 温度芯片内置16-bit ADC&#xff0c;分辨率0.…

用代码生撸qsort函数来实现冒泡排序

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造…

Windows 系统彻底卸载 SQL Server 通用方法

Windows 系统彻底卸载 SQL Server 通用方法 无论什么时候&#xff0c;SQL Server 的安装和卸载都是一件让我们头疼的事情。因为不管是 SQL Server 还是 MySQL 的数据库&#xff0c;当我们在使用数据库时因为未知原因出现问题&#xff0c;想要卸载重装时&#xff0c;如果数据库…

Jetson Xavier NX 备份与烧录固态系统

目录 1 需要的硬件 2 需要安装在ubuntu上的软件 2.1 安装gparted 2.2 安装nvidia官方烧录包 2.2.1 下载 2.2.2 配置 3 备份系统 4 烧入系统 1 需要的硬件 像是 nx&#xff0c;nx附带的固态硬盘&#xff0c;显示器 这些就赘述了 一个ubuntu实体机(虚拟机听说…

ansible-roles模块

roles用于层次性&#xff0c;结构化地组织playbook&#xff0c;roles能够根据层次型结构自动装载变量文件&#xff0c;tasks以及handlers等。要使用只要载playbook中使用include指令引入即可。 &#xff08;roles就是通过分别将变量&#xff0c;文件&#xff0c;任务&#xff…

u盘中毒文件夹数据丢失怎么恢复?这里有4个恢复方案

您是否曾经遇到过U盘中毒的情况&#xff1f;连累到文件夹内的数据文件消失了&#xff0c;如果丢失的是重要数据&#xff0c;这或许会对我们工作或学习带来了极大的困扰。为了解决您的困扰&#xff0c;下面将根据不同情况给予不同的U盘中毒数据恢复方案&#xff0c;帮助您尽快找…