内存大小很重要,延迟成本接下来会伤害你:
Given mM.shape == [159459, 159459]
,
givenmM.dtype
是默认情况下float(64)
需要有 about:
203.42 [GB]
对于 的原始mM[159459, 159459]
,加上
203.42 [GB]
计算的mU[159459, 159459]
,加上
203.42 [GB]
计算的计算的Vh[159459, 159459]
0.0013 [GB]
vS[159459]
有史以来最便宜的一步,通过尝试仅线性缩小 2 倍(不超过 4 倍)从float64
到float32
甚至float16
不是游戏规则改变者,甚至因numpy
效率低下而受到严重惩罚(如果不是内部执行的反向转换高达float64
再次 - 我自己的尝试在这方面流血,我在这里分享由此产生的不满,以避免重复我自己的错误,试图首先从最低的挂果开始......)
如果您的分析可能仅适用于 vector vS
,则只有标志将通过不返回(因此不为它们保留空间)实例来.svd( ..., compute_uv = False, ... )
避免为~ 1/2 [TB]
RAM 分配mU
腾出空间和Vh
。
即使是这样的情况也不意味着您的 SLOC 将像报告的0.5 TB
RAM 系统一样继续存在。该scipy.linalg.svd()
处理将分配内部工作资源,这些资源超出了您的编码范围(当然,除非您自己重构和重新设计scipy.linalg
模块,如果不确定,这是公平的考虑非常可能)和配置控制。因此,请注意,即使您测试compute_uv = False
-mode 处理,.svd()
如果它无法在内部分配不适合当前 RAM 的所需内部使用的数据结构,它仍可能引发错误。
这也意味着即使使用numpy.memmap()
,这可能是一个成功的技巧来卸载原始的 RAM 内表示mM
(避免第一个需要的一些显着部分203.4 [GB]
坐下来并阻止主机 RAM 的使用),但是有使用此技巧必须支付的费用。
我的实验,在较小规模的.memmap
-s 上,用于矩阵处理和 ML 优化,产生了1E4 ~ 1E6
较慢的处理,因为尽管有智能缓存,但numpy.memmap()
-instances 依赖于磁盘 I/O。
最好的结果将来自使用先进的、TB
小型的、仅限 SSD 的存储设备,这些设备直接托管在一些快速和低延迟访问总线 M.2 或 PCIx16 上的计算设备上。
最后一段经验,可能还不想在这里听到:
使用更大的基于主机的 RAM,这意味着使用多 TB 计算设备,是最安全的方法。如果降低性能和额外费用在您的项目预算之内,则测试上述建议的步骤将有所帮助。如果没有,请在您的母校或您的项目最近的研究中心使用 HPC 中心,这种多 TB 计算设备在这些研究中心被普遍使用。