• 文档 >
  • 使用 TorchServe 进行批量推理
快捷方式

使用 TorchServe 进行批量推理

本文档内容

简介

批量推理是一个聚合推理请求并将此聚合请求通过 ML/DL 框架一次性进行推理的过程。TorchServe 旨在原生支持传入推理请求的批处理。此功能使您可以最佳地利用主机资源,因为大多数 ML/DL 框架都针对批处理请求进行了优化。这种对主机资源的最佳利用反过来降低了使用 TorchServe 托管推理服务的运营成本。

在本文档中,我们展示了在本地或使用 Docker 容器提供模型服务时如何在 Torchserve 中使用批量推理的示例。

先决条件

在深入了解本文档之前,请阅读以下文档

  1. 什么是 TorchServe?

  2. 什么是自定义服务代码?

使用 TorchServe 的默认处理器进行批量推理

除了 text_classifier 处理器之外,TorchServe 的默认处理器都开箱即用地支持批量推理。

使用 TorchServe 和 ResNet-152 模型进行批量推理

为了支持批量推理,TorchServe 需要以下内容

  1. TorchServe 模型配置:通过使用“POST /models”管理 API 或 config.properties 中的设置来配置 batch_sizemax_batch_delay。TorchServe 需要知道模型可以处理的最大批处理大小以及 TorchServe 应等待填充每个批处理请求的最长时间。

  2. 模型处理器代码:TorchServe 需要模型处理器来处理批量推理请求。

有关包含批处理的自定义模型处理器的完整工作示例,请参阅 Hugging Face 变压器通用处理器

TorchServe 模型配置

从 Torchserve 0.4.1 开始,有两种方法可以配置 TorchServe 以使用批处理功能

  1. 通过 POST /models API 提供批处理配置信息。

  2. 通过配置文件 config.properties 提供批处理配置信息。

我们感兴趣的配置属性如下

  1. batch_size:这是模型预计处理的最大批处理大小。

  2. max_batch_delay:这是以 ms 为单位的最大批处理延迟时间,TorchServe 等待接收 batch_size 个请求。如果 TorchServe 在此计时器超时之前未收到 batch_size 个请求,则它将接收到的所有请求发送到模型 handler

让我们看看一个通过管理 API 使用此配置的示例

# The following command will register a model "resnet-152.mar" and configure TorchServe to use a batch_size of 8 and a max batch delay of 50 milliseconds.
curl -X POST "localhost:8081/models?url=resnet-152.mar&batch_size=8&max_batch_delay=50"

以下是如何通过 config.properties 使用此配置的示例

# The following command will register a model "resnet-152.mar" and configure TorchServe to use a batch_size of 8 and a max batch delay of 50 milli seconds, in the config.properties.

models={\
  "resnet-152": {\
    "1.0": {\
        "defaultVersion": true,\
        "marName": "resnet-152.mar",\
        "minWorkers": 1,\
        "maxWorkers": 1,\
        "batchSize": 8,\
        "maxBatchDelay": 50,\
        "responseTimeout": 120\
    }\
  }\
}

这些配置在 TorchServe 和模型的自定义服务代码(也称为处理器代码)中都使用。TorchServe 将批处理相关的配置与每个模型关联。然后,前端尝试聚合批处理大小的请求并将其发送到后端。

配置支持批处理的 TorchServe ResNet-152 模型的演示

在本节中,让我们启动模型服务器并启动 Resnet-152 模型,该模型使用默认的 image_classifier 处理器进行批量推理。

设置 TorchServe 和 Torch 模型归档器

首先,请遵循主要 自述文件 并安装所有必需的软件包,包括 torchserve

使用管理 API 配置的 ResNet-152 的批量推理

  • 启动模型服务器。在此示例中,我们正在启动模型服务器以在推理端口 8080 和管理端口 8081 上运行。

$ cat config.properties
...
inference_address=http://127.0.0.1:8080
management_address=http://127.0.0.1:8081
...
$ torchserve --start --model-store model_store
  • 验证 TorchServe 是否已启动并正在运行

$ curl localhost:8080/ping
{
  "status": "Healthy"
}
  • 现在让我们启动 resnet-152 模型,我们已将其构建为处理批量推理。由于这是一个示例,我们将启动 1 个工作程序,该工作程序处理批处理大小为 3 且 max_batch_delay 为 10 毫秒的批处理。

$ curl -X POST "localhost:8081/models?url=https://torchserve.pytorch.org/mar_files/resnet-152-batch_v2.mar&batch_size=3&max_batch_delay=10&initial_workers=1"
{
  "status": "Processing worker updates..."
}
  • 验证工作程序是否已正确启动。

curl http://localhost:8081/models/resnet-152-batch_v2
[
  {
    "modelName": "resnet-152-batch_v2",
    "modelVersion": "2.0",
    "modelUrl": "https://torchserve.pytorch.org/mar_files/resnet-152-batch_v2.mar",
    "runtime": "python",
    "minWorkers": 1,
    "maxWorkers": 1,
    "batchSize": 3,
    "maxBatchDelay": 10,
    "loadedAtStartup": false,
    "workers": [
      {
        "id": "9000",
        "startTime": "2021-06-14T23:18:21.793Z",
        "status": "READY",
        "memoryUsage": 1726554112,
        "pid": 19946,
        "gpu": true,
        "gpuUsage": "gpuId::0 utilization.gpu [%]::0 % utilization.memory [%]::0 % memory.used [MiB]::678 MiB"
      }
    ]
  }
]
  • 现在让我们测试此服务。

    • 获取要测试此服务的图像

      $ curl -LJO https://github.com/pytorch/serve/raw/master/examples/image_classifier/kitten.jpg
      
    • 运行推理以测试模型。

        $ curl http://localhost:8080/predictions/resnet-152-batch_v2 -T kitten.jpg
        {
            "tiger_cat": 0.5798614621162415,
            "tabby": 0.38344162702560425,
            "Egyptian_cat": 0.0342114195227623,
            "lynx": 0.0005819813231937587,
            "quilt": 0.000273319921689108
        }
      

通过 config.properties 配置的 ResNet-152 的批量推理

  • 在这里,我们首先在 config.properties 中设置 batch_sizemax_batch_delay,确保 mar 文件位于 model-store 中,并且 models 设置中的版本与创建的 mar 文件的版本一致。有关配置的更多信息,请参阅此 文档

load_models=resnet-152-batch_v2.mar
models={\
  "resnet-152-batch_v2": {\
    "2.0": {\
        "defaultVersion": true,\
        "marName": "resnet-152-batch_v2.mar",\
        "minWorkers": 1,\
        "maxWorkers": 1,\
        "batchSize": 3,\
        "maxBatchDelay": 5000,\
        "responseTimeout": 120\
    }\
  }\
}
  • 然后,我们将通过使用 --ts-config 标志传递 config.properties 来启动 Torchserve

torchserve --start --model-store model_store  --ts-config config.properties
  • 验证 TorchServe 是否已启动并正在运行

$ curl localhost:8080/ping
{
  "status": "Healthy"
}
  • 验证工作程序是否已正确启动。

