PyTorch Lightning Fabric 多模型与多优化器实战:setup 机制、四种组合模式与源码级解析
PyTorch Lightning Fabric 多模型与多优化器实战setup 机制、四种组合模式与源码级解析【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址: https://gitcode.com/gh_mirrors/py/pytorch-lightningLightning Fabric 通过统一的fabric.setup()接口让同一套训练代码在单卡、多卡 DDP、FSDP、DeepSpeed 等不同策略下无需修改即可运行。本文聚焦 Fabric 中多模型、多优化器这一高频场景GAN、自编码器、元学习等完整讲解四种模型—优化器组合模式的写法并结合仓库源码剖析setup背后的包装与校验逻辑帮助你写出真正 strategy-agnostic 的训练代码。为什么需要同时管理多个模型与优化器现代深度学习任务中一个训练流程往往不只包含一个模型和一个优化器生成对抗网络GAN生成器Generator与判别器Discriminator是两个独立的模型各自拥有独立的优化器交替更新自编码器Auto-encoder编码器与解码器共享或部分共享参数可能需要按模块施加不同的学习率元学习Meta-learning内循环、外循环各自维护模型与优化器参数更新方式完全不同。在这些场景下模型与优化器的配对关系五花八门。Fabric 给出的核心原则只有一条原文与实现完全一致只要你有一个优化器就应该把模型和优化器一起交给fabric.setup()这样才能让代码真正与所选策略无关strategy-agnostic。这条原则的源码依据在 setup 方法定义fabric.setup()接收一个模型和任意多个优化器统一完成设备搬移、精度转换、策略包装DDP/FSDP/DeepSpeed 等以及_FabricModule/_FabricOptimizer的封装。下面按四种组合模式逐一展开。模式一一个模型 一个优化器最简形态这是最常见的训练形态。模型与优化器必须成对交给setup()import torch from lightning.fabric import Fabric fabric Fabric() # Instantiate model and optimizer model LitModel() optimizer torch.optim.Adam(model.parameters()) # Set up the model and optimizer together model, optimizer fabric.setup(model, optimizer)关键点fabric.setup()返回的model是包装后的_FabricModule返回的optimizer是包装后的_FabricOptimizer必须用返回值覆盖原变量后续训练循环中的optimizer.step()、fabric.backward()才具备跨策略能力根据所选策略不同setup内部会执行不同的包装动作例如 DDPStrategy.setup_module 会把模型包装成torch.nn.parallel.distributed.DistributedDataParallelFSDPStrategy 则包装成FullyShardedDataParallel并要求use_orig_paramsTrue。setup()的完整签名摘自 fabric.pydef setup( self, module: nn.Module, *optimizers: Optimizer, scheduler: Optional[_LRScheduler] None, move_to_device: bool True, _reapply_compile: bool True, ) - Any:各参数含义参数默认值说明module必填要 setup 的torch.nn.Module每次 setup 只能传一个*optimizers空零个或多个优化器按传入顺序返回schedulerNone可选的学习率调度器必须在优化器之后传入move_to_deviceTrue是否自动把模型搬到目标设备设为False时可手动调用fabric.to_device()_reapply_compileTrue若模型此前被torch.compile过策略包装如 DDP/FSDP完成后会用相同设置重新应用编译返回值规则不传优化器时只返回包装后的模型传了优化器且带 scheduler时按(module, *optimizers, scheduler)的顺序返回元组与传入顺序一一对应。模式二一个模型 多个优化器当模型的各部分需要不同的优化器或学习率时例如不同层采用不同的lr可以给同一个模型挂多个优化器# Instantiate model and optimizers model LitModel() optimizer1 torch.optim.SGD(model.layer1.parameters(), lr0.003) optimizer2 torch.optim.SGD(model.layer2.parameters(), lr0.01) # Set up the model and optimizers together model, optimizer1, optimizer2 fabric.setup(model, optimizer1, optimizer2)使用要点多个优化器会按传入顺序原样返回逐一对应到optimizer1、optimizer2训练循环中可分别控制各优化器的更新时机例如按阶段交替step()若还配有调度器写法为model, opt1, opt2, scheduler fabric.setup(model, opt1, opt2, schedulerscheduler)该示例直接来自 setup 的 docstring。模式三多个模型 一个优化器多个模型共享一个优化器时最稳妥的写法是把所有子模型聚合到一个顶层nn.Module下让 Fabric 把它当作一个模型处理class AutoEncoder(torch.nn.Module): def __init__(self): super().__init__() # Group all models under a common nn.Module self.encoder Encoder() self.decoder Decoder()聚合之后所有子模型即可被当作单一模型进行 setup# Instantiate the big model autoencoder AutoEncoder() optimizer ... # Set up the model(s) and optimizer together autoencoder, optimizer fabric.setup(autoencoder, optimizer)这样做的原因可以从setup的实现中得到解释setup的第一个参数始终是一个nn.Module策略包装尤其是 DDP 这类分布式包装也以模块为单位进行把子模型收拢进一个容器模块后optimizer里收集到的encoder与decoder参数仍属于同一个模块树梯度同步、状态广播等分布式逻辑才能正确覆盖全部参数。如果希望各子模型分别参与 setup则应采用下面多模型多优化器的写法而不是强行共用一个优化器。模式四多个模型 多个优化器这是 GAN 类任务的标准结构——两个模型、各自独立的优化器、交替更新。Fabric 支持按模型 优化器配对分多次 setup# Two models generator Generator() discriminator Discriminator() # Two optimizers optimizer_gen torch.optim.SGD(generator.parameters(), lr0.01) optimizer_dis torch.optim.SGD(discriminator.parameters(), lr0.001) # Set up generator generator, optimizer_gen fabric.setup(generator, optimizer_gen) # Set up discriminator discriminator, optimizer_dis fabric.setup(discriminator, optimizer_dis)也可以一次 setup 一个模型加多个优化器甚至多次 setup 组合出任意数量的模型—优化器配对。仓库中提供了完整的 DCGAN 示例examples/fabric/dcgan/train_fabric.py配套说明见 README。该示例的 setup 环节与本文模式四完全对应optimizer_d optim.Adam(discriminator.parameters(), lrlr, betas(beta1, 0.999)) optimizer_g optim.Adam(generator.parameters(), lrlr, betas(beta1, 0.999)) discriminator, optimizer_d fabric.setup(discriminator, optimizer_d) generator, optimizer_g fabric.setup(generator, generator_optimizer)训练循环中判别器与生成器各自执行zero_grad→ 前向 →fabric.backward()→optimizer.step()的独立更新且所有张量real、label、noise都通过fabric.device创建保证设备无关。该示例还展示了fabric.setup_dataloaders()、fabric.print()、fabric.is_global_zero与fabric.barrier()在多进程下的配套用法。可通过sdiff train_torch.py train_fabric.py对比原生 PyTorch 与 Fabric 写法的差异见 README。setup 的底层发生了什么从源码看完整流程理解setup的内部流程有助于判断什么时候该把模型和优化器一起 setup、什么时候必须分开。根据 fabric.py 的实现setup()的执行步骤为合法性校验_validate_setup见 L1200-L1216模型不能是已包装的_FabricModule每个模型只能 setup 一次优化器同理FSDP 策略下若优化器引用了 meta device 上的参数会抛出提示改用分步 setup编译解包若模型已被torch.compile先解包OptimizedModule待策略包装完成后再按原设置重新应用_reapply_compile控制精度转换self._precision.convert_module(module)应用所选的混合精度/低精度配置设备搬移move_to_deviceTrue时把模型及其优化器参数引用搬到目标设备策略包装若传入了优化器调用self._strategy.setup_module_and_optimizers(module, optimizers, scheduler)否则只调用setup_module。默认实现见 strategy.py L150-L161会依次调用策略的setup_module如 DDP 包装与每个优化器的setup_optimizerFabric 包装模型包装为_FabricModule每个优化器包装为_FabricOptimizer并触发on_after_setup回调。校验逻辑中还包含一条重要约束DeepSpeed 与 XLA 策略必须联合 setup。见 fabric.py L1223-L1229if isinstance(self._strategy, (DeepSpeedStrategy, XLAStrategy)): raise RuntimeError( fThe {type(self._strategy).__name__} requires the model and optimizer(s) to be set up jointly through .setup(model, optimizer, ...). )也就是说在这类策略下前文的模式一/二模型与优化器一起 setup是唯一合法路径。进阶需要分步 setup 的场景FSDP 与自定义优化器虽然原则是模型与优化器一起 setup但存在必须分步的情况。Fabric提供了两个配套方法fabric.setup_module(model)只包装模型等价于setup(model)不传优化器fabric.setup_optimizers(*optimizers)只包装优化器且要求至少传入一个优化器。分步写法来自 setup_module 的 docstring# Set up model first (useful for FSDP) model fabric.setup_module(model) # Then create and set up optimizer optimizer torch.optim.Adam(model.parameters()) optimizer fabric.setup_optimizers(optimizer)需要分步的典型场景FSDP 且use_orig_paramsFalse从 FSDPStrategy.setup_module_and_optimizers 的实现可见联合 setup 会强制要求use_orig_paramsTrue若设置为False必须按先setup_module、创建优化器、再setup_optimizer的顺序操作FSDP 下优化器引用 meta device 参数校验逻辑fabric.py L1208-L1216会拒绝这种组合提示先 setup 模型再创建优化器需要自定义优化器包装逻辑setup_optimizer允许策略对优化器做额外处理。例如 FSDP 的 setup_optimizer 会校验优化器是否基于包装后的扁平化参数创建。常见问题与最佳实践小结务必用返回值覆盖变量model, optimizer fabric.setup(model, optimizer)不要只调用不接收返回否则训练仍在未包装的原始对象上进行分布式与精度逻辑不生效。每个对象只 setup 一次_validate_setup会直接对重复 setup 抛出ValueErrorA model should be passed only once to the setup method.。优化器必须在模型 setup 之后创建FSDP 场景需要分步 setup 时先setup_module再从包装后的模型参数创建优化器最后setup_optimizers。DeepSpeed / XLA 只能联合 setup不要尝试用setup_modulesetup_optimizers拆分否则会触发RuntimeError。多模型共享优化器时先聚合把子模型收拢到一个顶层nn.Module如AutoEncoder再整体 setup保证策略包装覆盖全部参数。调度器与优化器一起传scheduler参数只在传了优化器时可用且必须位于优化器之后。四种组合模式的选用可归纳如下表组合推荐写法典型场景1 模型 1 优化器model, opt fabric.setup(model, opt)常规监督训练1 模型 N 优化器model, o1, o2 fabric.setup(model, o1, o2)分层学习率、局部微调N 模型 1 优化器先聚合为顶层nn.Module再 setup自编码器、共享参数模型N 模型 N 优化器按配对多次调用setupGAN、元学习无论哪种组合核心都是把模型与其优化器作为整体交给fabric.setup()让设备、精度、分布式包装的复杂度由 Fabric 按所选策略统一处理从而保证代码在单机单卡到多机多卡之间零改动迁移。【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址: https://gitcode.com/gh_mirrors/py/pytorch-lightning创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Gatsby 与 npm:用 Node 包管理器安装、运行与维护 Gatsby 站点的完整指南

Gatsby 与 npm:用 Node 包管理器安装、运行与维护 Gatsby 站点的完整指南

Gatsby 与 npm:用 Node 包管理器安装、运行与维护 Gatsby 站点的完整指南 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby npm(Node…

2026/9/19 20:37:15 阅读更多 →
slate-react 源码架构指南:Components、Hooks、Plugins 与 Utils 四大模块全解析

slate-react 源码架构指南:Components、Hooks、Plugins 与 Utils 四大模块全解析

slate-react 源码架构指南:Components、Hooks、Plugins 与 Utils 四大模块全解析 【免费下载链接】slate A completely customizable framework for building rich text editors. (Currently in beta.) 项目地址: https://gitcode.com/gh_mirrors/sl/slate s…

2026/9/20 22:24:46 阅读更多 →
Civitai 内容审核体系解析:用户控制、自动化标签与社区协同的完整实现

Civitai 内容审核体系解析:用户控制、自动化标签与社区协同的完整实现

Civitai 内容审核体系解析:用户控制、自动化标签与社区协同的完整实现 【免费下载链接】civitai A repository of models, textual inversions, and more 项目地址: https://gitcode.com/GitHub_Trending/ci/civitai Civitai 是一个面向 AI 生成模型、图像与…

2026/9/19 20:37:15 阅读更多 →

最新新闻

Creatify Boreal视频广告生成实战:文生视频与图生视频工作流拆解

Creatify Boreal视频广告生成实战:文生视频与图生视频工作流拆解

1. 视频广告生成赛道的格局变化与Boreal的切入点视频广告的制作成本一直是中小团队最头疼的问题。一条15秒的信息流广告,从脚本、拍摄、剪辑到后期,传统流程走下来少说三到五天,外包报价动辄几千到几万。即便是有了AI辅助,大多数团…

2026/9/21 1:25:47 阅读更多 →
Relay 路由(Routes)完全指南:定义查询入口、组合片段与接入 RootContainer

Relay 路由(Routes)完全指南:定义查询入口、组合片段与接入 RootContainer

前端开发工具 【免费下载链接】relay Relay is a JavaScript framework for building data-driven React applications. 项目地址: https://gitcode.com/gh_mirrors/relay29/relay 点击查看 免费下载 本篇指南围绕 Relay Classic 时代的核心概念 Routes&#xff08…

2026/9/21 1:25:47 阅读更多 →
Kivy 的 iOS 打包前置条件:Xcode、开发者账号与 Homebrew 依赖环境搭建指南

Kivy 的 iOS 打包前置条件:Xcode、开发者账号与 Homebrew 依赖环境搭建指南

Kivy 的 iOS 打包前置条件:Xcode、开发者账号与 Homebrew 依赖环境搭建指南 【免费下载链接】kivy Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS 项目地址: https://gitcode.com/gh_mirrors/ki/kivy 导读…

2026/9/21 1:25:47 阅读更多 →
Transformer架构解析:从原理到实践

Transformer架构解析:从原理到实践

1. 为什么Transformer彻底改变了AI领域2017年那篇《Attention Is All You Need》论文像一颗炸弹,把传统的RNN和CNN架构炸得粉碎。我在第一次接触Transformer时,被它的并行计算能力震惊了——原来处理序列数据可以不用按部就班地逐个计算。这种架构突破直…

2026/9/21 1:25:47 阅读更多 →
7days-golang分布式缓存GeeCache:如何模仿groupcache在7天实现一个分布式缓存系统

7days-golang分布式缓存GeeCache:如何模仿groupcache在7天实现一个分布式缓存系统

7days-golang分布式缓存GeeCache:如何模仿groupcache在7天实现一个分布式缓存系统 【免费下载链接】7days-golang 7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc fra…

2026/9/21 1:25:47 阅读更多 →
AI出海合规实战:GDPR数据本地化与知识产权诉讼应对

AI出海合规实战:GDPR数据本地化与知识产权诉讼应对

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 1:24:47 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →