讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么Python中PyTorch的expand比repeat更省显存

千婷同学_9224

千婷同学_9224

发布时间:2026-10-03 07:39:38

|

560人浏览过

|

来源于php中文网

原创

expand不分配新内存,仅通过修改stride和shape创建原Tensor的视图,共享同一data_ptr;只能扩展size=1的维度,-1表示保持原维大小,适用于广播场景;repeat则真实复制数据,显存随重复次数线性增长。

为什么python中pytorch的expand比repeat更省显存

expand 不分配新内存,只改 stride 和 shape

expand 本质是返回原 Tensor 的一个视图(view),它不复制任何数据,只是修改了张量的 shape 和 stride。底层仍指向同一块内存地址,data_ptr() 与原张量一致。这意味着无论你 expand(1000, 1000) 还是 expand(10**6, 10**6),只要原始张量小,显存占用几乎不变。

repeat 真实复制数据,显存随维度线性增长

repeat 每次调用都会申请新内存,并把原始数据按指定次数完整拷贝进去。比如 x = torch.ones(3)(3 个 float32,共 12 字节),执行 x.repeat(1000, 1000) 后,实际生成的是含 3×10⁶ 个元素的新 Tensor,显存占用约 12 MB —— 是原来的百万倍。

  • 参数 *sizes 表示「每个维度上重复几次」,不是目标 shape;repeat(2, 3) 是先在 dim0 复制 2 份,再对每份在 dim1 复制 3 份
  • 即使只重复 1 次(如 repeat(1, 4)),也会触发完整拷贝,无法跳过内存分配
  • 对大张量误用 repeat 容易触发 RuntimeError: CUDA out of memory

expand 的限制:只能作用于 size=1 的维度

这不是设计缺陷,而是广播机制的硬性前提。比如 x = torch.randn(1, 512) 可以 expand(64, 512)(因为第 0 维是 1),但 x = torch.randn(3, 512) 直接调 expand(64, 512) 会报错 RuntimeError: The expanded size ... must match the existing size ... at non-singleton dimension。

python-code-analyz
python-code-analyz

专业Python代码分析与优化,支持语法检查、安全扫描、性能评估、复杂度分析及重构后优化代码生成。

下载
  • 常见补救方式:先 unsqueeze(0) 或 view(1, 3, 512) 创造 singleton 维,再 expand
  • expand(-1, 4) 中的 -1 表示“保持该维原大小”,不是“自动推断”,它只允许出现在原本就合法的维度上
  • 若需要绕过 singleton 限制又不想爆显存,可考虑 torch.broadcast_to(行为类似 expand,但更严格校验广播规则)

真实场景中选哪个?看你要的是“共享值”还是“独立副本”

两者语义不同,不能简单说谁“更好”。关键判断点在于:后续操作是否要修改其中某一部分,且不希望影响其他部分。

立即学习“Python免费学习笔记(深入)”;

  • 要用广播做 batch 计算(如 logits + bias.expand_as(logits)),选 expand —— 安全、轻量、符合 PyTorch 广播逻辑
  • 要做数据增强(如把一张图复制 5 次进 dataloader)、构造 tile 模式输入(如 patch 重复拼接),必须用 repeat —— 因为每个副本需独立参与梯度更新或变换
  • 一个典型陷阱:a = nn.Parameter(torch.ones(1, 10)); b = a.expand(100, 10); b[0] = 0 会同时改掉 a 和所有 b[i],因为它们共享内存;而 c = a.repeat(100, 10); c[0] = 0 只影响第 0 行
容易被忽略的一点:当你在训练循环里反复 expand 一个 Parameter,它不会增加显存压力,但如果你误写成 repeat,哪怕只多一次,就可能让 batch size 被迫降到 1。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1651

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4024

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1629

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

23237

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2847

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2887

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1143

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

40

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn