快捷方式

管理 API

TorchServe 提供以下 API,允许您在运行时管理模型

  1. 注册模型

  2. 增加/减少特定模型的工作程序数量

  3. 描述模型的状态

  4. 注销模型

  5. 列出已注册的模型

  6. 设置模型的默认版本

  7. 刷新令牌以进行令牌授权

管理 API 在端口 8081 上侦听,默认情况下仅可从本地主机访问。要更改默认设置,请参阅 TorchServe 配置

默认情况下禁用用于注册和删除模型的管理 API。在运行 TorchServe 时,将 --enable-model-api 添加到命令行以启用这些 API 的使用。有关更多详细信息和启用方式,请参阅 模型 API 控制

对于所有管理 API 请求,TorchServe 要求包含正确的管理令牌,或者必须禁用令牌授权。有关更多详细信息,请参阅 令牌授权文档

推理 API 类似,管理 API 提供 API 描述 以使用 OpenAPI 3.0 规范描述管理 API。

或者,如果您想使用 KServe,TorchServe 支持 v1 和 v2 API。有关更多详细信息,请查看此 kserve 文档

注册模型

此 API 遵循 ManagementAPIsService.RegisterModel gRPC API。

要在 TorchServe 启动后使用此 API,必须启用模型 API 控制。在启动 TorchServe 时,将 --enable-model-api 添加到命令行以启用此 API 的使用。有关更多详细信息,请参阅 模型 API 控制

POST /models

  • url - 模型归档下载 URL。支持以下位置

    • 本地模型归档文件 (.mar);文件必须位于 model_store 文件夹中(而不是子文件夹中)。

    • 使用 HTTP(s) 协议的 URI。TorchServe 可以从 Internet 下载 .mar 文件。

  • model_name - 模型的名称;此名称将在其他 API 中用作 {model_name},作为路径的一部分。如果此参数不存在,则将使用 MANIFEST.json 中的 modelName

  • handler - 推理处理程序入口点。如果存在,此值将覆盖 MANIFEST.json 中的 handler。**注意:确保给定的 handler 位于 PYTHONPATH 中。处理程序的格式为 module_name:method_name。**

  • runtime - 模型自定义服务代码的运行时。如果存在,此值将覆盖 MANIFEST.json 中的运行时。默认值为 PYTHON

  • batch_size - 推理批次大小。默认值为 1

  • max_batch_delay - 批次聚合的最大延迟。默认值为 100 毫秒。

  • initial_workers - 要创建的初始工作程序数量。默认值为 0。在分配至少一个工作之前,TorchServe 不会运行推理。

  • synchronous - 工作程序创建是否同步。默认值为 false。TorchServe 将创建新的工作程序,而无需等待确认前一个工作程序已上线。

  • response_timeout - 如果模型的后端工作程序在此超时时间内未响应推理响应,则该工作程序将被视为无响应并重新启动。单位为秒。默认值为 120 秒。

  • startup_timeout - 如果模型的后端工作程序在此超时时间内未加载模型,则该工作程序将被视为无响应并重新启动。单位为秒。默认值为 120 秒。

curl -X POST  "http://localhost:8081/models?url=https://torchserve.pytorch.org/mar_files/squeezenet1_1.mar"

{
  "status": "Model \"squeezenet_v1.1\" Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model."
}

加密模型服务

如果您想提供加密模型的服务,则需要使用以下环境变量设置 S3 SSE-KMS

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_DEFAULT_REGION

并在 HTTP 请求中设置“s3_sse_kms=true”。

例如:模型 squeezenet1_1 在 您自己的私有帐户下在 S3 上加密。S3 上的模型 http url 为 https://torchserve.pytorch.org/sse-test/squeezenet1_1.mar

  • 如果 torchserve 将在 EC2 实例上运行(例如,操作系统:ubuntu)

  1. 为 EC2 实例添加 IAM 角色 (AWSS3ReadOnlyAccess)

  2. 运行 ts_scripts/get_aws_credential.sh 以导出 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY

  3. export AWS_DEFAULT_REGION=your_s3_bucket_region

  4. 启动 torchserve

  5. 通过在 curl 命令中设置 s3_sse_kms=true 来注册加密模型 squeezenet1_1。

curl -X POST  "http://localhost:8081/models?url=https://torchserve.pytorch.org/sse-test/squeezenet1_1.mar&s3_sse_kms=true"

