我正在 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/