计算化学公社

标题: PySCF计算CASSCF的并行效率问题 [打印本页]

作者
Author:
ZetaFunction    时间: 2024-8-16 17:15
标题: PySCF计算CASSCF的并行效率问题
本帖最后由 ZetaFunction 于 2024-8-16 17:17 编辑

原本打算使用ORCA计算一个28个原子含铁-镍核心的体系的CAS(8,8)/cc-pVDZ,遇到了SCF不收敛的问题。使用Mokit将最后一轮迭代的.gbw轨道文件转为PySCF的输入文件,在迭代了30轮左右后成功收敛,但是耗时远远超过了ORCA。32核服务器中ORCA中仅需不到一小时就能到达75轮的迭代上限,而PySCF每一轮迭代却需要四十分钟,最终收敛用时接近一天,这明显不合理。我尝试过设置并行线程数和内存,都没什么作用。尽管输出文件中的CPU总耗时和wall time确实是大约30倍的关系,但是Python有不少伪并行的多线程库,虽然是多线程但实际使用同一个物理核心。以下是我的输入文件,由Mokit生成的文件修改而来,请各位老师看看有没有什么问题:


from pyscf import gto, scf, mcscf
from mokit.lib.fch2py import fch2py
from mokit.lib.py2fch import py2fch
from mokit.lib import py2orca
from shutil import copyfile

from pyscf import lib
from pyscf import __config__
print(lib.num_threads()) #显示确实是32线程


mol = gto.M()
mol.max_memory = 16384
# 28 atom(s)
mol.atom = '''
C1        -18.71419998       -7.81380000       15.80720000
S1        -17.42080002       -7.34854999       17.03330000
H1        -18.43912800       -7.44484897       14.84122399
......

# Remember to check the charge and spin
mol.charge = -2
mol.spin = 0
mol.verbose = 4
mol.build(parse_arg=False)

mf = scf.RHF(mol)
mf.max_memory = 16384
mf.max_cycle = 1
mf.init_guess = '1e'
mf.kernel()

# read MOs from .fch(k) file
hf_fch = 'SIa-S1-UHF-UNO-CAS88.fch'
nbf = mf.mo_coeff.shape[0]
nif = mf.mo_coeff.shape[1]
mf.mo_coeff = fch2py(hf_fch, nbf, nif, 'a')
# read done

mc = mcscf.CASSCF(mf, 8, 8)
mc.max_memory = 65536
mc.verbose = 5
mc.natorb = True
mc.kernel()

py2orca(mc, 'mc-S1.inp')


作者
Author:
hebrewsnabla    时间: 2024-8-16 17:18
建议上传输出文件。
作者
Author:
hebrewsnabla    时间: 2024-8-16 17:45
你在orca里面用了赝势吗?由于mkl文件不含赝势,传给pyscf的时候是会丢失赝势信息的。
作者
Author:
ZetaFunction    时间: 2024-8-16 18:27
hebrewsnabla 发表于 2024-8-16 17:18
建议上传输出文件。

把内存从64G加大到128G,问题解决了。PySCF这么吃内存的吗?28个原子CASSCF(8,8)/cc-pVDZ就要这么多内存,如果用更大的基组和活性空间,一般的机子内存这么吃得消啊?
作者
Author:
hebrewsnabla    时间: 2024-8-16 18:35
本帖最后由 hebrewsnabla 于 2024-8-16 21:06 编辑
ZetaFunction 发表于 2024-8-16 18:27
把内存从64G加大到128G,问题解决了。PySCF这么吃内存的吗?28个原子CASSCF(8,8)/cc-pVDZ就要这么多内存 ...

正常情况不需要这么多内存。如果你的意思是加大内存就能明显算得很快,这恐怕不太正常。
作者
Author:
ZetaFunction    时间: 2024-8-16 21:50
hebrewsnabla 发表于 2024-8-16 18:35
正常情况不需要这么多内存。如果你的意思是加大内存就能明显算得很快,这恐怕不太正常。

重新测试了一下,问题应该不在mcscf,而在于前面的mol.max_memory和mf.max_memory,把这两步的内存从16G增加到32G,速度立刻提示十几倍。看上去子类会继承内存?
作者
Author:
hebrewsnabla    时间: 2024-8-16 22:08
ZetaFunction 发表于 2024-8-16 21:50
重新测试了一下,问题应该不在mcscf,而在于前面的mol.max_memory和mf.max_memory,把这两步的内存从16G ...

不清楚,没输出文件没法说。
作者
Author:
wjc404    时间: 2024-8-16 23:09
ZetaFunction 发表于 2024-8-16 18:27
把内存从64G加大到128G,问题解决了。PySCF这么吃内存的吗?28个原子CASSCF(8,8)/cc-pVDZ就要这么多内存 ...

scf的双电子积分(数量大概是轨道数的四次方)有很多处理方法,内存足够多就常驻在内存里(in-core),内存不够就即算即用(direct)或放到磁盘上(disk)。in-core是最快的。你可以看一下程序的详细输出看用的哪一种。
作者
Author:
FDGDF    时间: 2024-9-28 14:10
hebrewsnabla 发表于 2024-8-16 17:18
建议上传输出文件。

不错




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3