使用 TorchServe 進行批次推論¶
本文內容¶
簡介¶
批次推論是一種彙總推論請求,並將此彙總請求一次性透過 ML/DL 架構進行推論的過程。 TorchServe 的設計本來就支援對傳入的推論請求進行批次處理。 此功能可讓您最佳地使用主機資源,因為大多數 ML/DL 架構都針對批次請求進行了最佳化。 最佳使用主機資源,反過來可以降低使用 TorchServe 託管推論服務的營運成本。
在本文中,我們展示了如何在本地或使用 Docker 容器提供模型服務時,在 TorchServe 中使用批次推論的範例。
先決條件¶
在開始閱讀本文之前,請閱讀以下文件
使用 TorchServe 預設處理器進行批次推論¶
TorchServe 的預設處理器支援開箱即用的批次推論,除了 text_classifier
處理器。
使用 TorchServe 搭配 ResNet-152 模型進行批次推論¶
為了支援批次推論,TorchServe 需要以下
TorchServe 模型設定:使用 "POST /models" 管理 API 或 config.properties 中的設定來設定
batch_size
和max_batch_delay
。 TorchServe 需要知道模型可以處理的最大批次大小,以及 TorchServe 應該等待多長時間來填滿每個批次請求。模型處理器程式碼:TorchServe 需要模型處理器來處理批次推論請求。
有關具有批次處理的自訂模型處理器的完整工作範例,請參閱 Hugging face transformer generalized handler
TorchServe 模型設定¶
從 Torchserve 0.4.1 開始,有兩種方法可以設定 TorchServe 以使用批次處理功能
透過 POST /models API 提供批次設定資訊。
透過設定檔 config.properties 提供批次設定資訊。
我們感興趣的設定屬性如下
batch_size
:這是模型預期可以處理的最大批次大小。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_size
和max_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_size
和 max_batch_delay
,這與上一節類似,由 dockerd_entrypoint.sh 使用。
使用 docker 容器的 Resnet-152 批次推論¶
在 config.properties 中設定批次
batch_size
和max_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 }