前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在NVIDIA Jetson平台上部署深度学习模型需要知道的6个技巧

在NVIDIA Jetson平台上部署深度学习模型需要知道的6个技巧

作者头像
GPUS Lady
发布2022-03-04 12:16:26
2.6K0
发布2022-03-04 12:16:26
举报
文章被收录于专栏:GPUS开发者

本文整理自讲座:

演讲者为:

功能强大的低能耗设备的引入引发了可以在边缘运行的高级 AI 方法的新时代。但是由于与边缘设备相关的严格限制,在边缘训练和部署深度学习模型可能会令人生畏。您如何构建一个不太复杂或太大而无法在边缘设备上运行的模型,但仍能充分利用可用硬件?NVIDIA Jetson是当今最受欢迎的低功耗边缘硬件系列之一。它旨在加速边缘硬件上的深度学习模型,无论是机器人、无人机、物联网设备还是自动驾驶汽车。

是什么让 Jetson 上的深度学习变得困难?

在最好的情况下,深度学习并不是那么容易做好,但由于环境受限,Jetson 上的深度学习带来了额外的复杂性。在操作系统、驱动程序、计算资源、内存、测试和调优方面,边缘硬件设备根本不具备云计算机中的灵活性。“照常”工作必然会导致部署失败和延迟。通过更好地了解限制以及如何克服它们,您将能够从模型中获得更多收益。

对于深度学习工程师和 AI 从业者来说,使用 Jetson 存在三个主要问题。首先,硬件非常严格。它不允许您使用单个命令安装或连接到您喜欢的工具。这使得设置环境和运行事物变得更加困难。

其次,充分利用 Jetson 的力量是困难的。在某些情况下,您希望连接尽可能多的物联网传感器或设备,以降低硬件成本。在其他情况下,例如自动驾驶汽车,您希望最大化可以安装在单个 Jetson 设备上并实时运行(就内存而言)的模型实例的数量。

您需要根据连接到设备的传感器数量确定分发模型的最佳方式以及它们运行的进程。连接的 IoT 传感器或设备的数量直接影响 Jetson 设备的 IO,因此在搜索最佳进程和线程数时应考虑并发最佳点。

第三,对于批量大小、图像分辨率、模型大小或同时输入的数量等部署参数没有严格的规定。Jetson 的限制使得很难为生产和部署参数找到合适的调优,从而优化计算能力和内存空间。

面对所有这些限制,您如何在 Jetson 上工作并按照您在云上的方式进行尝试?

技巧1:配置您的 jetson 设备以获得最佳性能

在生产应用程序上运行基准测试之前,您绝对应该配置 Jetson 设备以获得最佳性能, 如果您还没有完成这一步,那么你的工作就还没开始。这里是一些有用的命令和工具:nvpmodel, tegrastats 和 jetson clocks。nvpmodel 可以用来修改功耗以及打开和关闭cpus,默认模式你可以看到红线是 10 W,这是一种省电模式。只需通过改变 jetson 使用的模式,使用 nvpmodel 我们将延迟从 50 减少到几乎 25,这很友好常数,所以这是你能做的最好的事情。

让我们看看 jetsonstats,输入命令Jetson Stats,你会看到四个 cpu 已关闭。你有几种不同的方式来配置Jetson,就功耗而言,默认的方式肯定不是最适合你的,你应该在开始工作时考虑这个问题,所以我们需要了解如何配置功耗以及打开或关闭 CPU。

接下来我想为 jetson 优化我的模型,那我如何做呢?

技巧2:为 Jetson 优化模型的运行时

第二个技巧是确保你优化模型以适应jetson的运行时,它可以通过很多技术来完成,比如使用Graph Comiler,比如TensorRT ,它可以在jetson上使用,你可以自己做,但这并不容易,您可以使用量化和修剪以及任何其他方法,这将最大化您的网络性能。让我们看看它是如何工作的以及它对管道有多大好处。

所以在左边你可以看到一个 onox 模型,它是一个基线模型,我希望你注意每秒帧数的 fps,换句话说,这是吞吐量,这是使用 onyx 运行时的基线模型,没有什么特别之处,并且在随机优化的这一步中我想做的是使用 TensorRT 图形编译器,所以在优化之后我将有一个不同的网络来执行相同的任务,但它使用 TensorRT 进行了修改以适应 jetson 的需求在模型本身的并发方面的并行性。让我们看看优化后有什么区别,我们可以看到使用TensorRT后,吞吐量从每秒 18 帧到每秒 47 帧,延迟从 54毫秒到 21 毫秒,所以我们看到模型在优化之前和之后的行为不同,它对性能有很大的影响。

注意,今天我希望我们检查和讨论除模型本身之外的任何东西,它是关于工程,而不是关于设计模型和网络本身,它是关于从环境和其他参数中提高性能。

技巧3:为您的推理管道校准生产参数

我们的第三个技巧是校准您的生产参数,如果对于您的推理管道,第一个变量是批量大小,与云 gpus 不同,越高并不是代表越好,如果我们使用 swag 文件,我们在 jetson 上会遭遇瓶颈问题 和内存交换等等。

让我们看看 Yolo v5 和各种 Batch 大小的吞吐量,每个条都是不同进程和线程的实验,我唯一没有在这些颜色之间改变的是批量大小,蓝色代表批量大小是1,红色的是批量大小 2,绿色是批量大小为4,紫色是 8。这些都是需要不断重复实验。

当提到Bach大小的时候,我要强调的是,并不是越大越好。

