数据操作-节省内存
一、
运行一些操作可能会导致为新的结果分配内存。例如,如果我们用 Y = X + Y
,我们将取消引用 Y
指向的张量,而是指向新分配的内存处的张量。
开辟新的内存空间有如下问题:
1、在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新。
2、我们可能通过多个变量指向相同参数。如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | before = id(Y) print(id(Y)) # X+=Y和Y=Y+X的区别在于是否开辟新的内存空间 Y = Y + X print(id(Y)) print(id(Y) == before) #输出结果 2256463431360 2256464070656 False #通过输出结果我们可以发现,两者id值不一样,说明在运行y=y+x后开辟了新的内存空间 |
二、执行原地操作
我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如 Y[:] = <expression>
1 2 3 4 5 6 7 | # 创建一个和Y形状相同、元素全是0的矩阵Z Z = torch.zeros_like(Y) print( 'id(Z):' , id(Z)) Z[:] = X + Y print( 'id(Z):' , id(Z))<br><br>#输出结果id(Z): 2256464178944 id(Z): 2256464178944 |
可以发现虽然 Z 的id值没有变化(表示他们没有重新分配内存)。可是他也新开辟了一个内存空间用来存储 Z 。通过如下操作可以真正减少操作的内存开销
1 2 3 4 5 6 7 8 9 10 11 12 13 | print(id(X)) X += Y print(id(X)) X[:]=X+Y print(id(X)) #输出结果 2256463463360 2256463463360 2256463463360 |
可以发现,在经过X+Y后X的id值还是没有变化,这才是真正的减少内存开销
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)