释放NVIDIA Jetson DLA的潜力:用户问题汇总(1)

2023-11-13 20:39:10 浏览数 (2)

问:为什么DLA和GPU一起使用时运行速度会变慢,即使DLA模型全部是在DLA中转换的?

答:在使用GPU和不使用GPU时的性能如何?我们测试了您的模型,在不使用GPU和使用GPU的情况下,DLA的运行时间分别为139.415毫秒和162.466毫秒。虽然该模型可以在DLA上部署,但内存和带宽是共享的。您是否愿意首先使用我们的性能分析工具检查回归是否来自数据输入/输出呢?您可以比较推理块和内存块的执行时间。通常,与内存相关的函数的名称会像"cudaMemcpy"这样。在运行TensorRT时需要进行一些内存传输或复制操作。您是否对应用程序进行了性能分析?您应该能够在性能分析工具中找到一些与内存相关的任务。

问:我正在测试AGX Orin的NVDLA。神经网络推理的结果明显比Xavier-AGX和Xavier-NX慢?测试结果如下:

System details: Xavier AGX ORIN Developer KIT Power mode: MAXN nv_tegra_release output: # R34 (release), REVISION: 1.0 Tensort 8.4.0

Results comparison(Orin vs Xavier AGX): Alexnet: 78ms vs 30 ms Googlenet: 8.02ms vs 5.5ms Vgg-19: 49.8ms vs 22ms

答:Orin的DLA具有更多的int8密集TOPs,但较少的fp16 TOPs。因此,如果以int8模式运行模型,预计与Xavier的DLA相比,性能会更好。我建议使用启用INT8精度的模型进行测试。

另外,我们现在有以下GitHub项目(https://github.com/NVIDIA-AI-IOT/jetson_dla_tutorial),可以帮助您开始使用DLA。它涵盖了定义和分析模型、调整模型以提高DLA兼容性以及执行INT8校准的内容。这可能有助于您了解与DLA一起工作相关的一些概念。

问:我们想要使用GPU DLA。在将ONNX转换为TensorRT模型时,如何使用DLA?是否有Python示例?

答:你可以参考这个帖子:https://forums.developer.nvidia.com/t/accessing-jetsons-dla-from-python/149036/3

如果你想确认你的DLA是有在工作的,可以通过检查TensorRT log,比如:

代码语言:javascript复制
TRT_LOGGER = trt.Logger(trt.Logger.INFO)

def build_engine():
    """Takes an ONNX file and creates a TensorRT engine to run inference with"""
    EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
    with trt.Builder(TRT_LOGGER) as builder, 
    ...

那么你会看到以下详细的层次放置信息:

代码语言:javascript复制
…
[07/12/2021-13:54:22] [I] [TRT] --------------- Layers running on DLA:
[07/12/2021-13:54:22] [I] [TRT] {Convolution28}, {ReLU32,Pooling66,Convolution110}, {ReLU114,Pooling160}, {Plus214},
[07/12/2021-13:54:22] [I] [TRT] --------------- Layers running on GPU:
[07/12/2021-13:54:22] [I] [TRT] (Unnamed Layer* 0) [Constant]   Times212_reshape1, (Unnamed Layer* 16) [Constant]   shuffle_(Unnamed Layer* 16) [Constant]_output, (Unnamed Layer* 3) [Constant]   (Unnamed Layer* 4) [Shuffle]   Plus30, (Unnamed Layer* 9) [Constant]   (Unnamed Layer* 10) [Shuffle]   Plus112, Times212_reshape0, Times212, shuffle_Times212_Output_0,
…

问:我定义了自己的网络,然后进行了以下操作: TensorFlow模式 → ONNX → ONNX解析器(C 推理) 如果不使用 ::enableDLA(builder.get(), config.get(), mParams.dlaCore); 我几乎获得了100毫秒的加速。 如果使用此代码,意味着使用DLA核心,但一些层在DLA上运行,而另一些在GPU上运行。 我现在不知道为什么会有这种巨大的差异。 可能是在DLA和GPU之间的内存复制有关,我猜测。

答:您是否首先启用了设备性能?

代码语言:javascript复制
$ sudo nvpmodel -m 0
$ sudo jetson_clocks

请注意,DLA的资源有限,因此某些操作需要等待资源。memory可以通过EGLStreams在GPU和DLA之间共享,因此在TensorRT推理中没有memory复制。可以参考一下这篇blog:https://developer.nvidia.com/blog/nvidia-jetson-agx-xavier-32-teraops-ai-robotics/

对于NX,每个DLA为4.5 TOPS,GPU为12.3 TOPS。请注意,DLA的目标是将GPU任务offload以便让GPU处理其他问题。DLA的性能与模型大小相关,因为DLA的容量远远小于GPU。

问:我正在尝试设置TensorRT进行矩阵乘法,以更好地了解如何在Jetson Xavier板上使用DLA。出于某种原因,使用Tegrastat,我无法看到DLA的任何使用情况,并且返回的矩阵全为零。我想知道是否使用Tegrastat是正确的工具,以及是否正确使用TensorRT来使用DLA。希望有人能给我一些见解。

答:抱歉,tegrastats不支持DLA监测。以下是两种可能的参考方法:

1.请使用NVIDIA Nsight System来测量在DLA上运行了多少工作负载:https://developer.nvidia.com/nsight-systems‍‍‍‍

2.您还可以检查设备节点,以确定DLA是否处于活动状态。

对于DLA-0:

代码语言:javascript复制
cat /sys/devices/platform/host1x/15880000.nvdla0/power/runtime_status

对于DLA-1:

代码语言:javascript复制
cat /sys/devices/platform/host1x/158c0000.nvdla1/power/runtime_status

Ex:

代码语言:javascript复制
nvidia@jetson-0330618100118:~$ cat /sys/devices/platform/host1x/158c0000.nvdla1/power/runtime_status
active
nvidia@jetson-0330618100118:~$ cat /sys/devices/platform/host1x/158c0000.nvdla1/power/runtime_status
suspended

问:这个问题涉及TensorRT在DLA上的使用。是否有一种方式可以在DLA和GPU上并发执行模型的部分?也就是说,我想通过将每个操作映射到GPU、DLA0和DLA1来利用DNNs中的操作并发性。是否有可能执行这种操作?能否提供执行这种操作的示例代码?对于任何帮助/指引,我将非常感激。例如,在下面给出的示例DNN中,我想在GPU、DLA0和DLA1上同时执行三个卷积。

答:您可以尝试使用TensorRT API手动构建网络:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#create-network-def-scratch

然而,由于GPU和DLA在不同的位置存储中间张量,这可能导致一些额外的内存传输开销。

TensorRT存储库中有几个辅助工具。请检查它们中的一个是否能满足您的要求:https://github.com/NVIDIA/TensorRT/tree/main/tools

0 人点赞