赞
踩
有关 TensorRT 层中 DLA 支持的更多信息,请参阅DLA 支持的层。 trtexec
工具具有在 DLA 上运行网络的附加参数,请参阅trtexec 。
trtexec
在DLA 上运行 ResNet-50 FP16 网络:
./trtexec --onnx=data/resnet50/ResNet50.onnx --useDLACore=0 --fp16 --allowGPUFallback
trtexec
在DLA 上运行 ResNet-50 INT8 网络:
./trtexec --onnx=data/resnet50/ResNet50.onnx --useDLACore=0 --int8 --allowGPUFallback
TensorRT 构建器可以配置为在 DLA 上启用推理。 DLA 支持目前仅限于在 FP16
或 INT8
模式下运行的网络。 DeviceType
枚举用于指定网络或层在其上执行的设备。 IBuilderConfig
类中的以下 API 函数可用于配置网络以使用 DLA:
setDeviceType(ILayer* layer, DeviceType deviceType)
此函数可用于设置层必须在其上执行的设备类型
getDeviceType(const ILayer* layer)
此函数可用于返回该层执行的设备类型。如果层在 GPU 上执行,则返回DeviceType::kGPU
。
canRunOnDLA(const ILayer* layer)
此功能可用于检查层是否可以在 DLA 上运行。
setDefaultDeviceType(DeviceType deviceType)
此函数设置构建器使用的默认设备类型。它确保可以在 DLA 上运行的所有层都在 DLA 上运行,除非setDeviceType
用于覆盖层的deviceType
。
getDefaultDeviceType()
此函数返回由 setDefaultDeviceType
设置的默认设备类型.
isDeviceTypeSet(const ILayer* layer)
此函数检查是否已为该层显式设置了deviceType
。
resetDeviceType(ILayer* layer)
此函数重置此层的deviceType
。如果未指定,该值将重置为由setDefaultDeviceType
或DeviceType::kGPU
指定的设备类型。
allowGPUFallback(bool setFallBackMode)
如果应该在 DLA 上运行的层无法在 DLA 上运行,此函数会通知构建器使用 GPU。有关详细信息,请参阅GPU 回退模式。
reset()
此函数可用于重置IBuilderConfig
状态,它将所有层的deviceType
设置为DeviceType::kGPU
。重置后,构建器可以重新用于构建具有不同 DLA 配置的另一个网络。
IBuilder
类中的以下 API 函数可用于帮助配置网络以使用 DLA:
getMaxDLABatchSize()
此函数返回 DLA 可以支持的最大批量大小。
注意:对于任何张量,索引维度的总体积加上请求的批量大小不得超过此函数返回的值。
getNbDLACores()
此函数返回用户可用的 DLA 内核数。
如果构建器不可访问,例如在推理应用程序中在线加载计划文件的情况下,则可以通过对 IRuntime
使用 DLA 扩展以不同方式指定要使用的DLA 。 IRuntime
类中的以下 API 函数可用于配置网络以使用 DLA:
getNbDLACores()
此函数返回用户可访问的 DLA 内核数。
setDLACore(int dlaCore)
要在其上执行的 DLA 内核。其中dlaCore
是介于0和getNbDLACores() - 1
之间的值。默认值为0
getDLACore()
运行时执行分配到的 DLA 核心。默认值为 0。
本节提供有关如何在启用 DLA 的情况下运行 TensorRT 示例的详细信息。
位于 GitHub 存储库中的sampleMNIST
演示了如何导入经过训练的模型、构建 TensorRT 引擎、序列化和反序列化引擎,最后使用引擎执行推理。
该示例首先创建构建器:
auto builder = SampleUniquePtr<nvinfer1::IBuilder>(nvinfer1::createInferBuilder(gLogger));
if (!builder) return false;
builder->setMaxBatchSize(batchSize);
然后,启用GPUFallback模式:
config->setFlag(BuilderFlag::kGPU_FALLBACK);
config->setFlag(BuilderFlag::kFP16); or config->setFlag(BuilderFlag::kINT8);
在 DLA 上启用执行,其中dlaCore指定要在其上执行的 DLA 内核:
config->setDefaultDeviceType(DeviceType::kDLA);
config->setDLACore(dlaCore);
通过这些额外的更改,sampleMNIST 已准备好在 DLA 上执行。要使用 DLA Core 1 运行 sampleMNIST,请使用以下命令:
./sample_mnist --useDLACore=0 [--int8|--fp16]
在这个例子中,让我们创建一个包含输入、卷积和输出的简单网络。
1.创建构建器、构建器配置和网络:
IBuilder* builder = createInferBuilder(gLogger);
IBuilderConfig* config = builder.createBuilderConfig();
INetworkDefinition* network = builder->createNetworkV2(0U);
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))
{
config->setFlag(BuilderFlag::kFP16); or config->setFlag(BuilderFlag::kINT8);
builder->setDeviceType(conv1, DeviceType::kDLA);
}
5.标记输出
network->markOutput(*conv1->getOutput(0));
6.将 DLA 内核设置为在以下位置执行:
config->setDLACore(0)
本节列出了 DLA 支持的层以及与每个层相关的约束。
在 DLA 上运行时的一般限制(适用于所有层)
min
、 max
和opt
值必须相等。GpuFallback
, TensorRT可以将DLA网络分成多个部分。否则,TensorRT会发出错误并返回。更多信息,请参考GPU回退模式。注意: DLA 的批量大小是除CHW维度之外的所有索引维度的乘积。例如,如果输入维度为NPQRS ,则有效批量大小为N*P 。
层特定限制
卷积层和全连接层
TensorFormat::kLINEAR
、 TensorFormat::kCHW16
和TensorFormat::kCHW32
的操作,组数必须在[1, 8192]范围内。TensorFormat::kCHW4
的操作,组数必须在[1, 4]范围内。wtBanksForOneKernel + minDataBanks
超过numConvBufBankAllotted
限制16
,则不支持操作,其中 CBUF
是在对输入权重和激活进行操作之前存储输入权重和激活的内部卷积缓存, wtBanksForOneKernel
是一个内核存储最小权重/卷积所需的核元素, minDataBanks
是存储卷积所需的最小激活数据的最小库。伪代码细节如下:wtBanksForOneKernel = uint32(ceil(roundUp(inputDims_c * kernelSize_h * kernelSize_w * (INT8 ? 1 : 2), 128) / 32768.0))
minDataBanks = uint32(ceil(float(entriesPerDataSlice * dilatedKernelHt) / 256.0)) where entriesPerDataSlice = uint32(ceil(ceil(inputDims_c * (INT8 ? 1 : 2) / 32.0) * inputDims_w / 4.0)) and dilatedKernelHt = (kernelSize_h - 1) * dilation_h + 1
FAIL if wtBanksForOneKernel + minDataBanks > 16, PASS otherwise.
反卷积层
FP16
和 INT8
。1x[64, 96, 128]
和[64, 96, 128]x1
之外,内核的尺寸必须在[1, 32]
范围内。[23 - 32]
范围内跨步,因为它们显着减慢了编译速度。池化层
FP16
和 INT8
。kMAX
, kAVERAGE
。[1, 8]
范围内。[0, 7]
范围内。INT8
模式,输入和输出张量标度必须相同。激活层
FP16
和 INT8
。ReLU
、 Sigmoid
、 TanH
、 Clipped ReLU
和Leaky ReLU
。
参数 ReLU 层
ElementWise 层
FP16
和 INT8
。Sum
、 Sub
、 Product
、 Max
和Min
。注意:在 Xavier 上,TensorRT 将 DLA Scale 层和 DLA ElementWise 层与操作Sum连接以支持Sub操作,单个 Xavier DLA ElementWise 层不支持。
Scale层
FP16
和 INT8
。Uniform
、 Per-Channel
和ElementWise
。LRN(局部响应归一化)层
连接层
Resize层
Unary 层
Softmax 层
注意:当使用 TensorRT 在 DLA 上运行 INT8 网络时,建议将操作添加到同一子图中,以通过允许它们融合并为中间结果保留更高的精度来减少在 DLA 上运行的网络的子图上的量化误差。通过将张量设置为网络输出张量来拆分子图以检查中间结果可能会由于禁用这些优化而导致不同级别的量化误差。
如果被标记为在DLA上运行的层不能在DLA上运行,则GPUFallbackMode
设置生成器使用GPU。
由于以下原因,层无法在 DLA 上运行:
如果GPUFallbackMode
设置为false
,则设置为在 DLA 上执行但无法在 DLA 上运行的层会导致错误。但是,将GPUFallbackMode
设置为true
后,它会在报告警告后继续在 GPU 上执行。
同样,如果defaultDeviceType
设置为DeviceType::kDLA
并且GPUFallbackMode
设置为false
,则如果任何层无法在 DLA 上运行,则会导致错误。将GPUFallbackMode
设置为true
时,它会报告警告并继续在 GPU 上执行。
如果网络中的层组合无法在 DLA 上运行,则组合中的所有层都在 GPU 上执行。
DLA 支持设备独有的格式,并且由于矢量宽度字节要求而对其布局有限制。
对于 DLA 输入,支持 kDLA_LINEAR ( FP16 , INT8 )
、 kDLA_HWC4 ( FP16 , INT8 )
、 kCHW16 ( FP16 )
和kCHW32 ( INT8 )
。对于 DLA 输出,仅支持 kDLA_LINEAR ( FP16 , INT8 )
、 kCHW16 ( FP16 )
和kCHW32 ( INT8 )
。对于kCHW16
和kCHW32
格式,如果C不是整数倍,则必须将其填充到下一个 32 字节边界。
对于kDLA_LINEAR
格式,沿W维度的步幅必须最多填充 64 个字节。内存格式等效于维度为[N][C][H][roundUp(W, 64/elementSize)]
的C数组,其中FP16
的elementSize
为 2, Int8
为 1 ,张量坐标为(n, c, h, w)
映射到数组下标[n][c][h][w]
。
对于kDLA_HWC4
格式,沿W
维度的步幅必须是 Xavier 上 32 字节和 Orin 上 64 字节的倍数。
当C == 1
时,TensorRT 将格式映射到本机灰度图像格式。
当C == 3
或C == 4
时,它映射到本机彩色图像格式。如果C == 3
,沿W
轴步进的步幅需要填充为 4 个元素。
在这种情况下,填充通道位于第 4 个索引处。理想情况下,填充值无关紧要,因为权重中的第 4 个通道被 DLA 编译器填充为零;但是,应用程序分配四个通道的零填充缓冲区并填充三个有效通道是安全的。
当C
为{1, 3, 4}
时,填充后的 C'
分别为{1, 4, 4}
,内存布局等价于维度为[N][H][roundUp(W, 32/C'/elementSize)][C']
的C数组, 其中elementSize
对于FP16
为 2,对于Int8
为 1 。张量坐标(n, c, h, w)
映射到数组下标[n][h][w][c]
, roundUp
计算大于或等于W
的64/elementSize
的最小倍数。
使用kDLA_HWC4
作为 DLA 输入格式时,有以下要求:
当EngineCapability
为EngineCapability::kSTANDARD
且 TensorRT 无法为给定的输入/输出格式生成无重构网络时,可以自动将不支持的 DLA 格式转换为支持的 DLA 格式。例如,如果连接到网络输入或输出的层不能在 DLA 上运行,或者如果网络不满足其他 DLA 要求,则插入重新格式化操作以满足约束。在所有情况下,TensorRT 期望数据格式化的步幅都可以通过查询IExecutionContext::getStrides
来获得。
如果您使用单独的 DLA 运行时组件,则可以使用EngineCapability::kDLA_STANDALONE
生成 DLA 可加载项。请参阅相关 DLA 运行时组件的文档以了解如何使用可加载项。
当使用kDLA_STANDALONE
时,TensorRT 为给定的输入/输出格式生成一个无重新格式化的网络。对于 DLA 输入,支持 kLINEAR ( FP16 , INT8 )
、 kCHW4 ( FP16 , INT8 )
、 kCHW16 ( FP16 )
和kCHW32 ( INT8 )
。而对于 DLA 输出,仅支持 kLINEAR ( FP16 , INT8 )
、 kCHW16 ( FP16 )
和kCHW32 ( INT8 )
。对于kCHW16
和kCHW32
格式,建议C通道数等于向量大小的正整数倍。如果C不是整数倍,则必须将其填充到下一个 32 字节边界。
您可以自定义分配给网络中每个可加载的 DLA 的内存池的大小。共有三种类型的 DLA 内存池(有关每个池的描述,请参见枚举类 MemoryPoolType
):
对于每种池类型,使用 API IBuilderConfig::setMemoryPoolLimit
和IBuilderConfig::getMemoryPoolLimit
来设置和查询相关池的大小,以便为每个可加载的 DLA 分配更大的内存池。每个可加载的实际需要的内存量可能小于池大小,在这种情况下将分配较小的量。池大小仅用作上限。
请注意,所有 DLA 内存池都需要大小为 2 的幂,最小为 4 KiB。违反此要求会导致 DLA 可加载编译失败。
Managed SRAM 与其他 DRAM 池的区别主要在于角色的不同。以下是Managed SRAM 的一些值得注意的方面:
在多子图情况下,重要的是要记住池大小适用于每个 DLA 子图,而不是整个网络。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。