搭建 Triton Server 并部署 PyTorch BERT 模型

释放双眼,带上耳机,听听看~!
学习如何搭建 Triton Server 并部署 PyTorch BERT 模型,利用 Docker 运行,并将模型导出为 ONNX 格式进行部署。

搭建 Triton Server

Triton Server 是 NVIDIA 推出的一个用于机器学习模型部署的开源平台,支持 TensorFlow、PyTorch、ONNX 等多种模型格式。下面是搭建 Triton Server 的步骤:

  1. 安装 Docker

Triton Server 是基于 Docker 运行的,因此需要先安装 Docker。

  1. 下载 Triton Server 镜像

在终端中执行以下命令下载 Triton Server 镜像:

docker pull nvcr.io/nvidia/tritonserver:21.09-py3

其中 21.09 是 Triton Server 的版本号,py3 表示使用 Python 3.x。

  1. 启动 Triton Server

在终端中执行以下命令启动 Triton Server:

docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /path/to/model/repository:/models nvcr.io/nvidia/tritonserver:21.09-py3 tritonserver --model-repository=/models

其中 /path/to/model/repository 是存放模型的目录,可以自己指定。启动 Triton Server 后,可以通过 http://localhost:8000/v2/models 访问 Triton Server 的 API。

导出 PyTorch BERT 模型为 ONNX

  1. 安装 PyTorch 和 ONNX

在终端中执行以下命令安装 PyTorch 和 ONNX:

pip install torch==1.9.0
pip install onnx==1.9.0
  1. 导出 PyTorch BERT 模型为 ONNX

在 Python 脚本中执行以下代码将 PyTorch BERT 模型导出为 ONNX:

import torch
import onnx

# 加载 PyTorch BERT 模型
model = torch.load('/path/to/pytorch/bert/model')

# 转换为 ONNX 格式
input_names = ['input_ids', 'attention_mask', 'token_type_ids']
output_names = ['output']
dummy_input = (torch.zeros(1, 128), torch.zeros(1, 128), torch.zeros(1, 128))
onnx_model = onnx.export(model, dummy_input, '/path/to/onnx/bert/model', input_names=input_names, output_names=output_names)

其中 /path/to/pytorch/bert/model 是 PyTorch BERT 模型的路径,/path/to/onnx/bert/model 是导出的 ONNX 模型的路径。

部署 PyTorch BERT 模型到 Triton Server

  1. 创建模型配置文件

/path/to/model/repository 目录下创建一个名为 bert 的目录,并在该目录下创建一个名为 config.pbtxt 的文件,文件内容如下:

name: "bert"
platform: "pytorch_libtorch"
max_batch_size: 1
input [
  {
    name: "input_ids"
    data_type: TYPE_INT64
    dims: [ -1, 128 ]
  },
  {
    name: "attention_mask"
    data_type: TYPE_INT64
    dims: [ -1, 128 ]
  },
  {
    name: "token_type_ids"
    data_type: TYPE_INT64
    dims: [ -1, 128 ]
  }
]
output [
  {
    name: "output"
    data_type: TYPE_FP32
    dims: [ -1, 768 ]
  }
]

其中 name 是模型的名称,platform 是模型的部署平台,max_batch_size 是最大批次大小,input 是模型的输入,output 是模型的输出。

  1. 复制模型文件

将导出的 ONNX 模型文件复制到 /path/to/model/repository/bert/1/ 目录下,并将文件名改为 model.pt

  1. 启动 Triton Server

在终端中执行以下命令启动 Triton Server:

docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /path/to/model/repository:/models nvcr.io/nvidia/tritonserver:21.09-py3 tritonserver --model-repository=/models

其中 /path/to/model/repository 是存放模型的目录,可以自己指定。启动 Triton Server 后,可以通过 http://localhost:8000/v2/models 访问 Triton Server 的 API。

请求模型的 HTTP 和 gRPC 代码示例

下面是请求 PyTorch BERT 模型的 HTTP 和 gRPC 代码示例:

HTTP:

import requests
import json

url = 'http://localhost:8000/v2/models/bert/infer'

headers = {'Content-Type': 'application/json'}
data = {
    'inputs': [
        {
            'name': 'input_ids',
            'shape': [1, 128],
            'datatype': 'INT64',
            'data': [0] * 128
        },
        {
            'name': 'attention_mask',
            'shape': [1, 128],
            'datatype': 'INT64',
            'data': [0] * 128
        },
        {
            'name': 'token_type_ids',
            'shape': [1, 128],
            'datatype': 'INT64',
            'data': [0] * 128
        }
    ],
    'outputs': [
        {
            'name': 'output',
            'shape': [1, 768],
            'datatype': 'FP32'
        }
    ]
}

response = requests.post(url, headers=headers, data=json.dumps(data))
result = json.loads(response.content.decode('utf-8'))

print(result)

gRPC:

import grpc
import numpy as np
import onnxruntime_protobuf as ort_pb2
import onnxruntime_protobuf as ort_pb2_grpc

channel = grpc.insecure_channel('localhost:8001')
stub = ort_pb2_grpc.InferenceServerStub(channel)

inputs = [
    {
        'name': 'input_ids',
        'shape': [1, 128],
        'datatype': 'INT64',
        'data': np.zeros((1, 128), dtype=np.int64)
    },
    {
        'name': 'attention_mask',
        'shape': [1, 128],
        'datatype': 'INT64',
        'data': np.zeros((1, 128), dtype=np.int64)
    },
    {
        'name': 'token_type_ids',
        'shape': [1, 128],
        'datatype': 'INT64',
        'data': np.zeros((1, 128), dtype=np.int64)
    }
]

outputs = [
    {
        'name': 'output',
        'shape': [1, 768],
        'datatype': 'FP32'
    }
]

request = ort_pb2.InferRequest()
request.model_name = 'bert'
request.inputs.extend([ort_pb2.NamedTensor(name=input['name'], dims=input['shape'], data_type=input['datatype'], raw_data=input['data'].tobytes()) for input in inputs])
request.outputs.extend([ort_pb2.NamedTensor(name=output['name'], dims=output['shape'], data_type=output['datatype']) for output in outputs])

response = stub.Infer(request)

result = {}
for output in response.outputs:
    result[output.name] = np.frombuffer(output.raw_data, dtype=np.float32).reshape(output.dims)

print(result)

以上代码示例中,inputs 是模型的输入,outputs 是模型的输出。在请求模型时,需要将输入数据的类型、形状和数据传递给 Triton Server,Triton Server 会返回输出数据的类型、形状和数据。

总结

本文介绍了如何使用 Triton Server 搭建一个 PyTorch BERT 模型的推理服务,并提供了 HTTP 和 gRPC 请求代码示例。通过使用 Triton Server,可以方便地进行模型推理服务的部署和管理,同时提供高效的推理服务。如果您想了解更多关于 Triton Server 的信息,可以参考官方文档:docs.nvidia.com/deeplearnin…

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

线性回归的基本元素

2023-12-14 13:26:14

AI教程

工业摄像头非标物体尺寸测量方法

2023-12-14 13:30:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索