新闻详情

新闻详情

首页 / 资讯中心 / 详情

PyTorch中nn.Module的专用方法register_buffer

发布时间:2026/11/12 13:42:20来源:尧图网络
PyTorch中nn.Module的专用方法register_buffer
register_buffer 完整参数详解函数原型defregister_buffer(self,name:str,tensor:Optional[torch.Tensor],persistent:boolTrue)-None一共3个参数name、tensor、persistent可选1. 参数1name字符串必传缓冲区的变量名规则之后通过self.xxx直接访问例self.mask不能和已有的参数、buffer重名保存 checkpoint 时这个 name 会作为 buffer 的键存入文件。示例self.register_buffer(mask,triu_mat)# 使用self.mask2. 参数2tensor张量/None必传要注册进模型的张量核心特征不求梯度、不参与参数更新不会被优化器更新调用.cuda()/.cpu()/.to(device)时张量自动跟随模型迁移设备若传None会注销这个名字对应的缓冲区。适用场景固定掩码、LayerNorm 均值方差、固定位置编码、常量矩阵。3. 参数3persistent布尔默认 True控制保存模型时是否存入 checkpoint极少用到。persistentTrue默认你的代码就是这种torch.save(model)保存时该 buffer 会写入文件torch.load加载模型自动恢复self.mask绝大多数场景注意力mask、归一化参数都用默认 True。persistentFalse临时缓冲区不保存buffer 只存在内存存模型时直接丢弃加载后需要重新创建。适用仅前向临时计算用、超大中间缓存不想占用 checkpoint 体积。示例关闭持久化self.register_buffer(temp_cache,torch.zeros(1024),persistentFalse)补充区分Parameter / buffer / 普通self张量对象注册方式可训练存入state_dict自动设备迁移权重参数nn.Parameter✅✅✅持久bufferregister_buffer(…, persistentTrue)❌✅✅临时bufferregister_buffer(…, persistentFalse)❌❌✅普通self.tensor赋值self.mask torch.tensor(…)❌❌❌self.register_buffer(mask,# name变量名self.masktorch.triu(torch.ones(context_length,context_length),diagonal1),# tensor掩码矩阵# 省略persistent默认persistentTrue)含义注册一个名为mask的缓冲区张量矩阵固定不变模型移GPU自动同步保存模型时掩码一起存入文件。一、先搞懂register_buffer核心作用1. 基础定义self.register_buffer(name, tensor)是 PyTorchnn.Module的专用方法用来注册不需要梯度更新、但要跟着模型设备走、会被保存进 checkpoint 的张量。区分三类模型内张量nn.Parameter可训练参数W_query/W_key/W_value 这类权重会被model.parameters()取出优化器更新参与梯度计算。buffer 缓冲区张量register_buffer你代码里的mask不参与训练、不求梯度但模型.to(device)/cuda()/cpu()时mask 自动同步到相同设备torch.save(model)保存模型时mask 会一起存入文件可以通过self.mask直接访问不会出现在model.parameters()只会在model.buffers()。普通局部变量/普通 self.xxx tensorself.masktorch.triu(...)这种写法大坑模型移到 GPUmask 还留在 CPU前向传播计算会报设备不匹配保存模型时不会存这个 mask重新加载后 mask 丢失。2. 对应代码里 mask 的场景self.register_buffer(mask,torch.triu(torch.ones(context_length,context_length),diagonal1))triu triangle upper只保留对角线上方含指定对角线 的元素其余置 0。diagonal1 你原来的代码。矩阵下标 (i,j) i 行j 列保留满足 j i 1 的位置也就是主对角线右上第一条斜线及以上全部为 1mask 是什么因果注意力自回归上三角掩码triu(..., diagonal1)生成上三角矩阵对角线右上全是1对角线及下方0[[0,1,1,1] [0,0,1,1] [0,0,0,1] [0,0,0,0]]作用计算注意力分数时把 mask1 的位置填充-infsoftmax 后权重趋近0让每个 token 只能看自己和前面的 token看不到未来位置GPT 类自回归模型核心约束。为什么这个 mask 必须用 buffer不能普通赋值无需训练mask 是固定规则矩阵永远不变不需要梯度、不需要优化器更新不能用 Parameter设备同步训练时模型丢到 cudamask 必须同步到 cuda否则attn_scores keys张量设备不一致报错持久化保存保存/加载模型时mask 自动读写不用自己手动重建自动跟随模型的 eval/train 模式不影响梯度流。二、逐行拆解这段 register_buffer 逻辑self.register_buffer(mask,tensor)第一个参数缓冲区变量名之后代码self.mask就能访问第二个参数要注册的固定张量这里是固定尺寸的上三角全1矩阵前向传播里使用attn_scores.masked_fill_(self.mask.bool()[:num_tokens,:num_tokens],-torch.inf)self.mask.bool()转布尔矩阵1→True0→False[:num_tokens, :num_tokens]兼容输入序列长度小于初始化context_length的场景截取对应大小掩码True 的位置未来token填充负无穷softmax 后权重归零实现因果遮蔽。三、对比三种写法的优劣写法1你代码的正确写法register_bufferself.register_buffer(mask,torch.triu(torch.ones(cl,cl),diagonal1))✅ 设备自动同步、保存模型不丢失、不占可训练参数、无梯度。写法2直接 self.mask tensor错误self.masktorch.triu(torch.ones(cl,cl),diagonal1)❌ 模型移GPU后mask还在CPU运行报错保存模型不会存mask加载失效。写法3nn.Parameter完全错误self.masknn.Parameter(torch.triu(...),requires_gradFalse)❌ 虽然关掉梯度但会被算进模型参数列表占用存储、冗余不符合语义规范上不推荐。四、补充关键特性遍历 buffer# 取出所有缓冲区张量forbufinmodel.buffers():print(buf.shape)保存加载自动处理torch.save(model, attn.pt)会把 mask 存入文件model torch.load(attn.pt)自动恢复 self.mask不用手动生成。多设备自动迁移modelCausalAttention(...)model.cuda()print(model.mask.device)# cuda:0自动同步缓冲区不参与反向传播哪怕你对 self.mask 做运算也不会计算梯度节省显存与计算。五、一句话总结register_buffer专门存放固定不变、不需要训练但需要和模型绑定、随模型迁移设备、随模型保存加载的张量比如注意力掩码、归一化均值方差、位置编码表这就是你代码里因果掩码用它的根本原因。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/11 13:52:51

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/10 19:42:40

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/12 9:50:02

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/12 9:25:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/12 15:57:44

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/10 17:14:10

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