0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LibTorch-based推理引擎优化内存使用和线程池

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-08-31 14:27 次阅读

由喜马拉伊·莫汉拉尔·乔里瓦尔、皮埃尔-伊夫·阿基兰蒂、维韦克·戈温丹、哈米德·舒贾纳泽里、安基思·古纳帕勒、特里斯坦·赖斯撰写

大纲大纲

在博客文章中,我们展示了如何优化基于 LibTorrch 的推论引擎,通过减少记忆用量和优化线状组合战略来最大限度地增加吞吐量。 我们将这些优化应用到音频数据模式识别引擎,例如音乐和语音识别或声波指纹。 本博客文章中讨论的优化使得内存使用率减少了50%,推论端到端的延迟度减少了37.5%。 这些优化适用于计算机视觉和自然语言处理。

音频识别推断

音频识别(AR)引擎可用于识别和识别声音模式。 例如,识别鸟类与录音的种类和种类,区分音乐与歌手的声音,或检测显示建筑物有异常故障的声音。 为了识别有兴趣的声音,AR引擎将音频处理到4个阶段:

文件校验:AR 引擎验证输入音频文件。

采掘:从音频文件中的每个部分提取特征。

推断: LibTorrch 使用 CPU 或加速器进行推论。就我们的情况而言,在 Elastic Cloud 计算( EC2) 实例中,使用 Intel 处理器进行推论。

后处理:后处理模式解码结果并计算用来将推断输出转换成标记或记录誊本的分数。

在这4个步骤中,推论是计算最密集的,根据模型的复杂性,推论可以占管道处理时间的50%,这意味着现阶段的任何优化都会对整个管道产生重大影响。

最优化音频识别引擎, 使用 conconconconconcondal 货币... 并不简单

输入数据是一个音频文件,由几个短声段组成(图1中的S1至S6),输出数据与按时间戳订购的标记或记录誊本相对应。

wKgZomTv-CGAN5HEAAGCUuVN5SA551.jpg

图1 图1:有段边框的音频文件示例

每一部分可以独立和不按部就班的方式处理,这样就有机会同时处理各部分,同时处理各部分,优化总体推论量,最大限度地利用资源。

实例的平行化可以通过多行( phread: std:: threads, OpenMP) 或多处理来实现。 多处理的多行的好处是能够使用共享的内存。 它使开发者能够通过共享线条的数据来尽量减少线条上的数据重复; 我们的 AR 模型( 以我们为例) ( AR 模型) 。图2 图2此外,记忆力的减少使我们能够通过增加引擎线的数量,同时运行更多的管道,以便利用我们亚马逊EC2实例中的所有小CPU(VCPU)。c5.4 宽度我们的情况是,它提供了16 VCPUs。 理论上,我们期望看到我们的AR引擎的硬件利用率更高,输送量更高。

wKgaomTv-CWAMT4uAAEudbJ52UE106.jpg

图2 图2:多读 AR 引擎

但是,我们发现这些假设是错误的。 事实上,我们发现应用程序的线条数量增加导致每个音频段端到端的延迟度增加,引擎输送量减少。 比如,将同值货币从1个线条增加到5个线条导致延缓度增加4x,这对减少吞吐量产生了相应的影响。 事实上,衡量标准显示,在管道内,单是推断阶段的延迟度就比单一线线条基线高出3x。

使用一个剖面文件 我们发现CPU旋转时间由于CPU 过度订阅会影响系统和应用性能,我们可能因此增加。 鉴于我们对应用程序多轨执行的控制,我们选择更深入地潜入堆栈,并找出与 LibTorrch 默认设置的潜在冲突。

深入了解LibTorch的多行及其对同货币的影响

LibTorch 平行执行CPU的推断依据是:全环线串联集合执行实例是跨业务和内部平行,可视模型的特性选择。在这两种情况下,都有可能设定线索数在每个线性孔中 优化潜伏和吞吐量

为了测试LibTorrch的平行默认执行设置是否对我们的推论延缓期产生了反作用,我们用一个35分钟的音频文件对一台16 vCPus机器进行了实验,将LibTorrch的连接线条常数保持在1(因为我们的模型没有使用操作间线条库 ) 。 我们收集了以下数据,如图3和图4所示。

wKgZomTv-GGAZqRGAAFl_Bxjf6o762.jpg

图3 图3:不同数量引擎线索的 CPU 利用率

wKgZomTv-GiABBdJAAFLRrdlQ78245.jpg

图4 图4: 不同数量引擎线索的处理时间

图4中的执行时间是处理给定音频文件所有部分的端到端处理时间。 我们有4个不同配置的 LibTorrch 内部线条内部配置为 1 、 4 、 8 、 16, 并且我们将每条线内配置的引擎线数从1 改为 16。 如图3所示, CPU的利用率随着所有 LibTorrch 内部配置的引擎线数的增加而增加。 但是, 如图4所示, CPU 利用率的增加并没有转化为较低的执行时间。 我们发现, 在除1个案例之外的所有案例中, 发动机线条数量增加, 执行时间也随之增加。 例外的是, 整个线条内库规模增加1 的情况是一个例外。

解决全球线索池问题

与全球线索库使用过多的线索导致性能退化,并造成订阅过多问题。全球连托全球联线人才库,很难与多过程发动机的性能相匹配。

将LibTorrch全球线条库拆解, 简单到将操作内部/操作间平行线线设置为 1, 如下表所示:

:set_num_threads(1) // 禁用内部线条库 :set_ num_interop_threads(1) 。 / 禁用内部线条库 。

如图4所示,当LibTorch全球线条池被禁用时,最低处理时间是测量的。

这一解决方案在若干情况下改善了AR发动机的吞吐量。 然而,在评价长数据集(在负荷测试中超过2小时的Audio文件)时,我们发现发动机的记忆足迹开始逐渐增加。

优化内存使用

我们用两个小时长的音频文件对系统进行了负荷测试,发现观察到的内存增加是多轨LibTorch推论中内存破碎的结果。我们用这个方法解决了这个问题。杰梅洛c,这是一个通用的商场(3)执行,强调避免分散和可缩放的货币支持。使用 Jemalloc我们的峰值内存使用率平均下降了34%,平均内存使用率下降了53%。

wKgZomTv-IOAAjlIAAE0FISO-Hs693.jpg

图5 图5:使用有 Jemalloc 和没有 Jemalloc 的同一输入文件,随着时间的推移内存使用量

摘要摘要

为了优化基于 libTorrch 的多轨 LibTorrch 推断引擎的性能,我们建议核实LibTorrch 中不存在过量订阅问题。 就我们而言,多轨引擎中的所有线条都是共享 LibTorrch 全球线条库,这造成了一个过量订阅问题。 这一点通过让全球线条库失效而得到纠正: 我们通过将线条设为 1 来禁用内部和内部全球线条库。 为了优化多轨引擎的内存, 我们建议使用 Jemalloc 来作为记忆分配工具, 而不是默认的时钟功能 。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10859

    浏览量

    211698
  • 内存
    +关注

    关注

    8

    文章

    3023

    浏览量

    74030
  • 线程池
    +关注

    关注

    0

    文章

    57

    浏览量

    6846
  • pytorch
    +关注

    关注

    2

    文章

    808

    浏览量

    13219
收藏 人收藏

    评论

    相关推荐

    Java中的线程包括哪些

    线程是用来统一管理线程的,在 Java 中创建和销毁线程都是一件消耗资源的事情,线程可以重复
    的头像 发表于 10-11 15:33 813次阅读
    Java中的<b class='flag-5'>线程</b><b class='flag-5'>池</b>包括哪些

    针对Arm嵌入式设备优化的神经网络推理引擎

    专门针对Arm嵌入式设备优化的神经网络推理引擎Tengine + HCL,不同人群的量身定制
    发表于 01-15 08:00

    线程是如何实现的

    线程的概念是什么?线程是如何实现的?
    发表于 02-28 06:20

    关于RT-Thread内存管理的内存简析

    :支持线程挂起。内存无空闲内存块时,申请线程会被挂起,直到有可用内存块。简单理解,就是将相同大
    发表于 04-06 17:02

    线程线程

    线程通常用于服务器应用程序。 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理
    的头像 发表于 02-28 09:53 790次阅读
    多<b class='flag-5'>线程</b>之<b class='flag-5'>线程</b><b class='flag-5'>池</b>

    线程线程怎么释放

    线程分组看,pool名开头线程占616条,而且waiting状态也是616条,这个点就非常可疑了,我断定就是这个pool开头线程导致的问题。我们先排查为何这个
    发表于 07-31 10:49 2276次阅读
    <b class='flag-5'>线程</b><b class='flag-5'>池</b>的<b class='flag-5'>线程</b>怎么释放

    Spring 的线程应用

    我们在日常开发中,经常跟多线程打交道,Spring 为我们提供了一个线程方便我们开发,它就是 ThreadPoolTaskExecutor ,接下来我们就来聊聊 Spring 的线程
    的头像 发表于 10-13 10:47 621次阅读
    Spring 的<b class='flag-5'>线程</b><b class='flag-5'>池</b>应用

    什么是内存

    使用时就会变得非常快 捷,大大提高程序运行效率。 在计算机中,有很多使用“”这种威廉希尔官方网站 的地方,除了内存,还有连接线程
    的头像 发表于 11-08 16:26 904次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>池</b>

    高并发内存项目实现

    本项目实现了一个高并发内存,参考了Google的开源项目tcmalloc实现的简易版;其功能就是实现高效的多线程内存管理。由功能可知,高并发指的是高效的多
    的头像 发表于 11-09 11:16 716次阅读
    高并发<b class='flag-5'>内存</b><b class='flag-5'>池</b>项目实现

    了解连接线程内存、异步请求

    可被重复使用像常见的线程内存、连接、对象都具有以上的共同特点。 连接
    的头像 发表于 11-09 14:44 1316次阅读
    了解连接<b class='flag-5'>池</b>、<b class='flag-5'>线程</b><b class='flag-5'>池</b>、<b class='flag-5'>内存</b><b class='flag-5'>池</b>、异步请求<b class='flag-5'>池</b>

    线程基本概念与原理

    一、线程基本概念与原理 1.1 线程概念及优势 C++线程简介
    的头像 发表于 11-10 10:24 534次阅读

    线程的基本概念

    线程的基本概念 不管线程是什么东西!但是我们必须知道线程被搞出来的目的就是:提高程序执行效
    的头像 发表于 11-10 16:37 524次阅读
    <b class='flag-5'>线程</b><b class='flag-5'>池</b>的基本概念

    内存主要解决的问题

    程 序占有的资源数量。 经常使用的威廉希尔官方网站 包括内存线程和连接等,其中尤以
    的头像 发表于 11-13 15:23 704次阅读
    <b class='flag-5'>内存</b><b class='flag-5'>池</b>主要解决的问题

    线程的创建方式有几种

    线程是一种用于管理和调度线程的威廉希尔官方网站 ,能够有效地提高系统的性能和资源利用率。它通过预先创建一组线程并维护一个工作队列,将任务提交给线程
    的头像 发表于 12-04 16:52 862次阅读

    什么是动态线程?动态线程的简单实现思路

    因此,动态可监控线程一种针对以上痛点开发的线程管理工具。主要可实现功能有:提供对 Spring 应用内线程
    的头像 发表于 02-28 10:42 643次阅读