OpenMDAO中总雅可比组装耗时及导数计算时间分布查询咨询
OpenMDAO雅可比矩阵与导数耗时相关问题解答
1. 查看总雅可比矩阵组装耗时的方法
OpenMDAO没有直接提供单独的API来获取总雅可比组装耗时,但可以通过以下两种方式获取:
- 调试日志输出:将日志级别设置为
DEBUG,雅可比组装完成后会在日志中打印耗时信息,示例日志内容如下:DEBUG:openmdao.core.jacobian:Total time to assemble jacobian: 0.456 sec
开启日志的代码示例:import logging logging.basicConfig() logger = logging.getLogger('openmdao.core.jacobian') logger.setLevel(logging.DEBUG) - 性能分析工具:运行脚本时添加
--profile参数,生成的性能报告(如profile.stats)中,定位到Jacobian._assemble_jac函数,即可查看其对应的耗时。
2. 拆分driver_res.deriv_time的耗时分布
driver_res.deriv_time包含了导数计算全流程的耗时(组件偏导数计算、雅可比组装、并行通信等),可以通过以下方式拆分其构成:
- 统计所有组件
compute_partials总耗时:在自定义组件的compute_partials方法中添加计时逻辑,累计所有组件的耗时:
驱动运行完成后,遍历所有组件累加import time from openmdao.api import ExplicitComponent class CustomComp(ExplicitComponent): def compute_partials(self, inputs, partials): start_time = time.perf_counter() # 你的偏导数计算逻辑 partials['y', 'x'] = 2.0 * inputs['x'] end_time = time.perf_counter() # 记录当前组件的compute_partials耗时 self.cp_time = end_time - start_timecp_time得到总耗时:total_cp_time = 0.0 for comp in prob.model.system_iter(recurse=True, typ=ExplicitComponent): if hasattr(comp, 'cp_time'): total_cp_time += comp.cp_time - 推导雅可比组装耗时:用
driver_res.deriv_time减去total_cp_time,得到的差值即为雅可比矩阵组装及相关通信的耗时。 - 日志直接比对:开启DEBUG级别日志后,日志会分别输出每个组件
compute_partials的耗时,以及总雅可比组装的耗时,可直接对应查看分布情况。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

