我在HPC上翻转非常大的矩阵。显然,这需要很高的RAM要求。为避免内存不足错误,作为临时解决方案,我只是请求了大量内存(TB级别)。如何通过numpy.linalg.inv进行矩阵反演来预测所需的内存,以更有效地运行HPC作业?
numpy.linalg.inv
调用 内部 的 _umath_linalg.inv
函数,而不执行任何复制或创建任何额外的大型临时数组。这个内部函数本身会 内部 调用 LAPACK 函数。据我所知,Numpy 的包装层负责分配输出的 Numpy 矩阵。C 代码本身会分配一个临时数组(参见:此处)。对于此操作,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
矩阵,空间减半。