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

    文章

    7067

    浏览量

    89113
  • 存储
    +关注

    关注

    13

    文章

    4320

    浏览量

    85905
  • pytorch
    +关注

    关注

    2

    文章

    808

    浏览量

    13238
收藏 人收藏

    评论

    相关推荐

    大冲能源助力提升医院能源利用效率

    昨日,由大冲能源负责的金华市人民医院合同能源管理能源托管项目顺利完成竣工验收,标志着大冲能源在推动医院节能减排和智能化管理方面取得了又一重要成果。该项目由大冲能源与金华市人民医院携手合作,旨在通过一系列高效节能改造和能源管理手段,提升医院能源利用
    的头像 发表于 12-27 15:46 130次阅读

    RK3568国产处理器 + TensorFlow框架的张量创建实验案例分享

    一、实验目的 本节视频的目的是了解张量定义、了解张量的表示形式、并学习基于TensorFlow框架的张量创建方法。 二、实验原理. 张量定义 1、
    发表于 12-03 14:43

    《算力芯片 高性能 CPUGPUNPU 微架构分析》第3篇阅读心得:GPU革命:从图形引擎到AI加速器的蜕变

    线程调度,与Hopper架构的细粒度同步机制,使得异构计算场景下的任务协同更加灵活。在我的分布式训练实践中,这些特性显著提升了模型收敛速度。 张量处理器的设计是本书点睛之笔。从数学抽象来看,张量统一了
    发表于 11-24 17:12

    永磁同步电机效率提升方法

    提升永磁同步电机效率的方法可以从多个方面进行,以下是一些有效的方法: 优化电机设计 : 增加磁场的强度:通过增加永磁体的磁通密度和提高永磁体及铁心的磁导率,可以有效提升电机的磁场强度,从而提高
    的头像 发表于 11-22 10:13 382次阅读

    DDR内存频率对性能的影响

    的整体性能,特别是在处理大量数据或运行复杂程序时,如视频编辑、3D渲染和高端游戏等场景。快速的内存可以缩短CPU和内存之间的通信时间,从而提升整体系统的响应效率。 二、多任务处理能力
    的头像 发表于 11-20 14:25 917次阅读

    如何提升EDA设计效率

    EDA(Electronic Design Automation,电子设计自动化)设计技术是现代电子工程领域的关键技术之一,提升EDA设计效率对于电子工程师和整个电子行业都至关重要。以下是一些提升
    的头像 发表于 11-08 14:23 478次阅读

    提升效率:RTC时钟实用设置

    今天来给大家讲解的是RTC时钟实用性,提升绝对的效率
    的头像 发表于 11-04 16:35 809次阅读
    <b class='flag-5'>提升</b><b class='flag-5'>效率</b>:RTC时钟实用设置

    RISC-V能量路由器,提升能源利用效率的智慧“钥匙”

    。为了有效提升光伏的本地消纳率,减少变压器扩容投资成本,能量路由技术应运而生——从用户侧出发有效节能降碳、提高能源利用效率,能量路由器不仅让新型电力系统更加可靠稳定,
    的头像 发表于 11-02 08:05 794次阅读
    RISC-V能量路由器,<b class='flag-5'>提升</b>能源<b class='flag-5'>利用</b><b class='flag-5'>效率</b>的智慧“钥匙”

    如何提升RFID手持终端的读写效率

    RFID(射频识别)手持终端是一种便携式设备,用于读取和写入RFID标签。提升RFID手持终端的读写效率对于提高物流、库存管理、零售等行业的工作效率至关重要。以下是一些提升RFID手持
    的头像 发表于 10-29 09:41 253次阅读

    光伏并网逆变器如何提升转换效率

    提升光伏并网逆变器的转换效率是光伏系统优化和提高经济效益的重要途径。
    的头像 发表于 04-18 16:39 1236次阅读

    数控测量|利用机床测头提升加工中心精度,助力生产效率飞跃!

    机床测头是现代制造业的关键装置,能实时监控加工误差,提高精度和效率。其高精度测量、实时反馈和自动校准功能,确保加工质量稳定,提升生产效率。未来,机床测头将融入更多智能化技术,推动制造业数字化、智能化发展。
    的头像 发表于 03-06 11:03 1095次阅读
    数控测量|<b class='flag-5'>利用</b>机床测头<b class='flag-5'>提升</b>加工中心精度,助力生产<b class='flag-5'>效率</b>飞跃!

    应用大模型提升研发效率的实践与探索

    对于模型训练,我们可以采用 3D 并行训练的方式来实现。将模型参数和梯度张量划分为多个分区,分配到不同 GPU 卡上进行计算。每张卡负责自己分区的梯度和参数更新工作,间隔时同步到其他卡上。这样可以很好地利用更多计算资源,降低单卡资源需求。
    的头像 发表于 02-22 11:47 639次阅读
    应用大模型<b class='flag-5'>提升</b>研发<b class='flag-5'>效率</b>的实践与探索

    利用NVIDIA产品技术组合提升用户体验

    UTalk-Doc 将用户指令识别服务吞吐量提升了 5 倍,单个请求响应时间缩减了三分之一,大幅提升服务运行效率提升资源利用率。Trit
    的头像 发表于 01-17 09:30 704次阅读

    功率分析仪测效率-提升能源利用的关键技术

    分析仪就是在这样的背景下应运而生的一种重要工具。本文将介绍功率分析仪的功能和作用,并重点讨论如何利用功率分析仪进行效率测量及提升
    的头像 发表于 01-09 15:28 543次阅读
    功率分析仪测<b class='flag-5'>效率</b>-<b class='flag-5'>提升</b>能源<b class='flag-5'>利用</b>的关键技术

    如何提升单片机开发技术?

    单片机开发是现代电子技术中的重要分支,其在各个领域都有着广泛的应用。单片机开发技术的提升不仅可以提高工作效率,还可以提高工作质量和创新能力。那么,如何提升单片机开发技术呢? 一、加强基础知识
    发表于 01-05 10:14