curl http://localhost:8081/models/resnet-152-batch_v2
[
  {
    "modelName": "resnet-152-batch_v2",
    "modelVersion": "2.0",
    "modelUrl": "resnet-152-batch_v2.mar",
    "runtime": "python",
    "minWorkers": 1,
    "maxWorkers": 1,
    "batchSize": 3,
    "maxBatchDelay": 5000,
    "loadedAtStartup": true,
    "workers": [
      {
        "id": "9000",
        "startTime": "2021-06-14T22:44:36.742Z",
        "status": "READY",
        "memoryUsage": 0,
        "pid": 19116,
        "gpu": true,
        "gpuUsage": "gpuId::0 utilization.gpu [%]::0 % utilization.memory [%]::0 % memory.used [MiB]::678 MiB"
      }
    ]
  }
]
  • 现在让我们测试此服务。

    • 获取要测试此服务的图像

      $ curl -LJO https://github.com/pytorch/serve/raw/master/examples/image_classifier/kitten.jpg
      
    • 运行推理以测试模型。

        $ curl http://localhost:8080/predictions/resnet-152-batch_v2 -T kitten.jpg
        {
            "tiger_cat": 0.5798614621162415,
            "tabby": 0.38344162702560425,
            "Egyptian_cat": 0.0342114195227623,
            "lynx": 0.0005819813231937587,
            "quilt": 0.000273319921689108
        }
      

使用 Docker 配置支持批处理的 TorchServe ResNet-152 模型的演示

在这里,我们展示了在使用 Docker 容器提供模型服务时如何注册具有批量推理支持的模型。我们类似于上一节在 config.properties 中设置 batch_sizemax_batch_delaydockered_entrypoint.sh 使用此文件。

使用 Docker 容器的 ResNet-152 的批量推理

  • 在 config.properties 中设置批处理 batch_sizemax_batch_delay,如 dockered_entrypoint.sh 中所引用。

inference_address=http://127.0.0.1:8080
management_address=http://127.0.0.1:8081
metrics_address=http://127.0.0.1:8082
number_of_netty_threads=32
job_queue_size=1000
model_store=/home/model-server/model-store
load_models=resnet-152-batch_v2.mar
models={\
  "resnet-152-batch_v2": {\
    "1.0": {\
        "defaultVersion": true,\
        "marName": "resnet-152-batch_v2.mar",\
        "minWorkers": 1,\
        "maxWorkers": 1,\
        "batchSize": 3,\
        "maxBatchDelay": 100,\
        "responseTimeout": 120\
    }\
  }\
}
  • 此处 构建目标 Docker 镜像,这里我们使用 gpu 镜像

./build_image.sh -g -cv cu102
  • 使用容器启动模型服务并将 config.properties 传递给容器

 docker run --rm -it --gpus all -p 127.0.0.1:8080:8080 -p 127.0.0.1:8081:8081 --name mar -v /home/ubuntu/serve/model_store:/home/model-server/model-store  -v $ path to config.properties:/home/model-server/config.properties  pytorch/torchserve:latest-gpu
  • 验证工作程序是否已正确启动。

curl http://localhost:8081/models/resnet-152-batch_v2
[
  {
    "modelName": "resnet-152-batch_v2",
    "modelVersion": "2.0",
    "modelUrl": "resnet-152-batch_v2.mar",
    "runtime": "python",
    "minWorkers": 1,
    "maxWorkers": 1,
    "batchSize": 3,
    "maxBatchDelay": 5000,
    "loadedAtStartup": true,
    "workers": [
      {
        "id": "9000",
        "startTime": "2021-06-14T22:44:36.742Z",
        "status": "READY",
        "memoryUsage": 0,
        "pid": 19116,
        "gpu": true,
        "gpuUsage": "gpuId::0 utilization.gpu [%]::0 % utilization.memory [%]::0 % memory.used [MiB]::678 MiB"
      }
    ]
  }
]
  • 现在让我们测试此服务。

    • 获取要测试此服务的图像

      $ curl -LJO https://github.com/pytorch/serve/raw/master/examples/image_classifier/kitten.jpg
      
    • 运行推理以测试模型。

        $ curl http://localhost:8080/predictions/resnet-152-batch_v2 -T kitten.jpg
        {
            "tiger_cat": 0.5798614621162415,
            "tabby": 0.38344162702560425,
            "Egyptian_cat": 0.0342114195227623,
            "lynx": 0.0005819813231937587,
            "quilt": 0.000273319921689108
        }
      

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源