我们如何在不拥有jetson设备的情况下评估模型的性能?有时候我们还会争论需要哪种jetson,是nano还是Xavier NX?所以最好是在不购买的情况下在每台设备上运行并了解模型的全部功能,这样我们就清楚要购买哪种Jetson产品了。如何做到呢?我们使用Deci lab( https://deci.ai/platform/ ),我们有两个优化目标 jetson xavier 和 jetson nano , 所以您可以使用免费社区版本来完成这一切,它将自动找到最佳生产设置,例如批量大小量化水平,您可以优化 jetson NANO 和xavier NX的模型。这个平台是免费的,所以你不必拥有一个设备就可以做到这一点 。

所以我们明白了,批量大小会影响性能,这一步可以自动化,现在让我们看看线程如何影响选定批量大小的吞吐量。

因此,我们看看同一个模型,批量大小为 1, process为 3 的比较,这不仅适用于 jetson。我们将线程数从 16 增加到 32 ,吞吐量增加了 17倍。所以我们已经看到线程严重影响管道性能,那么并行性和多处理呢,所以这里的事情是我们需要找到进程和线程的最佳组合,好吧,这没有答案,你必须做的事情是通过反复试验和试错来获得经验。

线程和进程的数量——最佳配置(也就是如何组合)通常是通过反复试验来实现的。他们必须和谐相处,协同工作,这样他们就不会互相干扰。尽量使这个过程自动化,因为这对于在 Jetson 上进行最佳部署至关重要。

所以这第三个参数实际上是关于线程和进程两者的组合,我们自动化了这些步骤,我们推断操作系统和外部环境并选择运行的最佳组合,在这种情况下,我们发现三个process和六个线程是 ResNet18 的最佳选择。不知道为什么,但它在整个实验过程中都优于其他所有方法,除非您重复试验和试错,否则您无法获得最佳位置,因此您应该自动执行此步骤。

技巧4:对您的应用程序进行端到端管道的基准测试

我们想了解什么是数字均值以及我们如何计算给定模型的吞吐量,因此您应该对所有内容进行端到端基准测试,您不应该只关注推理时间, 你很容易忘记推理不是我们在生产中唯一做的事情,实际上还有很多其他的过程,比如预处理、后处理和数据加载、数据复制以及除了推理之外的很多其他事情,它们都是重复的,它们在一秒钟内发生了很多很多次,这就是为什么我建议对所有内容进行端到端的基准测试,并且也分别对所有内容进行基准测试,我们要看看一秒钟内都发生了什么。注意,Jetson的行为不同来自云机器,所以我最想让你记住的一件事是你不能基于云机器的基准来确定它在 Jetson 设备上的行为,它根本不能这样工作, 所以最好使用 jtop 来实时了解管道的行为方式以及应用程序内部发生的情况,并且您应该分别对每个指标进行基准测试,我们想要测量从 cpu 到 gpu 的复制,以及推理本身和复制回 cpu 到 ram 到 cpu 内存。当然,我们还想计算我们从磁盘或网络读取并写入结果所花费的时间,无论是将标签写入http请求还是将其传递给另一个模型等,但是此步骤在给定时刻发生很多次,您希望能够在此步骤上有很好的可见性,这非常重要。

在上图中detect.py脚本,它是Yolo V5存储库的官方脚本,我希望你主要区分对象创建和内存复制.

运行torch.numpy需要375纳秒,而传输到gpu(CUDA) 却需要七毫秒。当您复制数据时,会发生同样的情况,您可以查看复制单个图像需要多少时间,64 批量大小的帧,可能需要 10 毫秒,一些 YOLO 模型推理所需的时间仍然少于该值,因此这意味着数据加载及复制可能是您管道中最重要的部分(最费时的部分),因此我们必须特别了解该领域,我可以给出的两个建议是要区分对象创建和内存拷贝。

技巧5:使用并发代码和多进程

提高代码优化的一种方法是使用并发代码并允许多个进程同时运行。这使应用程序可以一次对更多图像进行分析,而不是一次只分析一张。

-不要被逐行运行的类似 Python 的思维方式所束缚,尽可能使用异步方法。Python 是一种解释型语言,我们经常使用它来实现推理,但我们很少使用它来实现同时使用多个 CPU 内核的多进程解决方案。

-如果您想要更好的吞吐量,请选择更多的并行度。您的进程可以生成多个进程,其中每个进程将模型加载到 GPU,每个模型在其中独立运行推理。

-不要总是追求更大的批量。一种方法是使用线程通过同一进程运行多个(较小的)并发批处理。一次分派多个(较小的)推理请求可能比使用具有更高批量大小的单个请求更好地利用硬件。运行多个(较小的)并发批次可以增加整体吞吐量,因为它使用多个线程和 CPU 内核,但任何给定批次的平均延迟都会增加。

-花点时间根据进程数量(即加载数据、推理、后处理)和客户端线程,为您的应用程序找到最佳管道。如果您使用 Python(而且您很可能是),您可以利用Python 多处理模块来启用并行/异步代码执行。

Tip6:使用容器在 Jetson 上开发和测试您的应用程序

由于很难创建可重现的环境,我们发现最好的解决方法是在 Jetson 上开发和测试应用程序时使用容器。

-使用Swap文件。尽管这可能会稍微影响您获得准确速度读数的能力,但它有助于提高设备的容错能力。

-请记住为您的版本使用默认的 Python 解释器,以便消除与其他 Python 版本相关的任何风险。例如,在 python!=3.6 中使用 TensorRT 会失败,因为 TensorRT 被编译为仅与 Python 3.6 兼容的 .so 库。

-Jetson 基于 ARM,其行为与云机器不同。大多数深度学习库的安装都不能开箱即用,因为它们没有预构建的二进制文件。使用容器构建和运行开发环境,让您原有的 JetPack 环境和操作系统不会受到您的工作的影响。这将使您的日常工作更轻松。

-可以在安装了旧 JetPack 的 Jetson 上运行新的官方 docker 映像。但是你需要小心这个。例如,TensorRT(和 Jetson 设备驱动程序)仍将使用裸机 JetPack 固件。出于这个原因,仔细检查您的 JetPack 版本很重要,即使在您的整个环境中都使用了 docker。

更多讲座整理:

NVIDIA JetPack 4.6你不知道的功能

使用 NVIDIA Fleet Command 在边缘部署和管理应用程序

零售端部署高精度AI计算机视觉应用程序的新方法

启用 AI 的视频分析如何提高机场运营效率

更多讲座预告:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 是什么让 Jetson 上的深度学习变得困难?
    • 技巧1:配置您的 jetson 设备以获得最佳性能
      • 技巧2:为 Jetson 优化模型的运行时
        • 技巧3:为您的推理管道校准生产参数
          • 技巧4:对您的应用程序进行端到端管道的基准测试
            • 技巧5:使用并发代码和多进程
              • Tip6:使用容器在 Jetson 上开发和测试您的应用程序
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档