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

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

3天内不再提示

Vitis AI - 如何利用张量提升内存使用效率达到内存优化效果

454398 来源: Xilinx技术社微信公众号 作者: Xilinx技术社微信公 2020-09-29 10:35 次阅读

在数据处理中,对原始数据进行重塑或重新排序并创建多个副本是很常见的行为。无论执行任何新步骤,都会创建新副本。随着程序的增大,占用的内存也会增大,我几乎从未考虑过这个问题,直到遇到了“内存不足”错误。

张量 (tensor) 的神奇之处在于多个张量可以引用同一存储空间(即包含给定类型的数字的连续内存区块)。此行为由 torch.storage 进行管理。

每个张量都包含 .storage 属性,用于显示内存中存储的张量内容。

在下一篇的文章中,我将聊一聊张量所具有的更神奇的属性,即跟踪上级操作。

在本文中,我将主要介绍内存优化方面的内容。

全新 Vitis AI 1.2 发行版将首次为 PyTorch 提供支持。本文对于新增对此热门框架的支持表示祝贺,并提供了 1 个 PyTorch 专用的 Jupyter Notebook 格式示例。

输入 [1]:

import torch
a = torch.randint(0, 9, (5,3))
a

输出 [1]:

tensor([[4, 1, 6],

        [0, 8, 8],

        [1, 2, 1],

        [0, 5, 7],

        [0, 0, 7]])

输出 [2]:

a.storage()

输出 [2]:

 4

 1

 6

 0

 8

 8

 1

 2

 1

 0

 5

 7

 0

 0

 7

[torch.LongStorage of size 15]

输出 [3]:

a.shape

输出 [3]:

torch.Size([5, 3])

我们可能需要对原始“a”张量进行转置 (transpose) 和平展 (flatten) 处理。

何必为了相同数据浪费双倍内存?哪怕数据只是形状 (shape) 不同,也没有必要。

输入 [4]:

b = torch.transpose(a, 0, 1)
b

输出 [4]:

tensor([[4, 0, 1, 0, 0],

        [1, 8, 2, 5, 0],

        [6, 8, 1, 7, 7]])

a和b确实是指向相同存储空间的张量。

两者表现方式不同,原因在于我们使用 stride 函数指令其按不同顺序读取该存储空间。

b的 stride 值为 (1,3),即读取存储空间时,每隔 1 个元素都必须跳至下一行,并且每隔 3 个元素必须跳至下一列。

输出 [5]:

b.stride(), a.stride()

输出 [5]:

((1, 3), (3, 1))

我们可以从a或b访问数据,或者也可以从原始存储空间直接访问数据。

但如果从存储空间访问,则读取的值将不再是张量。

输入 [6]:

a[1,2], b[2,1], a.storage()[5], b.storage()[5]

输出 [6]:

(tensor(8), tensor(8), 8, 8)

现在,令我感到疑惑不解的是,我发现这些张量的值神奇般地自行发生了改变:

更改a时,b也变了。

输入 [7]:

a[0,0] = 10
b[0,0]

输出 [7]:

tensor(10)

发生这种状况的原因是因为,从内存角度来看,张量即经过排序的存储空间表示法。

从同一存储空间生成的 2 个张量并非独立张量,而且我必须牢记的是,当我每次更改 1 个张量后,指向相同存储空间的所有其它张量也都会被修改。

可见,即使高效的内存利用方式也难免有其缺点!

子集

通过原始数据的子集仍然能够有效利用内存。

新的张量仍然指向原始存储空间的子集。

输入 [8]:

c = a[0:2, 0:2]
c

输出 [8]:

tensor([[10,  1],

        [ 0,  8]])

输入 [9]:

c[0,0]=77
a

输出 [9]:

tensor([[77,  1,  6],

        [ 0,  8,  8],

        [ 1,  2,  1],

        [ 0,  5,  7],

        [ 0,  0,  7]])

inplace 运算符

inplace 运算符即无需创建张量副本就可以直接对存储空间进行操作的函数。这些运算符通常具有易于识别的名称且以下划线结尾。

输入 [10]:

a.zero_()
b

输出 [10]:

tensor([[0, 0, 0, 0, 0],

        [0, 0, 0, 0, 0],

        [0, 0, 0, 0, 0]])

张量克隆

如果确实需要 1 个独立的新张量,可以对其进行克隆。

这样也会创建新的存储空间。

输入 [11]:

a_clone = a.clone()
a_clone[0,0] = 55
a_clone

输出 [11]:

tensor([[55,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0],

        [ 0,  0,  0]])

输出 [12]:

a

输出 [12]:

tensor([[0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0]])

为连续张量重组存储空间

部分函数仅适用于连续张量。

对a进行转置时,通过在b中分配来自存储空间的非连续矩阵值,生成了新的张量。

输入 [13]:

a.is_contiguous()

输出 [13]:

True

输出 [14]:

b.is_contiguous()

输出 [14]:

False

我们可将b设为连续张量,但这将导致b生成经过重组的新存储空间,从而导致a和b永远无法成为独立张量:

输入 [15]:

b = b.contiguous()
b[0,0] = 18
a[0,0]

输出 [15]:

tensor(0)

输出 [16]:

b.is_contiguous()

