利用 Triton Inference Server 实现的高性能服务

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

了解如何通过联机终结点在 Azure 机器学习中使用 NVIDIA Triton 推理服务器

Triton 是针对推理进行了优化的多框架开放源软件。 它支持 TensorFlow、ONNX 运行时、PyTorch、NVIDIA TensorRT 等常用的机器学习框架。 它可用于 CPU 工作负载或 GPU 工作负载。

将 Triton 模型部署到联机终结点时,主要可以采用两种方法来利用 Triton 模型:无代码部署或完整代码(自带容器)部署。

  • Triton 模型的无代码部署是一种简单的部署方式,因为你只需提供 Triton 模型进行部署即可。
  • Triton 模型的完整代码部署(自带容器)是更高级的部署方式,因为你可以完全控制如何自定义可用于 Triton 推理服务器的配置。

对于这两个选项,Triton 推理服务器都将基于 NVIDIA 定义的 Triton 模型执行推理。 例如,系综模型可用于更高级的方案。

托管联机终结点和 Kubernetes 联机终结点都支持 Triton。

本文介绍如何使用 Triton 的无代码部署将模型部署到托管联机终结点。 本文提供有关使用 CLI(命令行)、Python SDK v2 和 Azure 机器学习工作室的信息。 若要使用 Triton 推理服务器的配置进一步自定义,请参阅使用自定义容器部署模型和适用于 Triton 的 BYOC 示例(部署定义端到端脚本)。

备注

对 NVIDIA Triton Inference Server 容器的使用受到 NVIDIA AI Enterprise 软件许可协议的约束,并且可在没有企业产品订阅的情况下使用 90 天。 有关详细信息,请参阅 Azure 机器学习的 NVIDIA AI Enterprise

先决条件

适用范围:Python SDK azure-ai-ml v2(最新版)

在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • 正常工作的 Python 3.8(或更高版本)环境。

  • 必须安装其他 Python 包才能进行评分,可以使用以下代码安装它们。 它们包括:

    • Numpy - 数组和数值计算库
    • Triton 推理服务器客户端 - 促进对 Triton 推理服务器的请求
    • Pillow - 用于图像操作的库
    • Gevent - 连接到 Triton 服务器时使用的网络库
    pip install numpy
    pip install tritonclient[http]
    pip install pillow
    pip install gevent
    
  • 访问 Azure 订阅的 NCv3 系列虚拟机。

    重要

    可能需要为订阅请求增加配额,然后才能使用此系列虚拟机。 有关详细信息,请参阅 NCv3 系列

本文中的信息基于 azureml-examples 存储库中包含的 online-endpoints-triton.ipynb 笔记本内容。 若要在不复制/粘贴文件的情况下在本地运行命令,请克隆存储库,然后将目录更改为存储库中的 sdk/endpoints/online/triton/single-model/ 目录:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/sdk/python/endpoints/online/triton/single-model/

定义部署配置

适用范围:Python SDK azure-ai-ml v2(最新版)

本部分介绍如何使用 Azure 机器学习 Python SDK (v2) 定义 Triton 部署,使其部署到托管联机终结点。

重要

对于 Triton 无代码部署,目前不支持 通过本地终结点进行测试

  1. 若要连接到工作区,我们需要提供标识符参数 - 订阅、资源组和工作区名称。

    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace_name = "<AML_WORKSPACE_NAME>"
    
  2. 使用以下命令设置要创建的终结点的名称。 在此示例中,将为终结点创建一个随机名称:

    import random
    
    endpoint_name = f"endpoint-{random.randint(0, 10000)}"
    
  3. 我们将在 azure.ai.mlMLClient 中使用这些详细信息来获取所需 Azure 机器学习工作区的句柄。 请查看此配置笔记本,了解有关如何配置凭据和连接到工作区的更多详细信息。

    from azure.ai.ml import MLClient
    from azure.identity import DefaultAzureCredential
    
    ml_client = MLClient(
        DefaultAzureCredential(),
        subscription_id,
        resource_group,
        workspace_name,
    )
    
  4. 创建一个 ManagedOnlineEndpoint 对象以配置终结点。 以下示例配置终结点的名称和身份验证模式。

    from azure.ai.ml.entities import ManagedOnlineEndpoint
    
    endpoint = ManagedOnlineEndpoint(name=endpoint_name, auth_mode="key")
    
  5. 创建一个 ManagedOnlineDeployment 对象以配置部署。 以下示例将配置名为 blue 的部署,将其部署到在上一步中定义的终结点并定义本地模型内联。

    from azure.ai.ml.entities import ManagedOnlineDeployment, Model
    
    model_name = "densenet-onnx-model"
    model_version = 1
    
    deployment = ManagedOnlineDeployment(
        name="blue",
        endpoint_name=endpoint_name,
        model=Model(
            name=model_name, 
            version=model_version,
            path="./models",
            type="triton_model"
        ),
        instance_type="Standard_NC6s_v3",
        instance_count=1,
    )
    

“部署到 Azure”

适用范围:Python SDK azure-ai-ml v2(最新版)

  1. 要使用 ManagedOnlineEndpoint 对象创建新的终结点,请使用以下命令:

    endpoint = ml_client.online_endpoints.begin_create_or_update(endpoint)
    
  2. 要使用 ManagedOnlineDeployment 对象创建部署,请使用以下命令:

    ml_client.online_deployments.begin_create_or_update(deployment)
    
  3. 部署完成后,其流量值将设置为 0%。 将流量更新为 100%。

    endpoint.traffic = {"blue": 100}
    ml_client.online_endpoints.begin_create_or_update(endpoint)
    

测试终结点

适用范围:Python SDK azure-ai-ml v2(最新版)

  1. 要获取终结点评分 URI,请使用以下命令:

    endpoint = ml_client.online_endpoints.get(endpoint_name)
    scoring_uri = endpoint.scoring_uri
    
  2. 要获取身份验证密钥,请使用以下命令:keys = ml_client.online_endpoints.list_keys(endpoint_name) auth_key = keys.primary_key

  3. 以下评分代码使用 Triton 推理服务器客户端将孔雀的图像提交到终结点。 本示例的配套笔记本中提供了此脚本 - 使用 Triton 将模型部署到联机终结点

    # Test the blue deployment with some sample data
    import requests
    import gevent.ssl
    import numpy as np
    import tritonclient.http as tritonhttpclient
    from pathlib import Path
    import prepost
    
    img_uri = "http://aka.ms/peacock-pic"
    
    # We remove the scheme from the url
    url = scoring_uri[8:]
    
    # Initialize client handler
    triton_client = tritonhttpclient.InferenceServerClient(
        url=url,
        ssl=True,
        ssl_context_factory=gevent.ssl._create_default_https_context,
    )
    
    # Create headers
    headers = {}
    headers["Authorization"] = f"Bearer {auth_key}"
    
    # Check status of triton server
    health_ctx = triton_client.is_server_ready(headers=headers)
    print("Is server ready - {}".format(health_ctx))
    
    # Check status of model
    model_name = "model_1"
    status_ctx = triton_client.is_model_ready(model_name, "1", headers)
    print("Is model ready - {}".format(status_ctx))
    
    if Path(img_uri).exists():
        img_content = open(img_uri, "rb").read()
    else:
        agent = f"Python Requests/{requests.__version__} (https://github.com/Azure/azureml-examples)"
        img_content = requests.get(img_uri, headers={"User-Agent": agent}).content
    
    img_data = prepost.preprocess(img_content)
    
    # Populate inputs and outputs
    input = tritonhttpclient.InferInput("data_0", img_data.shape, "FP32")
    input.set_data_from_numpy(img_data)
    inputs = [input]
    output = tritonhttpclient.InferRequestedOutput("fc6_1")
    outputs = [output]
    
    result = triton_client.infer(model_name, inputs, outputs=outputs, headers=headers)
    max_label = np.argmax(result.as_numpy("fc6_1"))
    label_name = prepost.postprocess(max_label)
    print(label_name)
    
  4. 脚本的响应类似于以下文本:

    Is server ready - True
    Is model ready - True
    /azureml-examples/sdk/endpoints/online/triton/single-model/densenet_labels.txt
    84 : PEACOCK
    

删除终结点和模型

适用范围:Python SDK azure-ai-ml v2(最新版)

  1. 删除终结点。 删除终结点也会删除任何子部署,但不会存档关联的环境或模型。

    ml_client.online_endpoints.begin_delete(name=endpoint_name)
    
  2. 使用以下代码存档模型。

    ml_client.models.archive(name=model_name, version=model_version)
    

后续步骤

若要了解更多信息,请查看下列文章: