跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

category

想象一下,您已经使用PyTorch、TensorFlow或您选择的框架训练了您的模型,对其准确性感到满意,并正在考虑将其作为服务进行部署。有两个重要目标需要考虑:最大限度地提高模型性能和构建将其作为服务进行部署所需的基础设施。这篇文章讨论了这两个目标。

通过在三个堆栈级别上加速模型,您可以从模型中挤出更好的性能:

  • 硬件加速
  • 软件加速
  • 算法或网络加速。


NVIDIA GPU是深度学习从业者中硬件加速的领先选择,其优点在业界得到了广泛讨论。

关于GPU软件加速的讨论通常围绕库展开,如cuDNN、NCCL、TensorRT和其他CUDA-X库。

算法或网络加速围绕着量化和知识提取等技术的使用展开,这些技术本质上是对网络本身进行修改,其应用高度依赖于您的模型。

这种加速需求主要是由业务考虑驱动的,如通过减少延迟来降低成本或改善最终用户体验,以及战术考虑,如在计算资源较少的边缘设备上的模型上部署。

服务于深度学习模式


模型加速后,下一步是构建一个服务服务来部署您的模型,这会带来一系列独特的挑战。这是一个非排他性列表:

  • 该服务会在不同的硬件平台上运行吗?
  • 它会处理我必须同时部署的其他模型吗?
  • 服务是否稳健?
  • 如何减少延迟?
  • 模型使用不同的框架和技术堆栈进行训练;我该怎么办?
  • 我如何缩放?


这些都是有效的问题,解决每一个问题都是一个挑战。

Figure 1. Optimizing and deploying DL models with TensorRT and NVIDIA Triton

解决方案概述


本文讨论了使用NVIDIA TensorRT及其PyTorch和TensorFlow的框架集成、NVIDIA Triton推理服务器和NVIDIA GPU来加速和部署您的模型。

NVIDIA TensorRT


NVIDIA TensorRT是一款用于高性能深度学习推理的SDK。它包括一个深度学习推理优化器和运行时,为深度学习推理应用程序提供低延迟和高吞吐量。

通过与PyTorch和TensorFlow的框架集成,您只需一行代码就可以将推理速度提高6倍。

NVIDIA Triton推理服务器


NVIDIA Triton推理服务器是一款开源推理服务软件,提供单一的标准化推理平台。它可以支持在数据中心、云、嵌入式设备或虚拟化环境中的任何基于GPU或CPU的基础设施上对来自多个框架的模型进行推理

有关更多信息,请参阅以下视频:

  • NVIDIA TensorRT高性能深度学习推理简介
  • NVIDIA Torch TensorRT入门
  • TensorFlow TensorRT入门
  • Triton一简化推理的五大原因


工作流概述


在我们深入了解细节之前,以下是总体工作流程。要继续,请参阅以下资源:

  • TensorRT
  • Torch TensorRT
  • Tensorflow TensorRT


图1显示了您必须经历的步骤。

Figure 2. Overall workflow for optimizing a model with TensorRT and serving with NVIDIA Triton

在你开始跟随之前,准备好你训练过的模型。

  • 步骤1:优化模型。您可以使用TensorRT或其框架集成来实现这一点。如果选择TensorRT,则可以使用trtexec命令行界面。对于与TensorFlow或PyTorch的框架集成,您可以使用一行API。
  • 步骤2:建立一个模型存储库。旋转NVIDIA Triton推理服务器需要一个模型存储库。此存储库包含要服务的模型、指定详细信息的配置文件以及任何所需的元数据。
  • 步骤3:启动服务器
  • 第4步:最后,我们提供了简单而健壮的HTTP和gRPC API,您可以使用它们来查询服务器!
    在这篇文章中,使用NGC的Docker容器。您可能需要创建一个帐户并获取API密钥才能访问这些容器。

下面是详细信息!

使用TensorRT加速模型


TensorRT通过图优化和量化来加速模型。您可以通过以下任何方式获得这些好处:

  • trtexec CLI工具
  • TensorRT Python/C++API
  • Torch TensorRT(与PyTorch集成)
  • TensorFlow TensorRT(与TensorFlow集成)


