算法微分与具有分析导数的多个显式组件
Algorithmic Differentiation vs Multiple Explicit Components with Analytical Derivatives
我有一个由大约 6 个数学表达式组成的问题 - 即 (f(g(z(y(x))))),其中 x 是两个独立的数组。
我可以将这个表达式分解为多个具有解析导数的显式组件,或者使用算法微分方法来获得导数,从而将系统简化为单个显式组件。
据我所知,提前判断这两种方法之间可能存在的计算性能差异并不容易。
这可能取决于反向模式情况下的算法微分工具功能,但系统可能会非常大,具有多个显式组件,使用算法差异仍然可以。
我的问题是:
是算法差异。 developers/users 中任何一个正在使用的常用工具?
我发现 AlgoPY 但不确定其他 python 工具。
从 OpenMDAO v2.4 开始,OpenMDAO 开发团队还没有在任何纯 python 组件上大量使用 AD 工具。我们对它进行了一些试验,发现计算组件与手工区分组件相比增加了大约 2 倍。虽然预计会增加一些计算成本,但我不想表明我预计 2 倍是最终的经验法则。我们根本没有足够的数据来提供这样的估计。
Python 基于 AD 的工具远不如编译语言开发得好。动态类型和通用语言的灵活性都使编写好的 AD 工具更具挑战性。
我们已经将 OpenMDAO 与使用 AD 的编译代码(例如 CFD 和 FEA 工具)连接起来。在这些情况下,您总是使用 OpenMDAO 的无矩阵派生 API(apply_linear
和 compute_jacvec_product
)。
如果您的组件足够小以适合内存并且速度足够快以 运行 在单个进程中,我建议您手动区分您的代码。这将为您提供目前最好的整体性能。
AD 对小型串行组件的支持是我们将来会考虑支持的内容,但我们近期无法为您提供任何东西(从 OpenMDAO v2.4 开始)
我有一个由大约 6 个数学表达式组成的问题 - 即 (f(g(z(y(x))))),其中 x 是两个独立的数组。
我可以将这个表达式分解为多个具有解析导数的显式组件,或者使用算法微分方法来获得导数,从而将系统简化为单个显式组件。
据我所知,提前判断这两种方法之间可能存在的计算性能差异并不容易。 这可能取决于反向模式情况下的算法微分工具功能,但系统可能会非常大,具有多个显式组件,使用算法差异仍然可以。
我的问题是:
是算法差异。 developers/users 中任何一个正在使用的常用工具? 我发现 AlgoPY 但不确定其他 python 工具。
从 OpenMDAO v2.4 开始,OpenMDAO 开发团队还没有在任何纯 python 组件上大量使用 AD 工具。我们对它进行了一些试验,发现计算组件与手工区分组件相比增加了大约 2 倍。虽然预计会增加一些计算成本,但我不想表明我预计 2 倍是最终的经验法则。我们根本没有足够的数据来提供这样的估计。
Python 基于 AD 的工具远不如编译语言开发得好。动态类型和通用语言的灵活性都使编写好的 AD 工具更具挑战性。
我们已经将 OpenMDAO 与使用 AD 的编译代码(例如 CFD 和 FEA 工具)连接起来。在这些情况下,您总是使用 OpenMDAO 的无矩阵派生 API(apply_linear
和 compute_jacvec_product
)。
如果您的组件足够小以适合内存并且速度足够快以 运行 在单个进程中,我建议您手动区分您的代码。这将为您提供目前最好的整体性能。
AD 对小型串行组件的支持是我们将来会考虑支持的内容,但我们近期无法为您提供任何东西(从 OpenMDAO v2.4 开始)