{
  "status": "Model \"squeezenet_v1.1\" Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model."
}
  • 如果 torchserve 将在本地运行(例如,操作系统:macOS)

  1. 查找您的 AWS 访问密钥和秘密密钥。如果您忘记了密钥,可以 重置它们

  2. export AWS_ACCESS_KEY_ID=your_aws_access_key

  3. export AWS_SECRET_ACCESS_KEY=your_aws_secret_key

  4. export AWS_DEFAULT_REGION=your_s3_bucket_region

  5. 启动 torchserve

  6. 通过在 curl 命令中设置 s3_sse_kms=true 来注册加密模型 squeezenet1_1(与 EC2 示例步骤 5 相同)。

您可能希望在注册期间创建工作程序。由于创建初始工作程序可能需要一些时间,因此您可以选择同步或异步调用以确保正确创建初始工作程序。

异步调用在尝试创建工作程序之前返回 HTTP 代码 202。

curl -v -X POST "http://localhost:8081/models?initial_workers=1&synchronous=false&url=https://torchserve.pytorch.org/mar_files/squeezenet1_1.mar"

< HTTP/1.1 202 Accepted
< content-type: application/json
< x-request-id: 4dc54158-c6de-42aa-b5dd-ebcb5f721043
< content-length: 47
< connection: keep-alive
<
{
  "status": "Processing worker updates..."
}

同步调用在所有工作程序都已调整后返回 HTTP 代码 200。

curl -v -X POST "http://localhost:8081/models?initial_workers=1&synchronous=true&url=https://torchserve.pytorch.org/mar_files/squeezenet1_1.mar"

< HTTP/1.1 200 OK
< content-type: application/json
< x-request-id: ecd2e502-382f-4c3b-b425-519fbf6d3b85
< content-length: 89
< connection: keep-alive
<
{
  "status": "Model \"squeezenet1_1\" Version: 1.0 registered with 1 initial workers"
}

扩展工作程序

此 API 遵循 ManagementAPIsService.ScaleWorker gRPC API。它返回 ModelServer 中模型的状态。

PUT /models/{model_name}

  • min_worker - (可选)工作进程的最小数量。TorchServe 将尝试为指定模型维护此最小值。默认值为 1

  • max_worker - (可选)工作进程的最大数量。TorchServe 为指定模型创建的工作进程数量不会超过此值。默认值与 min_worker 的设置相同。

  • synchronous - 调用是否同步。默认值为 false

  • timeout - 指定工作进程完成所有待处理请求的等待时间。如果超过此时间,工作进程将被终止。使用 0 立即终止后端工作进程。使用 -1 无限期等待。默认值为 -1

使用 Scale Worker API 动态调整模型任何版本的 worker 数量,以更好地服务于不同的推理请求负载。

此 API 有两种不同的类型:同步和异步。

异步调用将立即返回 HTTP 代码 202。

curl -v -X PUT "http://localhost:8081/models/noop?min_worker=3"

< HTTP/1.1 202 Accepted
< content-type: application/json
< x-request-id: 42adc58e-6956-4198-ad07-db6c620c4c1e
< content-length: 47
< connection: keep-alive
<
{
  "status": "Processing worker updates..."
}

同步调用在所有工作程序都已调整后返回 HTTP 代码 200。

curl -v -X PUT "http://localhost:8081/models/noop?min_worker=3&synchronous=true"

< HTTP/1.1 200 OK
< content-type: application/json
< x-request-id: b72b1ea0-81c6-4cce-92c4-530d3cfe5d4a
< content-length: 63
< connection: keep-alive
<
{
  "status": "Workers scaled to 3 for model: noop"
}

要缩放模型特定版本的 worker,请使用 URI:/models/{model_name}/{version} PUT /models/{model_name}/{version}

以下同步调用将在模型“noop”版本“2.0”的所有 worker 调整完成后返回,并返回 HTTP 代码 200。

curl -v -X PUT "http://localhost:8081/models/noop/2.0?min_worker=3&synchronous=true"

< HTTP/1.1 200 OK
< content-type: application/json
< x-request-id: 3997ccd4-ae44-4570-b249-e361b08d3d47
< content-length: 77
< connection: keep-alive
<
{
  "status": "Workers scaled to 3 for model: noop, version: 2.0"
}

描述模型

此 API 遵循 ManagementAPIsService.DescribeModel gRPC API。它返回 ModelServer 中模型的状态。

GET /models/{model_name}

使用 Describe Model API 获取模型默认版本的详细运行时状态。

