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

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

3天内不再提示

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

C29F_xilinx_inc 来源:赛灵思 作者:赛灵思 2022-02-19 17:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师

以下为个人译文,仅供个人学习记录参考之用,如有疏漏之处,还请不吝赐教。

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

张量 (tensor) 的神奇之处在于多个张量可引用同一存储空间,从而显著提升内存使用效率。

在下一篇的文章中,我将聊一聊张量所具有的更神奇的属性,即跟踪上级操作,但在本文中,我将主要介绍内存优化方面的内容。

张量 (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

输入 [17]:

a.is_contiguous()

输出 [17]:

True

审核编辑:汤梓红

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

    关注

    8

    文章

    7348

    浏览量

    95013
  • 存储
    +关注

    关注

    13

    文章

    4886

    浏览量

    90276
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14921
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AGV机器人如何提升搬运效率

    AGV智能搬运车正颠覆传统物流模式,24小时精准作业、多车协同、自主避障,将搬运效率提升300%以上,成为智能制造的核心引擎。
    的头像 发表于 01-15 16:48 410次阅读
    AGV机器人如何<b class='flag-5'>提升</b>搬运<b class='flag-5'>效率</b>?

    公网访问开源 Stirling-PDF 工具,提升办公效率

    本文介绍了如何在Windows本地部署Stirling-PDF服务器,并通过内网穿透实现外网访问,提升PDF处理效率
    的头像 发表于 12-09 14:25 678次阅读
    公网访问开源 Stirling-PDF 工具,<b class='flag-5'>提升</b>办公<b class='flag-5'>效率</b>

    信维低损耗MLCC电容,提升电路效率优选

    信维低损耗MLCC电容在提升电路效率方面表现优异,其核心优势体现在 低损耗特性、高频响应能力、小型化设计、高可靠性 以及 广泛的应用适配性 ,具体分析如下: 一、低损耗特性直接提升电路效率
    的头像 发表于 11-24 16:30 1037次阅读

    内存与数据处理优化艺术

    高精度的场合使用精度较低的类型,可以减少内存使用并提升计算速度。 字节对齐与批量拷贝也是提升内存操作效率的重要手段。例如,通过一次处理多个字
    发表于 11-14 07:46

    Credo发布业界首款内存扇出Gearbox

    Weaver,一款内存扇出Gearbox,该产品可显著提升内存带宽和内存密度,优化AI加速器或xPU的计算效率。作为Credo OmniCo
    的头像 发表于 11-08 11:01 2486次阅读

    斑马技术助力PouchNATION提升大型活动管理效率

    斑马技术公司宣布 PouchNATION 通过采用斑马技术的高性能扫描解决方案,显著提升其大型活动的管理效率
    的头像 发表于 11-04 16:15 894次阅读

    三坐标如何实现测量效率提升

    精密制造的产线节奏日益加快,传统三坐标测量机面临着“要么放慢速度保精度,要么牺牲精度换速度”的困境制约着生产效率提升。MizarGold三坐标测量机通过材料创新与传动优化,实现了测量速度快的同时不
    的头像 发表于 09-11 16:47 1628次阅读
    三坐标如何实现测量<b class='flag-5'>效率</b>的<b class='flag-5'>提升</b>?

    如何有效利用高光谱成像技术提升数据分析效率

    随着人工智能和大数据技术的快速发展,高光谱成像技术作为一种融合光谱信息与空间影像的新兴技术,正日益成为提升数据分析效率的重要工具。在农业监测、环境保护、矿产勘探等多个行业中,高光谱成像通过获取精准
    的头像 发表于 09-11 16:13 978次阅读
    如何有效<b class='flag-5'>利用</b>高光谱成像技术<b class='flag-5'>提升</b>数据分析<b class='flag-5'>效率</b>

    如何利用Canopen转Profinet网关提升AGV行业效率

    Profinet
    小疆智控
    发布于 :2025年08月29日 16:05:38

    如何利用硬件加速提升通信协议的安全性?

    产品实拍图 利用硬件加速提升通信协议安全性,核心是通过 专用硬件模块或可编程硬件 ,承接软件层面难以高效处理的安全关键操作(如加密解密、认证、密钥管理等),在提升性能的同时,通过硬件级隔离、防篡改等
    的头像 发表于 08-27 09:59 1173次阅读
    如何<b class='flag-5'>利用</b>硬件加速<b class='flag-5'>提升</b>通信协议的安全性?

    电控系统的 “功率翻译官”:车规电容如何让能源利用效率提升 10%?

    "的关键角色。最新行业数据显示,采用新一代车规电容技术的电控系统,可实现能源利用效率提升10%的突破性进展,这相当于为续航500公里的电动车额外增加50公里续航能力。 车规电容之所以能成为能源
    的头像 发表于 07-31 16:07 970次阅读

    同步整流MOSFET的设计要点与效率提升技巧

    。其核心器件——MOSFET,在设计中扮演着至关重要的角色。本文将深入探讨同步整流MOSFET的选型要点和提升效率的设计技巧。一、同步整流的基本原理传统整流使用二极
    的头像 发表于 07-03 09:42 1284次阅读
    同步整流MOSFET的设计要点与<b class='flag-5'>效率</b><b class='flag-5'>提升</b>技巧

    全球各大品牌利用NVIDIA AI技术提升运营效率

    欧莱雅、LVMH 集团和雀巢利用 NVIDIA 加速的智能体 AI 和物理 AI,大幅提升产品设计、营销及物流等方面的运营效率
    的头像 发表于 06-19 14:36 1350次阅读

    交流充电桩负载能效提升技术

    基器件的1/10),开关频率可达100kHz以上,减少开关损耗30%~50%; GaN器件反向恢复时间趋近于零,适用于高频PFC电路,整机效率提升至96%以上。 LLC谐振拓扑与双向PFC 传统硬
    发表于 05-21 14:38

    用光谱“看矿石”:LIBS如何提升稀土分选效率?

    的光谱分析技术——激光诱导击穿光谱(LIBS),正在悄然改变稀土矿物的分选方式。它不再依赖传统“化学浸泡+人工分析”的方式,而是通过一束激光,“一扫即知”矿石中的元素组成,大大提升了分选效率和资源利用率。 那么,LIBS 到
    的头像 发表于 05-15 16:40 1153次阅读
    用光谱“看矿石”:LIBS如何<b class='flag-5'>提升</b>稀土分选<b class='flag-5'>效率</b>?