用户工具

站点工具

本页面的其他翻译:
  • zh

atk:解决quantumatk运行性能和内存消耗问题

解决QuantumATK运行性能和内存消耗问题

问题概述

衡量 QuantumATK 计算运行性能的指标是正确运行计算得到结果的时间长短。计算性能的限制因素主要来自于:

  • CPU主频、并行、缓存。这是直接决定计算速度的因素;
  • 内存大小。计算中,特别是DFT计算中有许多大型的中间数据,这些数据在内存中保存可以大大提高计算速度,但是会造成内存过度占用甚至溢出;
  • 操作系统与作业队列系统对计算资源的调度。
  • 程序本身的代码和编译质量。由于 QuantumATK 提供给用户的预编译好的二进制代码,因此程序本身的问题只能等待开发组在未来版本中解决。

一般情况下,我们总是优先选择将中间结果保存在内存中,这也是计算设置的默认选项。在发生问题时,存在两种情况,一种是 QuantumATK 给出内存溢出错误:

对于明确的内存溢出错误信息,可以考虑:

  • 增加硬件内存;
  • 更改控制参数,不保存中间数据,以节约内存,使计算得以完成。

用户层面影响计算性能的主要因素

算法与模型

不同的算法、不同的模型、不同的分析等计算性能相差很大:

  • 普通列表项目有些计算是单纯的 DFT 自洽,可以通过简单的Calculator参数控制计算的性能;
  • 有些计算包含多个 DFT 自洽过程,例如声子动力学矩阵、IVCharacteristics曲线等,此时要综合考虑并行的效果;
  • 有些计算还会改变DFT自洽计算的实际模型,例如声子动力学矩阵在实际计算时,采用的是对超胞进行自洽的方法。

并行计算

要获得任何高性能软件的最佳性能,需要对所涉及的计算和使用的硬件有一定的深入了解。因此,对于使用的硬件和并行方法,优化您的 QuantumATK 模拟非常重要。然而,下面章节给出了一些关于 QuantumATK 算法和选项的提示,也可能有助于解决内存或速度问题。

减少内存消耗

一般情况

  • 尝试禁用 AlgorithmParameters 中的 store_grids,这将稍稍降低内存,轻微减少计算时间。
  • AlgorithmParameters 中禁用 store_basis_on_grid 将显著减少内存,如果系统的矩阵很小,则会对性能产生负面影响。默认情况下此参数处于关闭状态,如果构型很大,它可能已被禁用。如果是 并行 运行,由于内存是分布式的,每个核的内存减少量将更低。
    • 如果在 并行 有两个以上进程运行,请尝试将 IterationControlParameters 中的 algorithm 设置为 ParallelPulayMixer.d

对于分子和块体构型

  • 如果矩阵非常大,可以考虑将 AlgorithmParameters 中的 density_matrix_method 设置为 DiagonalizationSolver(processes_per_kpoint=2)。这将使每个 mpi 进程的内存使用减少 2 倍。如果问题持续存在,请尝试增大 processes_per_kpoint
  • 如果计算量非常大,且计算是在 并行 中的许多节点上运行,那么将 AlgorithmParametersdensity_matrix_method 设置为 ChebyshevExpansionSolver 是很值得尝试的做法。当大规模并行运行时,内存使用将显著减少,但与普通情况相比还是很慢。

对于器件构型

  • 尝试将 SelfEnergyCalculator 中的 storage_strategy 设置为 StoreOnDiskNoStorage。这将显着减少内存,但也会降低之后的性能。如果是 并行 运行,由于内存是分布式的,每个核的内存减少量将更低。
  • 器件的横截面较宽,可以尝试将 equilibrium_method 和/或 non_equilibrium_method 设置为 SparseGreensFunction
  • 如果是 并行 运行,将 equilibrium_method 和/或non_equilibrium_method 设置为 SparseGreensFunction(processes_per_contour_point=2) 会有所帮助。如果问题仍然存在,试着设置 processes_per_contour_point=4

提升运行速度

一般情况

  • 如果计算需要使用多重网格方法,如存在栅的情况,可能对于 possion_solver 要考虑 DirectSolver。这样将需要更多的内存,但是开销是内存分配的,因此如果是 并行 运行,则值得尝试。
  • 设置 AlgorithmParameters 中的 store_basis_on_gridTrue。这将使计算运行更快,并具有适度但分布式的内存开销。

对于分子和块体构型

ATK 2015 中为 AlgorithmParameters 中的 density_matrix_method 引入了两个新增参数:processes_per_kpointbands_above_fermi_level

1   algorithm_parameters = AlgorithmParameters(
2       density_matrix_method=DiagonalizationSolver(
3                                                   bands_above_fermi_level=20,
4                                                   processes_per_kpoint=2
5                                                   ),
6       )
  • 关于 processes_per_kpoint,您可以指定每个 k 点要使用的 mpi 进程数,从而使您获得更高级别的并行。

下图展示了使用 32 个 k 点进行 InGaAs 块体构型完整 SCF 运行时间的关系图。默认情况下,您最多可以并行超过 32 个 mpi 进程(红线)。您可以运行以下脚本来快速检查计算中使用了多少个 k 点:

1   mk = MonkhorstPackGrid(4,4,4)
2   irriducible_kpoints = mk.kpoints()
3   print(len(irreducible_kpoints), ' irreducible kpoints')

通过设置 processes_per_kpoint,您现在可以进一步推动并行(蓝线)。

图:在 Xeon E5-2687W @ 3.1GHz 16固化/节点集群上运行的 InGaAs 合金的 199 基准图。时序对应于完整的 SCF 周期(19 步内收敛)。

  • 计算中使用的能带总数由基组大小定义。默认情况下,包含所有的空带。但是,在计算中涵盖所有的空带并不能提高准确性,却会大大降低您的模拟速度。设置 bands_above_fermi_level 以指定要使用的空带数量。在上面的示例中,您可以看到使用所有空带(绿点)将使计算时间加倍。

注意

  • 空带的最佳使用数量取决于几个因素,包括 LCAO 计算器中指定的电子温度。
  • 性能改进随系统的大小增强。对于 < 100 个原子的小型系统,您可以保持默认参数。

对于器件构型

实际上,您可以调整许多参数获得器件构型的最佳性能,有些取决于您正在研究的体系和所使用的方法。

参考

atk/解决quantumatk运行性能和内存消耗问题.txt · 最后更改: 2023/07/29 09:45 由 fermi

© 2014-2022 费米科技(京ICP备14023855号