You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何缓存OpenMDAO组件输出以避免组件重复执行计算?

实现子系统仅单次调用的两种方案

针对你提出的单次run_model执行周期内仅运行一次、每次run_driver调用时也仅运行一次的需求,可通过以下两种方案实现:


方案1:自定义运行状态标记(通用无依赖)

不需要依赖框架特定API,兼容性强,支持灵活的执行控制逻辑。
核心思路是在子系统内新增运行状态标记,compute方法执行前先检查标记状态,已执行过则直接跳过。

import numpy as np
import openmdao.api as om

class StaticDataGen(om.ExplicitComponent):
    def initialize(self):
        # 初始化运行状态标记
        self._has_computed = False

    def setup(self):
        # 按你的实际需求定义输入输出
        self.add_input('base_param', val=1.0)
        self.add_output('shared_data', shape=(20,))

    def compute(self, inputs, outputs):
        # 已完成计算则直接返回,不执行后续逻辑
        if self._has_computed:
            return
        # 你的数据生成逻辑
        outputs['shared_data'] = inputs['base_param'] * np.linspace(0, 100, 20)
        # 标记为已执行,后续调用直接跳过
        self._has_computed = True

if __name__ == "__main__":
    prob = om.Problem()
    # 添加第一个子系统:静态数据生成模块
    prob.model.add_subsystem('data_gen', StaticDataGen(), promotes=['*'])
    # 此处添加剩余4个业务子系统...

    prob.setup()

    # 第一次调用run_driver
    prob.run_driver() # 子系统compute仅执行1次后锁定
    # 第二次调用run_driver前先重置标记
    prob.model.data_gen._has_computed = False
    prob.run_driver() # 子系统重新执行1次后再次锁定

方案2:使用OpenMDAO原生输出缓存(代码更简洁)

如果你的子系统输入在单次run_driver周期内不会发生变化,可以直接使用框架自带的输出缓存能力,无需手动写状态判断逻辑。

import numpy as np
import openmdao.api as om

class StaticDataGen(om.ExplicitComponent):
    def initialize(self):
        # 开启输出缓存,输入无变化时框架会自动跳过compute调用
        self.options.declare('cache_outputs', default=True)

    def setup(self):
        self.add_input('base_param', val=1.0)
        self.add_output('shared_data', shape=(20,))

    def compute(self, inputs, outputs):
        outputs['shared_data'] = inputs['base_param'] * np.linspace(0, 100, 20)

方案选择建议

  • 若需要自定义执行控制规则(比如特定触发条件下才重新计算),或者要求每次调用run_driver都必须重新执行一次(无论输入是否变化),优先选择方案1,手动重置标记即可触发重新计算
  • 若仅需在输入不变时跳过重复计算,选择方案2,代码维护成本更低

内容的提问来源于stack exchange,提问作者tufan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:24:02