• 文件 >
  • 使用 TorchServe 進行批次推論
捷徑

使用 TorchServe 進行批次推論

本文內容

簡介

批次推論是一種彙總推論請求,並將此彙總請求一次性透過 ML/DL 架構進行推論的過程。 TorchServe 的設計本來就支援對傳入的推論請求進行批次處理。 此功能可讓您最佳地使用主機資源,因為大多數 ML/DL 架構都針對批次請求進行了最佳化。 最佳使用主機資源,反過來可以降低使用 TorchServe 託管推論服務的營運成本。

在本文中,我們展示了如何在本地或使用 Docker 容器提供模型服務時,在 TorchServe 中使用批次推論的範例。

先決條件

在開始閱讀本文之前,請閱讀以下文件

  1. 什麼是 TorchServe?

  2. 什麼是自訂服務程式碼?

使用 TorchServe 預設處理器進行批次推論

TorchServe 的預設處理器支援開箱即用的批次推論,除了 text_classifier 處理器。

使用 TorchServe 搭配 ResNet-152 模型進行批次推論

為了支援批次推論,TorchServe 需要以下

  1. TorchServe 模型設定:使用 "POST /models" 管理 API 或 config.properties 中的設定來設定 batch_sizemax_batch_delay。 TorchServe 需要知道模型可以處理的最大批次大小,以及 TorchServe 應該等待多長時間來填滿每個批次請求。

  2. 模型處理器程式碼:TorchServe 需要模型處理器來處理批次推論請求。

有關具有批次處理的自訂模型處理器的完整工作範例,請參閱 Hugging face transformer generalized handler

TorchServe 模型設定

從 Torchserve 0.4.1 開始,有兩種方法可以設定 TorchServe 以使用批次處理功能

  1. 透過 POST /models API 提供批次設定資訊。

  2. 透過設定檔 config.properties 提供批次設定資訊。

我們感興趣的設定屬性如下

  1. batch_size:這是模型預期可以處理的最大批次大小。

  2. max_batch_delay:這是 TorchServe 等待接收 batch_size 數量的請求的最大批次延遲時間,單位為 ms 毫秒。如果 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 將批次相關配置與每個模型關聯。前端會嘗試聚合 batch-size 數量的請求,並將其發送到後端。

示範如何配置具有批次支援模型的 TorchServe ResNet-152 模型

在本節中,我們將啟動模型伺服器並啟動 Resnet-152 模型,該模型使用預設的 image_classifier 處理程序進行批次推論。

設定 TorchServe 和 Torch Model Archiver

首先,請依照主要的 Readme 並安裝所有必需的套件,包括 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 個 worker,該 worker 處理 batch size 為 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..."
}
  • 驗證 worker 是否已正確啟動。

curl https://127.0.0.1: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 https://127.0.0.1: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"
}
  • 驗證 worker 是否已正確啟動。

curl https://127.0.0.1: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 https://127.0.0.1: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_delay,這與上一節類似,由 dockerd_entrypoint.sh 使用。

使用 docker 容器的 Resnet-152 批次推論

  • 在 config.properties 中設定批次 batch_sizemax_batch_delay,如 dockerd_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
  • 驗證 worker 是否已正確啟動。

curl https://127.0.0.1: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 https://127.0.0.1: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 的完整開發人員文件

檢視文件

教學課程

取得針對初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並取得您的問題解答

檢視資源