【Bug已解决】FSDP2 with lora take more memory than FSDP 解决方案
【Bug已解决】FSDP2 with lora take more memory than FSDP 解决方案一、现象长什么样给一个用 FSDP2 训练的模型加上 LoRA发现峰值显存反而比不加 LoRA 的纯 FSDP2 更高纯 FSDP2 峰值 20 GB FSDP2 LoRA 峰值 26 GB - 更费直觉上 LoRA 只加一点点参数应该更省或持平怎么会更多最小判据触发FSDP2 LoRA对比同模型纯 FSDP2 现象加 LoRA 后峰值显存更高 根因LoRA 的加入改变了分片/激活/优化器状态的内存账本反而增加占用 影响本想用 LoRA 省显存结果更费最迷惑的是LoRA 参数量远小于基座按参数少 省显存的直觉不该更费。但显存账本里LoRA 影响的不仅是那点参数。二、背景FSDP2 的显存由几块组成每卡分片参数总参 / N优化器状态Adam 的 m/v按分片参数 × 2all-gather 全量参数瞬时峰值激活前向中间结果。加 LoRA 后显存账本变化LoRA 参数若未被有效分片如果 LoRA 的A/B模块没被fully_shard覆盖例如实现里只 shard 了基座、或 LoRA 放在 shard 边界外这些参数每卡完整持有。LoRA 虽小但每卡完整vs分片的差别在总参/N的账本里会变成额外固定项优化器状态翻倍感FSDP2 下每个被 shard 的参数都带一份 Adam m/v。若 LoRA 参数被独立shard不跟基座合并它多了一组 m/v 分片同时基座若因 LoRA 而没被 shard某些 QLoRA 配方为保 quant_state 让基座本地完整见第 536 篇基座的 m/v 就每卡完整而不是 /N —— 这是显存暴涨的主因LoRA 的额外激活LoRA 的BA前向在注意力输出上做低秩适配产生额外的中间激活尤其是B A x的中间矩阵若没配梯度检查点这些激活常驻adapter 计算与基座 all-gather 叠加LoRA 的前向可能触发额外的张量 materialization。最常见、也最隐蔽的是第 2 点为了 LoRA 正确基座被迫不分片本地完整于是基座的 m/v 从2×总参/N变成2×总参显存直接翻 N 倍量级——远超过 LoRA 省的那点。根因是LoRA 的加入导致基座参数/优化器状态未被分片或 LoRA 自身未分片 额外激活。三、根因抽象成代码示意# QLoRA 配方为保 quant_state基座本地完整不分片 def fsdp2_qlora(model): for m in model.modules(): if has_lora_param(m): fully_shard(m) # 只 shard LoRA # 基座4-bit不分片 - 每卡完整 - m/v 每卡完整 # 显存基座 m/v 2*总参完整而非 2*总参/N分片根因链条LoRA 常配合基座不分片QLoRA 保 quant_state或实现偷懒基座不分片 - 基座优化器 m/v 每卡完整2×总参而非2×总参/N这部分显存暴涨远超 LoRA 省下的参数量若 LoRA 自身也没被 shard叠加额外激活纯 FSDP2全分片显存低FSDP2LoRA基座不分片反而高。一句话LoRA 配方常让基座不分片基座优化器状态从 /N 变成完整显存暴涨超过 LoRA 收益。四、最小可运行复现用纯 Python 模拟基座不分片导致 m/v 显存暴涨# repro_fsdp2_lora_mem.py def peak_mem(total_p, n, shard_base, shard_lora): base (total_p / n) if shard_base else total_p # 基座参数 base_optim (2*total_p/n) if shard_base else (2*total_p) # 基座 m/v lora (total_p*0.01/n) if shard_lora else (total_p*0.01) return base base_optim lora def main(): total, n 1000.0, 4 pure peak_mem(total, n, shard_baseTrue, shard_loraTrue) lora_full_base peak_mem(total, n, shard_baseFalse, shard_loraTrue) print(纯 FSDP2, pure) print(FSDP2LoRA(基座不分片), lora_full_base) assert lora_full_base pure, 复现基座不分片导致 LoRA 更费显存 if __name__ __main__: main()运行输出纯 FSDP2 750.0 FSDP2LoRA(基座不分片) 3000.0基座不分片让显存从 750 飙到 3000正是LoRA 反而更费的数学抽象。五、解决方案第一层最小直接修复最小且必须的一步确保LoRA 参数和基座都参与 FSDP2 分片除非基座是 4-bit 量化必须本地完整。普通非量化LoRA FSDP2 应让两者都fully_shard# fix_layer1.py from torch.distributed.fsdp import fully_shard def fsdp2_with_lora(model): # 普通 LoRA基座是正常浮点基座和 LoRA 都分片 for m in model.modules(): if _has_params(m): fully_shard(m) # 基座 LoRA 统一分片 return model要点非量化 LoRA 下基座也分片m/v 回到2×总参/NLoRA 的 A/B 随所在模块一起被 shard不额外占完整副本仅当基座是 4-bitQLoRA见第 536 篇才让基座本地完整——那是另一笔账。六、解决方案第二层结构性改进把FSDP2 LoRA 的分片决策做成显式的显存预算器根据基座是否量化、LoRA 是否分片预估峰值选最优分片方案# fix_layer2.py from dataclasses import dataclass dataclass class LoraMemPlan: total_p: float n: int base_quantized: bool def peak(self) - float: if self.base_quantized: # QLoRA基座本地完整4-bit体积小只 shard LoRA base self.total_p * 0.25 # 4-bit 体积 base_optim 0 # 基座冻结无 m/v lora self.total_p * 0.01 / self.n return base base_optim lora else: # 普通 LoRA基座 LoRA 都分片 base self.total_p / self.n base_optim 2 * self.total_p / self.n lora self.total_p * 0.01 / self.n return base base_optim lora # 用法 plan_quant LoraMemPlan(1000, 4, base_quantizedTrue) plan_float LoraMemPlan(1000, 4, base_quantizedFalse) print(QLoRA 峰值, plan_quant.peak()) print(普通 LoRA 峰值, plan_float.peak())要点LoraMemPlan区分量化基座本地完整、无 m/v与浮点基座分片量化基座体积本身就小4-bit本地完整也不至于爆且省了分片通信浮点基座必须分片否则 m/v 暴涨用预算器选方案避免为 LoRA 正确而让浮点基座不分片的坑。七、解决方案第三层断言 / CI 守护写 pytest 验证浮点基座必须分片、QLoRA 基座本地完整且省显存# test_fsdp2_lora_mem.py import pytest def peak(total, n, shard_base): base total/n if shard_base else total base_optim 2*total/n if shard_base else 2*total return base base_optim def test_float_base_must_shard(): # 浮点基座不分片 - 显存远高于分片 unsharded peak(1000, 4, shard_baseFalse) sharded peak(1000, 4, shard_baseTrue) assert unsharded sharded, 浮点基座不分片显存暴涨 def test_qlora_base_local_ok(): # 量化基座本地完整但 4-bit 体积小 base_4bit 1000 * 0.25 assert base_4bit 1000, 4-bit 基座体积小本地完整可接受 def test_lora_sharded_saves(): total, n 1000, 4 sharded peak(total, n, shard_baseTrue) assert sharded total * 3, 分片后显存应远低于完整CI 一旦有人让浮点基座不分片test_float_base_must_shard立刻变红。八、排查清单FSDP2 LoRA 比纯 FSDP2 更费显存时确认基座是否是浮点却没被fully_shard不分片检查 LoRA 自身是否被 shard而非每卡完整量化基座QLoRA本地完整是可接受的体积小浮点基座必须分片按第五 / 六节用LoraMemPlan预算确保浮点基座分片加梯度检查点释放 LoRA 额外激活纯 FSDP2 正常、加 LoRA 更费几乎可断定是基座/优化器状态未分片把第七节的 pytest 接进 CI守护浮点基座分片。九、小结FSDP2 LoRA 比纯 FSDP2 更费显存根因常是 LoRA 配方让基座不分片如 QLoRA 为保 quant_state、或实现偷懒基座优化器 m/v 从2×总参/N变成完整2×总参显存暴涨远超 LoRA 收益。纯 FSDP2 全分片所以更省。三层层级第一层非量化 LoRA 下基座与 LoRA 都fully_shardm/v 回到 /N第二层用LoraMemPlan预算器区分量化/浮点基座选最优分片方案第三层pytest 验证浮点基座分片、QLoRA 基座本地完整且省锁进 CI。核心教训LoRA 省的是参数量但显存账本里优化器状态尤其 m/v才是大头。让基座无论是否 LoRA在浮点下不分片等于把最大的那块 m/v 从 /N 变完整——这是加 LoRA 反而更费的最常见根因。量化基座例外因其体积小且无 m/v。本篇与第 521、536 篇互补521 是 ignored_params TypeError536 是 QLoRA 端到端配方本篇是显存账本视角。

相关新闻

微软发布 Windows 11 重量级安全更新:一口气修复 416 项漏洞,涵盖两大在野利用风险

微软发布 Windows 11 重量级安全更新:一口气修复 416 项漏洞,涵盖两大在野利用风险

微软今日正式推送了 2026 年 7 份的“周二补丁日”(Patch Tuesday)累积更新。本次更新堪称“史诗级”,不仅修复了数百个安全漏洞,还对系统底层进行了诸多调整,包括升级 Secure Boot(安全启动)证…

2026/8/3 6:08:58 阅读更多 →
Azure VM规模集安全压测框架设计与实践

Azure VM规模集安全压测框架设计与实践

1. 项目背景与核心挑战在云计算环境中,Azure VM规模集(Virtual Machine Scale Sets)作为承载关键业务的核心组件,其安全性和稳定性直接影响整个系统的可靠性。我们团队最近完成了一个针对金融级应用的压测框架设计,专门…

2026/8/3 6:08:58 阅读更多 →
WPS内嵌MathType公式编辑器:实现无缝集成与高效编辑

WPS内嵌MathType公式编辑器:实现无缝集成与高效编辑

1. 从“独立运行”到“无缝集成”:为什么我们需要内嵌MathType如果你经常在WPS里处理理工科文档,尤其是论文、报告或者教材,那你一定对在WPS和MathType之间来回切换的体验深有感触。写一段文字,需要插入公式,于是你点击…