curl http://localhost:8081/models/noop
[
    {
      "modelName": "noop",
      "modelVersion": "1.0",
      "modelUrl": "noop.mar",
      "engine": "Torch",
      "runtime": "python",
      "minWorkers": 1,
      "maxWorkers": 1,
      "batchSize": 1,
      "maxBatchDelay": 100,
      "workers": [
        {
          "id": "9000",
          "startTime": "2018-10-02T13:44:53.034Z",
          "status": "READY",
          "gpu": false,
          "memoryUsage": 89247744
        }
      ],
      "jobQueueStatus": {
        "remainingCapacity": 100,
        "pendingRequests": 0
      }
    }
]

GET /models/{model_name}/{version}

使用 Describe Model API 获取模型特定版本的详细运行时状态。

curl http://localhost:8081/models/noop/2.0
[
    {
      "modelName": "noop",
      "modelVersion": "2.0",
      "modelUrl": "noop_2.mar",
      "engine": "Torch",
      "runtime": "python",
      "minWorkers": 1,
      "maxWorkers": 1,
      "batchSize": 1,
      "maxBatchDelay": 100,
      "workers": [
        {
          "id": "9000",
          "startTime": "2018-10-02T13:44:53.034Z",
          "status": "READY",
          "gpu": false,
          "memoryUsage": 89247744
        }
      ],
      "jobQueueStatus": {
        "remainingCapacity": 100,
        "pendingRequests": 0
      }
    }
]

GET /models/{model_name}/all

使用 Describe Model API 获取模型所有版本的详细运行时状态。

curl http://localhost:8081/models/noop/all
[
    {
      "modelName": "noop",
      "modelVersion": "1.0",
      "modelUrl": "noop.mar",
      "engine": "Torch",
      "runtime": "python",
      "minWorkers": 1,
      "maxWorkers": 1,
      "batchSize": 1,
      "maxBatchDelay": 100,
      "workers": [
        {
          "id": "9000",
          "startTime": "2018-10-02T13:44:53.034Z",
          "status": "READY",
          "gpu": false,
          "memoryUsage": 89247744
        }
      ],
      "jobQueueStatus": {
        "remainingCapacity": 100,
        "pendingRequests": 0
      }
    },
    {
      "modelName": "noop",
      "modelVersion": "2.0",
      "modelUrl": "noop_2.mar",
      "engine": "Torch",
      "runtime": "python",
      "minWorkers": 1,
      "maxWorkers": 1,
      "batchSize": 1,
      "maxBatchDelay": 100,
      "workers": [
        {
          "id": "9000",
          "startTime": "2018-10-02T13:44:53.034Z",
          "status": "READY",
          "gpu": false,
          "memoryUsage": 89247744
        }
      ],
      "jobQueueStatus": {
        "remainingCapacity": 100,
        "pendingRequests": 0
      }
    }
]

GET /models/{model_name}/{model_version}?customized=trueGET /models/{model_name}?customized=true

使用 Describe Model API 获取模型版本的详细运行时状态和自定义元数据。

  • 实现 describe_handle 函数。例如:

    def describe_handle(self):
        """Customized describe handler
        Returns:
            dict : A dictionary response.
        """
        output_describe = None

        logger.info("Collect customized metadata")

        return output_describe
  • 如果处理程序不是从 BaseHandler 继承的,则实现 _is_describe 函数。然后,在 handle 中调用 _is_describe 和 describe_handle。

    def _is_describe(self):
        if self.context and self.context.get_request_header(0, "describe"):
            if self.context.get_request_header(0, "describe") == "True":
                return True
        return False

    def handle(self, data, context):
        if self._is_describe():
            output = [self.describe_handle()]
        else:
            data_preprocess = self.preprocess(data)

            if not self._is_explain():
                output = self.inference(data_preprocess)
                output = self.postprocess(output)
            else:
                output = self.explain_handle(data_preprocess, data)

        return output
  • 在 handle 中调用 _is_describe 和 describe_handle 函数。例如:

def handle(self, data, context):
        """Entry point for default handler. It takes the data from the input request and returns
           the predicted outcome for the input.
        Args:
            data (list): The input data that needs to be made a prediction request on.
            context (Context): It is a JSON Object containing information pertaining to
                               the model artifacts parameters.
        Returns:
            list : Returns a list of dictionary with the predicted response.
        """

        # It can be used for pre or post processing if needed as additional request
        # information is available in context
        start_time = time.time()

        self.context = context
        metrics = self.context.metrics

        is_profiler_enabled = os.environ.get("ENABLE_TORCH_PROFILER", None)
        if is_profiler_enabled:
            output, _ = self._infer_with_profiler(data=data)
        else:
            if self._is_describe():
                output = [self.describe_handle()]
            else:
                data_preprocess = self.preprocess(data)

                if not self._is_explain():
                    output = self.inference(data_preprocess)
                    output = self.postprocess(output)
                else:
                    output = self.explain_handle(data_preprocess, data)

        stop_time = time.time()
        metrics.add_time('HandlerTime', round(
            (stop_time - start_time) * 1000, 2), None, 'ms')
        return output
  • 这是一个示例。“customizedMetadata”显示来自用户模型的元数据。这些元数据可以解码成字典。

curl http://localhost:8081/models/noop-customized/1.0?customized=true
[
    {
        "modelName": "noop-customized",
        "modelVersion": "1.0",
        "modelUrl": "noop-customized.mar",
        "runtime": "python",
        "minWorkers": 1,
        "maxWorkers": 1,
        "batchSize": 1,
        "maxBatchDelay": 100,
        "loadedAtStartup": false,
        "workers": [
          {
            "id": "9010",
            "startTime": "2022-02-08T11:03:20.974Z",
            "status": "READY",
            "memoryUsage": 0,
            "pid": 98972,
            "gpu": false,
            "gpuUsage": "N/A"
          }
        ],
        "jobQueueStatus": {
          "remainingCapacity": 100,
          "pendingRequests": 0
        },
        "customizedMetadata": "{\n  \"data1\": \"1\",\n  \"data2\": \"2\"\n}"
     }
]
  • 在客户端解码 customizedMetadata。例如

import requests
import json

response = requests.get('http://localhost:8081/models/noop-customized/?customized=true').json()
customizedMetadata = response[0]['customizedMetadata']
print(customizedMetadata)

注销模型

此 API 遵循 ManagementAPIsService.UnregisterModel gRPC API。它返回 ModelServer 中模型的状态。

要在 TorchServe 启动后使用此 API,必须启用模型 API 控制。在启动 TorchServe 时,将 --enable-model-api 添加到命令行以启用此 API 的使用。有关更多详细信息,请参阅 模型 API 控制

DELETE /models/{model_name}/{version}

使用 Unregister Model API 通过从 TorchServe 注销模型的特定版本来释放系统资源。

curl -X DELETE http://localhost:8081/models/noop/1.0

{
  "status": "Model \"noop\" unregistered"
}

列出模型

此 API 遵循 ManagementAPIsService.ListModels gRPC API。它返回 ModelServer 中模型的状态。

GET /models

  • limit - (可选)要返回的项目最大数量。它作为查询参数传递。默认值为 100

  • next_page_token - (可选)查询下一页。它作为查询参数传递。此值由先前的 API 调用返回。

使用 Models API 查询当前已注册模型的默认版本。

curl "http://localhost:8081/models"

此 API 支持分页。

curl "http://localhost:8081/models?limit=2&next_page_token=2"

{
  "nextPageToken": "4",
  "models": [
    {
      "modelName": "noop",
      "modelUrl": "noop-v1.0"
    },
    {
      "modelName": "noop_v0.1",
      "modelUrl": "noop-v0.1"
    }
  ]
}

API 描述

OPTIONS /

要查看推理和管理 API 的完整列表,可以使用以下命令

# To view all inference APIs:
curl -X OPTIONS http://localhost:8080

# To view all management APIs:
curl -X OPTIONS http://localhost:8081

输出为 OpenAPI 3.0.1 json 格式。您可以使用它生成客户端代码,有关详细信息,请参阅 swagger codegen

推理和管理 API 的示例输出

设置默认版本

此 API 遵循 ManagementAPIsService.SetDefault gRPC API。它返回 ModelServer 中模型的状态。

PUT /models/{model_name}/{version}/set-default

要将模型的任何已注册版本设置为默认版本,请使用

curl -v -X PUT http://localhost:8081/models/noop/2.0/set-default

输出为 OpenAPI 3.0.1 json 格式。您可以使用它生成客户端代码,有关详细信息,请参阅 swagger codegen

令牌授权 API

TorchServe 现在默认强制执行令牌授权。有关更多信息,请查看以下文档:令牌授权

此 API 用于生成一个新密钥以替换管理密钥或推理密钥。

管理示例

curl localhost:8081/token?type=management -H "Authorization: Bearer {API Token}"

将用新密钥替换密钥文件中的当前管理密钥,并更新过期时间。

推理示例

curl localhost:8081/token?type=inference -H "Authorization: Bearer {API Token}"

将用新密钥替换密钥文件中的当前推理密钥,并更新过期时间。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源