NVIDIA DLA(深度学习加速器,Deep Learning Accelerator)是一款针对深度学习操作的固定功能加速器引擎。DLA旨在对卷积神经网络进行全硬件加速。DLA支持各种层,如卷积,反卷积,完全连接,激活,池化,批量标准化等。
有关TensorRT图层中DLA支持的更多信息,请参阅6.2节DLA支持的图层。trtexec工具具有在DLA上运行网络的其他参数,请参阅命令行包装器。要使用trtexec在DLA上运行AlexNet网络,请使用:
./trtexec --deploy=data/AlexNet/AlexNet_N2.prototxt --output=prob --useDLACore=1 --fp16 --allowGPUFallback
可以配置TensorRT构建器以启用在DLA上进行推断。 DLA目前仅支持在FP16模式下运行的网络。DeviceType枚举用于指定网络或层将在其上执行的设备。IBuilder类中的以下API函数可用于配置网络以使用DLA:
本节提供有关如何在启用DLA的情况下运行TensorRT示例的详细信息。sampleMNIST示例演示了如何导入训练好的Caffe模型,构建TensorRT引擎,序列化和反序列化引擎,最后使用引擎执行推理。
该示例首先创建builder:
auto builder =SampleUniquePtr(nvinfer1::createInferBuilder(gLogger));
if (!builder) return false;
builder->setMaxBatchSize(batchSize);
builder->setMaxWorkspaceSize(16_MB);
然后,启用GPUFallback模式:
builder->allowGPUFallback(true);
builder->setFp16Mode(true);
在DLA上启用执行,其中deviceType指定要在其上执行的DLA核心:
builder->setDefaultDeviceType(deviceType);
通过这些额外的更改,sampleMNIST已准备好在DLA上执行。要使用DLA运行sampleMNIST,请使用以下命令:
./sample_mnist --useDLACore=1
在这个例子中,让我们用输入、卷积和输出层创建一个简单的网络。
1.创建builder和网络:
IBuilder* builder = createInferBuilder(gLogger);
INetworkDefinition* network = builder->createNetwork();
2.将“输入”层添加到网络,指定输入维度。
auto data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{1, INPUT_H,INPUT_W});
3.添加具有隐藏层输入节点,步幅和权重的卷积层,用于过滤和偏差。
auto conv1 = network->addConvolution(*data->getOutput(0), 20, DimsHW{5, 5},weightMap["conv1filter"], weightMap["conv1bias"]);
conv1->setStride(DimsHW{1, 1});
4.将卷积层设置为在DLA上运行:
if(canRunOnDLA(conv1))
{
builder->setFp16Mode(true);
builder->setDeviceType(conv1, DeviceType::kDLA);
}
5.标记输出:
network->markOutput(*conv1->getOutput(0));
6.将DLA引擎设置为执行:
engine->setDLACore(0)
本节列出了DLA支持的层以及与每个层关联的约束。
在DLA上运行时的一般限制(适用于所有层):
指定层的限制:
卷积和反卷积层
池化层:
激活层:
逐元素操作层:
scale层:
LRN(局部响应规范化)层:
连接层:
如果标记为在DLA上运行的层无法在DLA上运行,GPUFallbackMode会将builder设置为使用GPU。由于以下原因,层可能无法在DLA上运行:
如果GPUFallbackMode设置为false,则设置为在DLA上执行的层(但其无法在DLA上运行)将导致错误。但是,将GPUFallbackMode设置为true后,它会在报告警告后继续在GPU上执行。
同样,如果defaultDeviceType设置为DeviceType :: kDLA且GPUFallbackMode设置为false,则如果任何层无法在DLA上运行,则会导致错误。将GPUFallbackMode设置为true,它将报告警告并继续在GPU上执行。
在创建包含优化后的推理模型的计划文件后,可以将该文件部署到生产环境中。如何创建和部署计划文件取决于您的环境。例如,您可能为模型提供了一个专用推理可执行文件,用于加载计划文件,然后使用TensorRT执行API将输入传递给模型,执行模型以执行推理,最后从模型中读取输出。
本节讨论如何在一些常见的部署环境中部署TensorRT。
用于推理的一种常见云端部署策略是通过为模型实现HTTP REST或gRPC端点的服务器公开模型。然后,远程客户端可以通过向该端点发送格式正确的请求来执行推理。请求将选择模型,提供模型所需的必要输入张量值,并指出应计算哪些模型输出。
要在此部署策略中利用TensorRT优化模型,不需要进行任何根本性更改。必须更新推理服务器以接受由TensorRT计划文件表示的模型,并且必须使用TensorRT执行API来加载和执行这些计划。可以在“推理服务器容器发行说明”和“推理服务器用户指南”中找到为推理提供REST终结点的推理服务器示例。
TensorRT还可用于将经过训练的网络部署到嵌入式系统,如NVIDIA Drive PX。在这种情况下,部署意味着在嵌入式设备上运行的软件应用程序中使用网络,如目标检测或映射服务。将经过训练的网络部署到嵌入式系统涉及以下步骤:
1.将训练好的网络导出为UFF或ONNX等可导入TensorRT的格式(有关详细信息,请参阅第八章使用深度学习框架)。
2.编写一个程序,使用TensorRT C ++ API将训练好的网络导入,优化和序列化为计划文件(请参阅第八章 – 使用深度学习框架,第五章 – 使用混合精度,以及第2.5节 – 在C ++中执行推理)。出于讨论的目的,我们将此程序称为make_plan。
3.在部署到目标系统之前,在主机系统上构建并运行make_plan以验证训练的模型。
4.将训练好的网络(和INT8校准缓存,如果适用)复制到目标系统。在目标系统上重新构建并重新运行make_plan程序以生成计划文件。
make_plan程序必须在目标系统上运行,才能为该系统正确优化TensorRT引擎。但是,如果在主机上生成了INT8校准高速缓存,则在生成引擎时,构建器可以在目标上重新使用高速缓存(换句话说,不需要在目标系统本身上进行INT8校准)。
在嵌入式系统上创建计划文件后,嵌入式应用程序可以从计划文件创建引擎,并使用TensorRT C ++ API对引擎执行推理。有关更多信息,请参阅2.5节在C ++中执行推理。
要了解在嵌入式系统上部署TensorRT引擎的典型用例,请参阅: