AI学习预备知识-数据操作(5)内存节省

AI学习预备知识-数据操作(5)内存节省

提示:本系列持续更新中

文章目录

  • AI学习预备知识-数据操作(5)内存节省
  • 前言
  • 内存节省
  • 总结


前言

随着开始人工智能的学习越来越多,那么再学习过程中,我们应该有一定的基础知识储备,本系列为基础知识储备介绍,本文主要讲解AI学习储备知识–在数据操作过程中所需考虑到的内存节省。


内存节省

提示:默认使用python,数据操作使用mxnet
在数据操作过程中运行一些操作可能会导致为新结果分配内存。 例如,如果我们用broadY = broadY + broadX,我们将取消引用broadY指向的张量,而是指向新分配的内存处的张量。
提示:broadX、broadY为广播机制篇初始化张量
那我们用Python的id()函数演示这一点, 它给我们提供了内存中引用对象地址。

# 内存验证
before = id(broadY)
broadY = broadY + broadX
print(id(broadY) == before)
# 打印结果
# 结果为False

运行broadY = broadY + broadX后,我们会发现id(broadY)指向另一个位置。 这是因为Python首先计算broadY + broadX,为结果分配新内存,然后使broadY指向内存中的新的位置。

在机器学习过程中这是不可取的,原因有两个:

  1. 我们不想总是不必要地分配内存。在机器学习的过程中,我们可能有数百上千兆的参数,并且存在需要在一秒内多次更新所有参数情况。通常情况下,我们希望能够原地执行这些更新,减少内存分配;
  2. 如果我们不原地更新,其他引用可能会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数,引起异常。

执行原地操作其实非常简单。 我们可以使用切片表示法将操作的结果分配给先前分配的数组。 为了说明这一点,我们首先创建一个新的矩阵broadZ,其形状与broadY相同, 使用zeros_like来分配一个全0的块。

# 内存原地更新
broadZ = np.zeros_like(broadY)
print('id(broadZ):', id(broadZ))
# 打印结果 id(broadZ): 4582240400
broadZ[:] = broadX + broadY
print('id(broadZ):', id(broadZ))
# 打印结果 id(broadZ): 4582240400

若在后续计算中没有重复使用broadZ, 我们也可以使用broadZ[:] = broadX + broadY或broadZ += broadY来减少操作的内存开销。
提示:若固定形状张量使用 += 则无法操作

# 内存更新比对
before = id(broadZ)
broadZ += broadY
print(id(broadZ) == before)
# 结果为True

总结

本章为数据操作-内存节省,针对学习过程中需要使用到的基本数据操作进行讲解,后续将会逐步完善本系列,旨在为AI学习打好基础

你可能感兴趣的:(AI开发学习之路,人工智能,学习)