您已经构建、训练、调整和调整了您的模型。最后创建一个满足您需求的TensorRT、TensorFlow或ONNX模型。现在需要一个可部署到数据中心或云的推理解决方案。您的解决方案应该优化使用可用的gpu,以获得最大的性能。也许还存在其他需求,比如需要A/B测试功能或支持具有多个同类或异构gpu的服务器的能力。输入TensorRT推理服务器。
新的NVIDIA TensorRT推理服务器可以帮助您解决这个问题。TensorRT推理服务器是英伟达TensorRT推理平台的一部分,它提供了一个新的软件解决方案,扩展了模型和框架的实用性,提高了gpu和cpu的利用率。基于NVIDIA Docker, TensorRT推理服务器容器封装了在云中部署高性能推理服务器所需的所有内容,如图1所示。本文描述了即将发布的容器版本(18.09)中的一些新特性,该版本将很快可用。该容器的18.08.1版本现在也可以从NVIDIA GPU Cloud中获得,您可以在今天进行实验。只需确保更改下面的命令,以反映您正在使用的容器的版本。

图1所示TensorRT推理服务器支持灵活部署推理模型
让我们来看看推理服务器,看看它如何成为高性能、gpu加速的生产推理解决方案的基础。
获取TensorRT推理服务器容器在使用推理服务器容器之前,需要安装一些软件,比如Docker。您将在安装Docker和NVIDIA Docker部分的NVIDIA Docker博客文章中找到有关这方面的详细信息。
该容器可从NVIDIA GPU Cloud (NGC)容器注册中心获得。推理服务器每月更新一次,所以一定要获取容器的最新版本。您可以将容器拖放到本地系统中,或者使用NGC容器支持的任何平台。
$ docker pull nvcr.io/nvidia/tensorrtserver:18.09-py3
下载容器之后,就可以快速查看它的内容了。让我们在容器中启动一个bash shell。
$ nvidia-docker run -it --rm nvcr.io/nvidia/tensorrtserver:18.09-py3
/opt/tensorrtserver目录包含推理服务器可执行文件- /opt/tensorrtserver/bin/trtserver -以及共享库。你可以看到可用的选项运行:
$ trtserver --help
如果您正在使用18.08.1版本,请使用nvcr.io/nvidia/inferenceserver:18.08.1-py3容器,并在/opt/inference_server/bin/inference_server中找到trtserver。
要运行trtserver,您需要设置一个模型存储库。我们来看看怎么做。
TensorRT推理服务器模型存储库TensorRT推理服务器用于推理的模型集位于模型存储库中。您可以创建一个模型存储库,并使用TensorRT、TensorFlow和Caffe2模型的任意组合填充它。每个模型可以包含一个或多个版本。您不能在trtserver运行时更改模型存储库中的模型,但是您可以用更新的模型替换这些模型的旧版本。Trtserver自动识别这些更改。
让我们从最简单的情况开始,然后对其进行增强,以显示额外的功能。首先,看一下模型存储库的一般格式。模型存储库位于文件系统的目录中;假设目录是/tmp/models。您将在父目录中为每个模型找到一个子目录,其中子目录名与模型名匹配。每个模型子目录包含一个配置文件config。和一个或多个数值子目录,每个子目录包含模型的一个版本。
例如,如果您有一个名为“mymodel”的TensorRT模型,它只有一个版本,即版本3,那么您的模型存储库如下:
/tmp/models
mymodel/
config.pbtxt
3/
model.plan
这是一个最小的模型存储库。模型配置,config.pbtxt,为trtserver和模型提供模型元数据。 model.plan是实际的TensorRT模型定义。让我们更详细地讨论这两个问题。
模型配置模型存储库中的每个模型都必须包含一个配置。包含模型配置信息的pbtxt文件。必须使用ModelConfig模式将模型配置指定为protobuf文本。您可以查看该文件以找到所有可能值的描述;现在,让我们使用下面的示例来研究最重要的特性。示例配置是用于
https://github.com/caffe2/models/tree/master/resnet50name: "resnet50_netdef"
platform: "caffe2_netdef"
max_batch_size: 128
input [
{
name: "gpu_0/data"
data_type: TYPE_FP32
format: FORMAT_NCHW
dims: [ 3, 224, 224 ]
}
]
output [
{
name: "gpu_0/softmax"
data_type: TYPE_FP32
dims: [ 1000 ]
}
]
name字段定义模型的名称。您可以给您的模型起任何您喜欢的名字,但是它必须在模型存储库中是唯一的。名称必须与包含此配置的模型子目录的名称匹配。在向trtserver发出推理请求时,您将使用这个名称引用模型。
platform字段告诉trtserver此模型的类型。在本例中,这是一个使用NetDef格式caffe2模型。
max_batch_size字段控制trtserver允许推理的最大批处理大小。模型定义可能支持更大的批处理大小,但是任何推理请求都将仅限于此值。
输入字段是执行推理所需的输入列表。在本例中,您只能看到一个名为gpu_0/data的输入。data_type和dims字段表示如何解释输入tensors。可选的format字段帮助trtserver和客户机理解输入所表示的内容。在本例中,FORMAT_NCHW表示输入tensors以CHW(通道、高度、宽度)格式表示图像。
输出字段与输入类似,只是format字段当前不可用。您必须指定至少一个输出,但是您应该只列出希望由trtserver公开的模型输出。在执行推理时,服务器只允许请求这些输出。
您还将在ModelConfig模式中看到模型实例、模型版本策略和模型计算能力。下面我将介绍一些更高级的配置选项。
TensorFlow模型TensorFlow通过以下两种方式之一保存训练过的模型:GraphDef和SavedModel;TensorRT推理服务器支持这两种格式。一旦在TensorFlow中有了一个经过训练的模型,您就可以直接将它保存为GraphDef,或者使用freeze_graph之类的脚本将其转换为GraphDef。,或者使用SavedModelBuilder或tf.saved_model.simple_save将其保存为SavedModel。
TensorFlow 1.7和稍后的版本集成了TensorRT,使TensorFlow模型能够受益于TensorRT提供的推理优化。因为trtserver支持使用TensorRT优化过的TensorFlow模型,所以可以像其他TensorFlow模型一样提供这些模型。
模型存储库中有一个配置文件,模型定义文件是GraphDef文件或SavedModel目录。
/tmp/models
graphdef_model/
config.pbtxt
1/
model.graphdef
在配置文件中将platform字段设置为tensorflow_graphdef或tensorflow_savedmodel,以指示模型定义格式分别为TensorFlow GraphDef或SavedModel。
Caffe2模型推理服务器支持NetDef格式的caffe2模型。NetDef模型定义分为两个文件:初始化网络和预测网络。这两个文件都必须存储在模型存储库的版本目录中。例如:
/tmp/models
netdef_model/
config.pbtxt
1/
init_model.netdef
model.netdef
您在配置文件中将platform字段设置为caffe2_netdef,以指示模型定义格式为Caffe2 NetDef.
TensorRT模型推理服务器支持TensorRT模型格式,称为TensorRT计划。TensorRT计划与其他受支持的模型格式不同,因为它是特定于gpu的。生成的TensorRT计划适用于特定的GPU——更准确地说,是特定的CUDA计算能力。例如,如果您为NVIDIA P4(计算能力6.1)生成计划,则不能在NVIDIA Tesla V100(计算能力7.0)上使用该计划。
如果您的数据中心同时拥有P4和Tesla v100,并且希望同时使用它们进行推理,那么该怎么办?如何为一个模型提供多个计划?尽管前面的模型存储库示例没有显示它,但是您可以为任何模型版本提供多个模型定义文件,并将每个文件与不同的计算能力关联起来。例如,如果您同时具有TensorRT模型的计算能力6.1和7.0版本,您可以将它们都放在该模型的version子目录中。
/tmp/models
plan_model/
config.pbtxt
1/
model_6_1.plan
model_7_0.plan
然后使用模型配置来指示哪个模型定义与哪个计算能力相关联,trtserver在运行时选择与GPU计算能力匹配的模型版本。
name: "plan_model"
platform: "tensorrt_plan"
max_batch_size: 16
input [
{
name: "input"
data_type: TYPE_FP32
dims: [ 3, 224, 224 ]
}
]
output [
{
name: "output"
data_type: TYPE_FP32
dims: [ 10 ]
}
]
cc_model_filenames [
{
key: "6.1"
value: "model_6_1.plan"
}
{
key: "7.0"
value: "model_7_0.plan"
}
]
ONNX模型目前,trtserver不能直接使用ONNX模型进行推理。但是,由于trtserver同时支持TensorRT和Caffe2模型,您可以采用两种方法之一将ONNX模型转换为受支持的格式。
可以使用TensorRT中包含的ONNX解析器或ONNX的开源TensorRT后端,将ONNX模型转换为TensorRT计划。一旦有了TensorRT计划,就可以将该计划添加到上面描述的模型存储库中。另一个选项是将ONNX模型转换为咖啡因2 NetDef,这将生成一个可以添加到模型存储库中的NetDef模型。