【Bug已解决】FSDP2 fails due to KeyError: ‘lm_head.weight‘ 解决方案
【Bug已解决】FSDP2 fails due to KeyError lm_head.weight 解决方案一、现象长什么样用 FSDP2 训练一个tie_word_embeddingsTrue的模型即lm_head.weight与model.embed_tokens.weight共享在fully_shard或加载 / 分片阶段直接抛KeyError lm_head.weight最小判据触发FSDP2 模型 tie_word_embeddingsTruelm_head 与 embed 共享 现象fully_shard / 分片计划找不到 lm_head.weight 根因tied 后 lm_head.weight 不是独立参数是 embed 的别名 分片代码按名字查 lm_head.weight 却查不到 影响带 tied embedding 的模型无法用 FSDP2最迷惑的是不 tie 的模型lm_head 独立用 FSDP2 正常一旦 tie 就 KeyError。因为 tied 后lm_head.weight从独立参数变成了embed_tokens 的别名名字还在但参数对象不在参数列表里按名查找即失败。二、背景tie_word_embeddingsTrue时模型的lm_head不持有独立nn.Parameter而是直接复用embed_tokens.weight。在 PyTorch 里这通常通过self.lm_head.weight self.model.embed_tokens.weight别名赋值实现于是model.parameters()里只有一份embed_tokens.weight没有独立的lm_head.weight。FSDP2 的fully_shard或infer_auto_device_map/ 分片计划在某些实现里会遍历模块的命名参数或按预定义的权重名清单去规划分片清单里包含lm_head.weight因为很多模型 lm_head 独立用lm_head.weight去named_parameters/state_dict里查tied 模型里这个键不存在被别名合并了-KeyError。更深层FSDP2 在分片时需要知道每组参数属于哪个 module、怎么切。如果它用固定名字lm_head.weight去找 lm_head 模块的参数而 tied 后该模块没有独立参数查找失败。根因是分片代码按固定权重名查找未处理 tied embedding 的别名合并。三、根因抽象成代码示意def shard_plan(model): names [n for n, _ in model.named_parameters()] # BUG假设 lm_head.weight 一定存在 plan build_plan_for(names [lm_head.weight]) # tied 时 lm_head.weight 不在 names if lm_head.weight not in names: raise KeyError(lm_head.weight) # 这里炸根因链条tied 模型里lm_head.weight是embed_tokens.weight的别名参数列表只有一份分片代码按固定名lm_head.weight查找该键在 tied 模型里不存在 -KeyError不 tie 模型有独立lm_head.weight正常根因是分片代码假设 lm_head 总是独立参数。一句话tied embedding 把lm_head.weight合并成 embed 别名FSDP2 按固定名查找即 KeyError。四、最小可运行复现用纯 Python 模拟按固定名查找 tied 缺失参数# repro_tied_lmhead.py def shard_plan_buggy(param_names, expected): if expected not in param_names: raise KeyError(expected) return planned def main(): # tied 模型只有 embed_tokens.weight没有独立 lm_head.weight tied_params [model.embed_tokens.weight, model.layers.0.weight] try: shard_plan_buggy(tied_params, lm_head.weight) except KeyError as e: print(复现成功 -, e) if __name__ __main__: main()运行输出复现成功 - lm_head.weighttied 模型参数列表里没有lm_head.weight按名查找即 KeyError正是真实 bug 的抽象。五、解决方案第一层最小直接修复最小且必须的一步分片前识别 tied把lm_head.weight解析回它实际指向的embed_tokens.weight不再按不存在的名字查找# fix_layer1.py def resolve_lm_head(params, tie_map): # tie_map: {lm_head.weight: model.embed_tokens.weight} resolved [] for name in params: resolved.append(name) for alias, target in tie_map.items(): if alias not in params and target in params: resolved.append(alias) # 补上别名入口指向同一份 return resolved # 用法 tie_map {lm_head.weight: model.embed_tokens.weight} plan_names resolve_lm_head(list(model.state_dict().keys()), tie_map)要点resolve_lm_head把别名lm_head.weight补回查找清单指向真实embed_tokens.weight分片时两者共享同一份参数不重复分片不再KeyError。六、解决方案第二层结构性改进把tied 权重解析做成模型结构感知的预处理在分片前统一把 tied 别名映射好并校验别名与目标确实指向同一对象防误配# fix_layer2.py from dataclasses import dataclass, field from typing import Dict dataclass class TieResolver: tie_map: Dict[str, str] field(default_factorydict) def expand(self, param_names): out list(param_names) for alias, target in self.tie_map.items(): if alias not in param_names and target in param_names: out.append(alias) # 别名补入口 return out def validate_shared_object(self, model): # 校验别名和目标确实指向同一 Parameter 对象tied 的本质 for alias, target in self.tie_map.items(): a dict(model.named_parameters()).get(alias) t dict(model.named_parameters()).get(target) if a is not None and t is not None: assert a is t, f{alias} 与 {target} 未共享同一对象tie 配置错误 # 用法 resolver TieResolver({lm_head.weight: model.embed_tokens.weight}) plan_names resolver.expand(list(model.state_dict().keys())) resolver.validate_shared_object(model)要点TieResolver.expand把 tied 别名补回分片清单validate_shared_object校验别名和目标确实is同一对象防 tie 配置错分片逻辑只面对展开后的名字不再 KeyError。七、解决方案第三层断言 / CI 守护写 pytest 验证tied 模型分片不 KeyError、别名指向同一对象# test_tied_lmhead.py import pytest def expand(tie_map, names): out list(names) for alias, target in tie_map.items(): if alias not in names and target in names: out.append(alias) return out def test_tied_no_keyerror(): tied [model.embed_tokens.weight, model.layers.0.weight] tie_map {lm_head.weight: model.embed_tokens.weight} out expand(tie_map, tied) assert lm_head.weight in out, tied 别名应被补回不 KeyError def test_alias_points_to_target(): tie_map {lm_head.weight: model.embed_tokens.weight} assert tie_map[lm_head.weight] model.embed_tokens.weight def test_untied_untouched(): untied [lm_head.weight, model.embed_tokens.weight] out expand({}, untied) assert out untied, 不 tie 时不应改动CI 一旦有人把 tied 处理删掉test_tied_no_keyerror立刻变红。八、排查清单FSDP2 报KeyError: lm_head.weight时确认模型是否tie_word_embeddingsTrue检查分片代码是否按固定名lm_head.weight查找打印list(model.state_dict().keys())看是否真的没有lm_head.weight按第五 / 六节把 tied 别名解析回embed_tokens.weight不 tie 正常、tie 异常几乎可断定是 tied 别名缺失校验别名与目标指向同一对象防 tie 配置错把第七节的 pytest 接进 CI守护 tied 模型可分片。九、小结FSDP2 在tie_word_embeddingsTrue的模型上报KeyError: lm_head.weight根因是 tied 后lm_head.weight是embed_tokens.weight的别名、不再是独立参数而分片代码按固定名lm_head.weight查找查不到即 KeyError。不 tie 模型有独立 lm_head正常。三层层级第一层分片前把lm_head.weight解析回embed_tokens.weight补回别名入口第二层用TieResolver统一展开 tied 别名并校验共享对象第三层pytest 验证 tied 模型不 KeyError、别名指向同一对象锁进 CI。核心教训任何按固定权重名查找的分片 / 加载代码都必须先处理tied embedding 的别名合并。把 tie 关系做成显式映射并校验别名与目标共享同一对象是支持各类模型结构的前提——本系列第 531 篇GPT-OSS从 dispatcher 角度、本篇从 FSDP2 分片角度覆盖了同一类问题。

