python - 如何预测 np.linalg.inv 的内存需求?

标签 python numpy

我正在 HPC 上反转非常大的矩阵。显然,这对 RAM 有很高的要求。为了避免内存不足错误,作为临时解决方案,我一直在请求大量内存 (TB)。我如何使用 numpy.linalg.inv 根据输入矩阵大小预测矩阵求逆所需的内存,以更高效地运行 HPC 作业?

最佳答案

TL;DR:(n,n) 类型的输入矩阵最多 O(32 n²) 字节float64.

numpy.linalg.inv调用 _umath_linalg.inv internally无需执行任何复制或创建任何额外的大临时数组。此内部函数本身调用 LAPACK 函数 internally .据我了解,Numpy 的包装层负责分配输出 Numpy 矩阵。 C 代码本身分配一个临时数组(参见:here)。 Numpy 似乎没有为此操作执行其他数组分配。有几个 Lapack 实现,因此通常无法知道 Lapack 调用请求了多少内存。但是,据我所知,几乎所有 Lapack 实现都不会在您的后台分配数据:调用者必须这样做(尤其是对于此处使用的 sgesv/dgesv)。假设 (n, n) 输入矩阵是 float64 类型并且 FORTRAN 整数是 4 字节的(在大多数平台上应该是这种情况,尤其是在 Windows 上),那么实际所需的内存(由输入矩阵、输出矩阵和临时矩阵占用)是 8 n² + 8 n² + (8 n² + 8 n² + 4 n) 字节,等于(32 n + 4) n 或简单的 O(32 n²) 字节。请注意,临时缓冲区是最大大小,可能无法完全写入,这意味着操作系统只能物理映射(即保留在物理 RAM 中)分配空间的一小部分。这就是我的(Linux)机器上使用 OpenBLAS 时发生的情况:只有 24 n² 字节似乎是实际映射的。对于 float32 矩阵,它是空间的一半。

关于python - 如何预测 np.linalg.inv 的内存需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70746660/

相关文章:

python - 在Python中循环写入命令以分别从列表中输出许多不同的索引

python - 比较 Python 中嵌套字典的键和值

python - 如何根据相对值对 numpy 数组的每个元素进行操作?

python - python中的求和求和

python - Numpy reshape 对复制数组和未复制数组的作用不同

python - 用于从文本中获取 $ 字符之间内容的正则表达式

带密码子的 Python 正则表达式

python - 为什么在从 numpy empty_like 构造时打印数据框会破坏 python

python - 如何计算计数值对的标准差

python - 将 numpy 函数转换为 theano