输出 [16]:

True

输出 [16]:

a.is_contiguous()

输出 [17]:

True

编辑:hfy


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

    关注

    8

    文章

    2767

    浏览量

    72752
  • AI
    AI
    +关注

    关注

    87

    文章

    26424

    浏览量

    264024
  • 数据处理
    +关注

    关注

    0

    文章

    506

    浏览量

    28247
  • pytorch
    +关注

    关注

    2

    文章

    760

    浏览量

    12825
收藏 人收藏

    评论

    相关推荐

    Vitis AI Library体验之OCR识别

    Vitis AI Library是一组高层次库和 API,专为利用 DPU 高效执行 AI 推断而构建。它是基于 Vitis
    的头像 发表于 10-17 08:23 622次阅读
    <b class='flag-5'>Vitis</b> <b class='flag-5'>AI</b> Library体验之OCR识别

    RAM Saver Pro【内存自动调整工具】

    内存可用空间,以藉此提升电脑的执行速度。 RAM Saver Pro是一款存储器优化工具,通过为应用程序提供更多可用的存储器来提高操作系统的性能. 它的主要功能包括: -对系统存储器进行碎片整理以
    发表于 03-02 12:23

    LabVIEW 程序的内存优化

    节约内存的占用,提高运行效率。但是,在编写完程序后再按照程序优化的技巧回头去优化一段已有的程序,这并不是一个好的编程方法。我们应该先熟悉理解优化
    发表于 07-13 17:57

    提高内存使用效率有哪些?

    提高内存使用效率有哪些?  1.调整高速缓存区域的大小 可以在“计算机的主要用途”选项卡中设置系统利用高速缓存的比例。如果系统的内存较多,可选择“网络服务器”,这样系统将用较多的
    发表于 02-24 17:29

    内存分配及Cache优化

    利用两级缓存并配合低工作频率外部存储器,系统的效率达到全部使用高工作频率内部存储器的80%~90%。  本文将占据较大空间的数据或使用频率不高的程序放在片外存储器中,启用L2 Cache,调用
    发表于 08-10 14:54

    关于内存优化时小问题

    在看书时,看到了说优化内存时,多利用子VI,因为子vi的前面板和程序框图不会加载进内存,但是除了用到属性节点和局部变量,这里的属性节点和局部变量我个人理解为子vi控件里的,如何子vi的
    发表于 09-12 10:30

    嵌入式系统内存优化使用

    响应运行。并且经过实践证明,嵌入式系统内存优化使用,能够提升系统空间5%内存,确保系统顺利运行。【关键词】 嵌入式 Linux系统 内存
    发表于 11-04 06:23

    内存之旅——如何提升CMA利用率?

    ()`-|cma_init_reserved_mem()创建完成后,由于暂时没有设备驱动使用,为了提升内存利用率,需要将这部分内存标记后,归还给 buddy 系统,供 buddy 系统
    发表于 03-22 16:26

    【KV260视觉入门套件试用体验】Vitis AI 初次体验

    连接到处理器系统 (PS)。DPU 可由用户配置且包含多个参数,用户可通过指定这些参数来对 PL 资源进行最优化,或者也可以自定义启用的功能。 Vitis AI Library 是一组高层次库和 API
    发表于 09-10 13:15

    【KV260视觉入门套件试用体验】五、VITis AI (人脸检测和人体检测)

    ); } 3.2、实践效果 使用命令运行代码程序。 cd Vitis-AI/examples/vai_library/samples/refinedet ./test_jpeg_refinedet_tf
    发表于 09-26 16:22

    【KV260视觉入门套件试用体验】Vitis AI 构建开发环境,并使用inspector检查模型

    云端的计算资源进行模型优化,这些云端资源都可以即用付费的,使用pytorch或者tensorflow原生的优化方法,最后使用Vitis AI来编译部署即可。这样我可以
    发表于 10-14 15:34

    AS控制器内存分配及优化

    摘要 本文基于S7-400系列控制器,详细介绍内存的类型、分配情况及实际使用过程中可能的内存优化方法。关键词 内存,工作内存,装载
    发表于 08-08 10:13 25次下载

    如何利用张量提升内存使用效率

    在数据处理中,对原始数据进行重塑或重新排序并创建多个副本是很常见的行为。无论执行任何新步骤,都会创建新副本。随着程序的增大,占用的内存也会增大,我几乎从未考虑过这个问题,直到遇到了“内存不足”错误。
    的头像 发表于 02-19 17:26 939次阅读

    Vitis AI优化器指南

    电子发烧友网站提供《Vitis AI优化器指南.pdf》资料免费下载
    发表于 09-14 11:04 0次下载
    <b class='flag-5'>Vitis</b> <b class='flag-5'>AI</b><b class='flag-5'>优化</b>器指南

    如何解决内存碎片与内存交换效率慢的问题

    内存分页 分段的好处是能产生连续的内存空间,但是会出现大量内存碎片与内存交换效率低的问题 先思考一下怎么解决这两个问题,
    的头像 发表于 10-09 16:57 542次阅读
    如何解决<b class='flag-5'>内存</b>碎片与<b class='flag-5'>内存</b>交换<b class='flag-5'>效率</b>慢的问题