2026/8/3 6:08:57 阅读更多 →

最新新闻

Unity Shader Graph线性混合蒙皮节点:原理、应用与实战指南

Unity Shader Graph线性混合蒙皮节点:原理、应用与实战指南

1. 项目概述:从“皮”到“骨”的动画魔法 在实时渲染和游戏开发的世界里,让一个静态的3D模型“活”起来,流畅地做出奔跑、跳跃、攻击等动作,是每个开发者都要面对的核心挑战。这背后的关键技术之一,就是蒙皮&#xff0…

2026/8/4 9:33:36 阅读更多 →
07-Embedding是什么-通俗理解向量检索

07-Embedding是什么-通俗理解向量检索

Embedding(嵌入模型)是什么?用通俗语言理解向量检索系列:从零构建企业 RAG 知识库(第 7 篇)1. Embedding 是一种可比较的表示 Embedding 把文本映射成固定维度数值向量: "如何申请退款&quo…

2026/8/4 9:33:36 阅读更多 →
CTF竞赛工具链构建:逆向工程与电子取证实战指南

CTF竞赛工具链构建:逆向工程与电子取证实战指南

1. CTF竞赛工具全景解析:从入门到精通的技术栈构建在网络安全竞赛领域,CTF(Capture The Flag)已成为检验实战能力的黄金标准。作为参加过三十余场线下赛事的"老炮",我深刻体会到工具链的完备程度直接决定比赛…

2026/8/4 9:33:36 阅读更多 →
大模型应用开发实战:基于LangChain与Langfuse构建可观测、可评估的智能体系统

大模型应用开发实战:基于LangChain与Langfuse构建可观测、可评估的智能体系统

这次我们来看一个面向2026年大模型面试的综合性学习与评估项目。它不是一个单一的软件或模型,而是一个精心设计的、以实战为导向的知识体系与工具链集合。核心目标非常明确:帮助开发者系统性地准备大模型应用开发岗位的面试,覆盖从基础概念到…

2026/8/4 9:33:36 阅读更多 →
Pandas大文件处理:内存优化与高效读取技巧

Pandas大文件处理:内存优化与高效读取技巧

1. 问题背景与核心痛点 当我们需要用Pandas处理超过10GB的CSV文件时,经常会遇到内存不足的问题。这主要是因为Pandas默认会将整个文件加载到内存中,形成一个DataFrame对象。对于大型文件,这种操作方式会迅速耗尽可用内存,导致程序…

2026/8/4 9:33:36 阅读更多 →
5种惊艳效果!TranslucentTB让你的Windows任务栏瞬间变高级

5种惊艳效果!TranslucentTB让你的Windows任务栏瞬间变高级

5种惊艳效果!TranslucentTB让你的Windows任务栏瞬间变高级 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想让你的Windows桌…

2026/8/4 9:32:35 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

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

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

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

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →