当前位置: 首页 > news >正文

Pytorch在FSDP模型中使用EMA

注:本文章方法只适用切分策略为SHARDED_STATE_DICT场景。

使用FSDP对模型权重切分后如何使用EMA网上搜了一圈没找到个一个靠谱的办法,干脆自己写一个算了,实现代码如下:

FSDP1版本实现

在torch2.1版本测试过。

importosfromtypingimportDict,Listfromcollectionsimportdefaultdictimporttorchfromtorch.distributed.fsdpimportFullyShardedDataParallelasFSDP,StateDictTypeimporttorch.distributed.checkpointasdist_cpfromtorch.distributed.checkpoint.default_plannerimportDefaultSavePlannerclassShardEMAModel:def__init__(self,fsdp_model:FSDP,decay:float=0.999):assertisinstance(fsdp_model,FSDP)self.fsdp_model=fsdp_model self.decay=decay self.shard_ema_state:Dict[str,List[torch.Tensor]]=defaultdict(list)shard_state=self._get_shard_state()fork,vinshard_state.items():forlocal_shardinv._local_shards:self.shard_ema_state[k].append(local_shard.tensor.clone())self.num_shard_params=sum([sum([t.numel()fortinv])forvinself.shard_ema_state.values()])print(f"Shard EMA Model has{self.num_shard_params/1e6:.3f}M params.")def_get_shard_state(self):withFSDP.state_dict_type(self.fsdp_model,StateDictType.SHARDED_STATE_DICT):shard_state=self.fsdp_model.state_dict()returnshard_state@torch.inference_mode()defupdate(self):"""update EMA Model shard weights"""shard_state=self._get_shard_state()fork,vinshard_state.items():foridx,local_shardinenumerate(v._local_shards):self.shard_ema_state[k][idx].mul_(self.decay).add_(local_shard.tensor,alpha=1-self.decay)defsave_ema_shard_weights(self,save_dir:str):"""save EMA Model shard weights"""withFSDP.state_dict_type(self.fsdp_model,StateDictType.SHARDED_STATE_DICT):os.makedirs(save_dir,exist_ok=True)shard_state=self.fsdp_model.state_dict()fork,vinshard_state.items():foridx,local_shardinenumerate(v._local_shards):local_shard.tensor=self.shard_ema_state[k][idx]state_dict={"model":shard_state}dist_cp.save(state_dict=state_dict,storage_writer=dist_cp.FileSystemWriter(save_dir),planner=DefaultSavePlanner(),)defsave_shard_weights(self,save_dir:str):"""save original FSDP Model shard weights"""withFSDP.state_dict_type(self.fsdp_model,StateDictType.SHARDED_STATE_DICT):os.makedirs(save_dir,exist_ok=True)shard_state=self.fsdp_model.state_dict()state_dict={"model":shard_state}dist_cp.save(state_dict=state_dict,storage_writer=dist_cp.FileSystemWriter(save_dir),planner=DefaultSavePlanner(),)

FSDP2版本实现

torch版本需大于等于2.9.0,暂未测试。

importosfromcollectionsimportOrderedDictimporttorchimporttorch.distributed.checkpointasdcpfromtorch.distributed.tensorimportDTensorfromtorch.distributed.fsdpimportFSDPModuleclassShardEMAModel:def__init__(self,fsdp_model:FSDPModule,decay:float=0.999):assertisinstance(fsdp_model,FSDPModule)self.fsdp_model=fsdp_model self.decay=decay self.shard_ema_state:OrderedDict[str,DTensor]=self.fsdp_model.state_dict()self.num_shard_params=sum([v.numel()forvinself.shard_ema_state.values()])print(f"Shard EMA Model has{self.num_shard_params/1e6:.3f}M params.")@torch.inference_mode()defupdate(self):"""update EMA Model shard weights"""shard_state=self.fsdp_model.state_dict()fork,vinshard_state.items():self.shard_ema_state[k].mul_(self.decay).add_(v,alpha=1-self.decay)defsave_ema_shard_weights(self,save_dir:str):"""save EMA Model shard weights"""os.makedirs(save_dir,exist_ok=True)state_dict={"model":self.shard_ema_state}dcp.save(state_dict=state_dict,checkpoint_id=save_dir)defsave_shard_weights(self,save_dir:str):"""save original FSDP Model shard weights"""os.makedirs(save_dir,exist_ok=True)shard_state=self.fsdp_model.state_dict()state_dict={"model":shard_state}dcp.save(state_dict=state_dict,checkpoint_id=save_dir)

使用示例:

# create FSDP Model and EMA Modelfsdp_model=FSDP(...)ema_model=ShardEMAModel(fsdp_model,decay=0.99)# train fsdp model and optimizer weights...# update EMA Model shard weightsema_model.update()# save EMA Model shard weightsema_model.save_ema_shard_weights("save_path")
http://www.cnnetsun.cn/news/2119180.html

相关文章:

  • 如何高效管理AWS Glue数据目录:og-aws开源指南的终极实践技巧
  • Framepack技术提升图像编辑模型指令理解与一致性
  • 04-10-03 寻找理由 - 学习笔记
  • 自托管云端IDE:Cherry Studio架构解析与部署实践
  • 告别屏幕抢占!Unity多屏展示项目实战:用配置文件精准控制Camera和Canvas的显示屏幕
  • 如何利用Hono框架的ETag与Cache API实现毫秒级缓存优化
  • 客观性堡垒:在亚马逊,为何你需要“外部篮板”来反弹你的内部偏见
  • 如何快速成为麻将高手:Akagi麻雀助手完整实战指南
  • G-Helper完整指南:5分钟掌握华硕笔记本性能优化方案
  • 3步实现完美字幕同步:Sushi音频智能匹配技术深度解析
  • 深度解析 d2s-editor:暗黑破坏神2存档编辑完全指南
  • XUnity自动翻译器:Unity游戏无障碍汉化的终极解决方案
  • 分布式系统CAP理论深度解析
  • 高效提取Wallpaper Engine资源:RePKG工具深度使用指南
  • 《Windows Internals》10.2.17 学习笔记:服务启动流程(Service start)——为什么“启动一个服务”看起来只是一瞬间,背后却是一整条从 SCM 到 Running 的完
  • 强化学习合成环境验证方法与工程实践
  • Windows电脑直接运行安卓应用:APK安装器终极指南
  • Python医疗AI落地生死线:为什么92%的影像模型在真实科室失败?(附FDA/CE双认证合规 checklist)
  • 终极指南:使用evernote-backup命令行工具轻松备份你的Evernote笔记
  • Cloudsplaining版本更新:从0.8.3看AWS IAM安全评估工具演进
  • 革命性安全参考OWASP Cheat Sheet Series:开发者的安全防护宝典
  • 华为交换机实战:用MSTP+VRRP+DHCP+Eth-Trunk+BFD搭建一个高可用企业网(附配置清单)
  • Mathsteps根式运算:掌握n次方根的简化与乘法
  • 【车规级TSN确定性通信终极方案】:基于C语言的gPTP+CBS+ATS三级协同调度,实测端到端抖动<125ns(附ASAM MCD-2MC兼容源码片段)
  • 3分钟解锁你的音乐宝藏:ncmdumpGUI让网易云NCM文件重获自由
  • 从零起步,掌握大模型只需这5本书!——大模型书籍推荐精选
  • net-speeder终极指南:如何在高延迟网络下实现2倍下载加速
  • TikTokDownload终极指南:3分钟掌握抖音去水印批量下载完整技巧
  • Venera:开启跨平台漫画阅读的数字艺术新纪元
  • SDXL潜在空间解析与图像生成控制技巧