Figure 3. Optimize your model with TensorRT or its framework integrations

虽然TensorRT本机实现了图形优化的更大定制,但框架集成为新加入生态系统的开发人员提供了易用性。由于用户可能采用的路线取决于其网络的具体需求,我们想列出所有选项。有关更多信息,请参阅使用NVIDIA TensorRT加速深度学习推理(更新版)。

对于TensorRT,有几种方法可以构建TensorRT引擎。对于这篇文章,请使用trtexec CLI工具。如果希望脚本导出预训练的模型,请使用export_resnet_to_onnx.py示例。有关更多信息,请参阅TensorRT文档。

docker run -it --gpus all -v /path/to/this/folder:/trt_optimize nvcr.io/nvidia/tensorrt:<xx:yy>-py3
trtexec --onnx=resnet50.onnx \
       --saveEngine=resnet50.engine \
       --explicitBatch \
       --useCudaGraph


要使用FP16,请在命令中添加--FP16。在继续下一步之前,您必须知道网络输入和输出层的名称,这是定义NVIDIA Triton模型存储库配置时所必需的。一个简单的方法是使用polygraphy,它与TensorRT容器一起包装。

polygraphy inspect model resnet50.engine --mode=basic


对于Torch TensorRT,拉动NVIDIA PyTorch容器,该容器已安装TensorRT和Torch TensorRT。要继续,请使用示例。有关更多示例,请访问Torch TensorRT GitHub repo。

# <xx.xx> is the yy:mm for the publishing tag for NVIDIA's Pytorch 
# container; eg. 21.12

docker run -it --gpus all -v /path/to/this/folder:/resnet50_eg                                                       nvcr.io/nvidia/pytorch:<xx.xx>-py3

python torch_trt_resnet50.py


为了扩展细节,您实际上是在使用Torch-TensorRT来编译带有TensorRT的PyTorch模型。在幕后,您的模型被转换为TorchScript模块,然后TensorRT支持的操作进行优化。有关更多信息,请参阅Torch TensorRT文档。

model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True).eval().to("cuda")

# Compile with Torch TensorRT;
trt_model = torch_tensorrt.compile(model, 
    inputs= [torch_tensorrt.Input((1, 3, 224, 224))],
    enabled_precisions= { torch_tensorrt.dtype.float32} # Runs with FP32; can use FP16
)

# Save the model
torch.jit.save(trt_model, "model.pt")

对于TensorFlow TensorRT,过程基本相同。首先,提取NVIDIA TensorFlow容器,它与TensorRT和TensorFlow TensorRT一起提供。我们制作了一个简短的脚本tf_trt_resnet50.py作为示例。有关更多示例,请参阅TensorFlow TensorRT GitHub repo。

# <xx.xx> is the yy:mm for the publishing tag for the NVIDIA Tensorflow
# container; eg. 21.12

docker run -it --gpus all -v /path/to/this/folder:/resnet50_eg                                                         nvcr.io/nvidia/tensorflow:<xx.xx>-tf2-py3

python tf_trt_resnet50.py


同样,您本质上是在使用TensorFlow TensorRT来使用TensorRT编译您的TensorFlow模型。在幕后,您的模型被分割成包含TensorRT支持的操作的子图,然后进行优化。有关更多信息,请参阅TensorFlow TensorRT文档。

# Load model
model = ResNet50(weights='imagenet')
model.save('resnet50_saved_model') 

# Optimize with tftrt

converter = trt.TrtGraphConverterV2(input_saved_model_dir='resnet50_saved_model')
converter.convert()

# Save the model
converter.save(output_saved_model_dir='resnet50_saved_model_TFTRT_FP32')
 

现在您已经使用TensorRT优化了您的模型,可以继续下一步,设置NVIDIA Triton。

设置NVIDIA Triton推理服务器


NVIDIA Triton推理服务器旨在简化在生产环境中大规模部署模型或模型集合的过程。为了实现易用性和灵活性,使用NVIDIA Triton需要构建一个模型存储库,其中包含模型、用于部署这些模型的配置文件以及其他必要的元数据。

看看最简单的例子。图4有四个要点。config.pbtxt文件(a)是前面提到的配置文件,它包含模型的配置信息。

Figure 4. Setting up NVIDIA Triton workflow

此配置文件中有几个要点需要注意:

  • 名称:此字段定义模型的名称,并且在模型存储库中必须是唯一的。
  • 平台:(c)此字段用于定义模型的类型:是TensorRT引擎、PyTorch模型还是其他模型。
  • 输入和输出:(d)这些字段是必需的,因为NVIDIA Triton需要有关模型的元数据。从本质上讲,它需要网络的输入和输出层的名称以及所述输入和输出的形状。在TorchScript的情况下,由于没有输入层和输出层的名称,请使用input__0。Datatype设置为FP32,输入格式指定为(Channel,Height,Width)3、224、224。


在这一集合中,TensorRT、Torch TensorRT和TensorFlow TensorRT工作流之间有一些细微的差异,这归结为指定平台和更改输入层和输出层的名称。我们为所有三个(TensorRT、Torch TensorRT或TensorFlow TensorRT)制作了示例配置文件。最后,添加经过训练的模型(b)。

现在已经构建了模型存储库,您可以启动服务器。为此,您所要做的就是拉动容器并指定模型存储库的位置。有关使用Kubernetes扩展此解决方案的更多信息,请参阅使用MIG和Kubernete大规模部署NVIDIA Triton。

docker run --gpus=1 --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v                                                      /full/path/to/docs/examples/model_repository:/models                                                                nvcr.io/nvidia/tritonserver:<xx.yy>-py3                                                                                 tritonserver --model-repository=/models


随着服务器的启动和运行,您终于可以构建一个客户端来满足推理请求了!

设置NVIDIA Triton客户端


管道中的最后一步是查询NVIDIA Triton推理服务器。您可以通过HTTP或gRPC请求向服务器发送推理请求。在深入了解细节之前,请安装所需的依赖项并下载一个示例映像。

pip install torchvision
pip install attrdict
pip install nvidia-pyindex
pip install tritonclient[all]

wget  -O img1.jpg "https://bit.ly/3phN2jy"


在这篇文章中,使用Torchvision将原始图像转换为适合ResNet-50模型的格式。客户不一定需要它。我们在triton推理服务器/客户端GitHub repo中有一个更全面的图像客户端和大量为标准用例预制的各种客户端。然而,对于这个解释,我们将介绍一个更简单、瘦得多的客户端来演示API的核心。

好了,现在您已经准备好查看HTTP客户端了(图5)。下载客户端脚本:

Figure 5. Client workflow

构建客户端有以下步骤。首先,在NVIDIA Triton推理服务器和客户端之间建立连接。

triton_client = httpclient.InferenceServerClient(url="localhost:8000")
 

其次,传递图像并指定模型的输入层和输出层的名称。这些名称应该与您在创建模型存储库时构建的配置文件中定义的规范一致。

test_input = httpclient.InferInput("input__0", transformed_img.shape, datatype="FP32")
test_input.set_data_from_numpy(transformed_img, binary_data=True)

test_output = httpclient.InferRequestedOutput("output__0", binary_data=True, class_count=1000)


最后,向NVIDIA Triton推理服务器发送推理请求。

results = triton_client.infer(model_name="resnet50", inputs=[test_input], outputs=[test_output])


这些代码示例讨论了Torch TensorRT模型的细节。不同模型之间(在构建客户端时)的唯一区别是输入和输出层名称。我们使用Python、C++、Go、Java和JavaScript构建了NVIDIA Triton客户端。有关更多示例,请参阅triton推理服务器/客户端GitHub repo。

结论


这篇文章介绍了一个端到端的推理管道,您首先使用TensorRT、Torch TensorRT和TensorFlow TensorRT优化训练模型,以最大限度地提高推理性能。然后,您通过设置和查询NVIDIA Triton推理服务器来进行建模服务。所有软件,包括本教程中讨论的TensorRT、Torch-TensorRT、TensorFlow TensorRT和Triton,今天都可以作为Docker容器从NGC下载。

相关资源

本文地址
最后修改
星期五, 五月 31, 2024 - 09:37
Article