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

3

我在HPC上翻转非常大的矩阵。显然,这需要很高的RAM要求。为避免内存不足错误,作为临时解决方案,我只是请求了大量内存(TB级别)。如何通过numpy.linalg.inv进行矩阵反演来预测所需的内存,以更有效地运行HPC作业?

1个回答

1
TL;DR: 对于类型为float64的(n,n)输入矩阵,最多需要O(32n²)字节。 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 矩阵,空间减半。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接