相关新闻

企业AI落地:从工具到生产力的关键路径

企业AI落地:从工具到生产力的关键路径

过去两年间, 企业级人工智能应用, 从概念验证阶段, 迅速迈进到规模化部署阶段。依据中国信息通信研究院, 在2025年所发布的《人工智能发展报告》里表明, 截止到2025年底, 国内当中, 已有47.3%的规模以上企业, 尝试把AI技术, 嵌入到至少一项核心业务流程之中, 相较于2023年的19.…

2026/8/3 0:32:42阅读更多 →
BetterGI如何通过计算机视觉技术实现原神自动化:从图像识别到智能决策

BetterGI如何通过计算机视觉技术实现原神自动化:从图像识别到智能决策

BetterGI如何通过计算机视觉技术实现原神自动化:从图像识别到智能决策 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…

2026/8/3 0:30:42阅读更多 →
现代化HPC集群管理解决方案:Slurm-web架构设计与实战部署深度解析

现代化HPC集群管理解决方案:Slurm-web架构设计与实战部署深度解析

现代化HPC集群管理解决方案:Slurm-web架构设计与实战部署深度解析 【免费下载链接】Slurm-web Open source web interface for Slurm HPC & AI clusters 项目地址: https://gitcode.com/gh_mirrors/sl/Slurm-web Slurm-web作为开源的高性能计算集群Web管…

2026/8/3 0:30:42阅读更多 →
fre:ac音频转换器:5分钟快速上手,免费实现专业级音频处理

fre:ac音频转换器:5分钟快速上手,免费实现专业级音频处理

fre:ac音频转换器:5分钟快速上手,免费实现专业级音频处理 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 你是否正在寻找一款完全免费、功能强大的音频转换工具?fre:…

2026/8/3 1:37:16阅读更多 →
中国移动一键登录SDK深度自定义:setAuthContentView实战指南

中国移动一键登录SDK深度自定义:setAuthContentView实战指南

1. 项目背景与核心诉求:为什么我们需要自定义授权界面?在移动应用开发中,用户登录是获取服务的第一步。对于国内应用而言,中国移动的“一键登录”能力因其便捷性(用户无需输入手机号和密码,由运营商直接授权…

2026/8/3 1:37:16阅读更多 →
【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

你有没有想过一个问题: 同一家公司,为什么要同时做七八个功能高度重叠的 AI 助手? WorkBuddy、CodeBuddy、QClaw、元宝、ima、Marvis、腾讯文档 AI……这些产品都号称「帮用户用 AI 干活」,但有的主打办公、有的主打编码、有的主打…

2026/8/3 1:37:16阅读更多 →
课程论文文献综述速成:大纲构建、引文排版与导师沟通流程

课程论文文献综述速成:大纲构建、引文排版与导师沟通流程

无论是大四写毕业论文开题报告,还是研究生每学期应对多门专业课的期末大作业,文献综述(Literature Review)都是绕不过去的关卡。很多同学在面对文献综述时,最大的痛点就是:不知道大纲怎么搭、参考文献排版极…

2026/8/3 1:37:16阅读更多 →
如何快速清理Windows 10系统臃肿?Win10BloatRemover一键解决方案

如何快速清理Windows 10系统臃肿?Win10BloatRemover一键解决方案

如何快速清理Windows 10系统臃肿?Win10BloatRemover一键解决方案 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based o…

2026/8/3 1:37:16阅读更多 →
W600 Wi-Fi SoC模块:物联网开发的核心架构、RT-Thread生态与实战应用

W600 Wi-Fi SoC模块:物联网开发的核心架构、RT-Thread生态与实战应用

1. W600模块:物联网开发的“瑞士军刀”初探在物联网项目开发的早期阶段,选型往往是决定项目成败和开发效率的关键一步。面对市场上琳琅满目的Wi-Fi模块,从乐鑫的ESP8266/ESP32系列,到联盛德的W600,再到其他众多方案&am…

2026/8/3 1:35:16阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →