5月14日,第二期哥伦布训练营顺利举办并结营。虽然本次训练营出于北京市疫情防控需要临时更改为线上进行,但一脉相承的优秀师资阵容、全面理论教学和完整实操演示保证了理想的学习效果,课程干货更可谓只增不减。
接下来,让我们一起回顾本次训练营的答疑锦集,看看大家的思想碰撞出了怎样的火花吧~
不同类型的描述符(se_e2、se_e3、hybrid)所应用的场景是?
目前情况下,se_e2一定需要用,当局域角度信息很重要(如具有较强共价特征的材料,金属W,碳等)的时候可以添加se_e3,通过hybrid模式进行训练。大部分情况下se_e2基本够用,针对部分体系的某些性质可能需要很强的局域角度信息参与,此时需要添加se_e3进行hybird训练。 超参数的选择,主要是loss function中能量、力、维里参数的设置在相关体系中的数值?
力(势能面一阶导)、维里(势能面二阶导)代表的是势能面的局部形状特征,能量是势能面的绝对值。理论上讲,能量的绝对值没有太大意义,只有相对值有意义,我们训练的时候是需要描述准确势能面形状。我们一开始是希望尽可能快速地学会势能面的大致形状,后期才是逐渐势能面的精确细节。因此,实际操作过程中力是由大到小(例如100->1),维里一般也是(10->1),能量是由小到大(0.01->1)。训练过程一般采取两步法,第一轮初训,按照上述原则训练即可(例如800万步);第二轮训练,一般是将前置因子均设定为1,通过init-model模式重新训一遍,初始learning rate降1~2个量级(如1e-3 -> 1e-5或者1e-4)。实际过程中,还需要根据自己数据的可靠性来设定前置系数。超参数的设定一般需要通过实验尝试,同时需要对自己数据的量级有概念。一般情况下,力的水平大概在几eV/A的水平,learning rate初始用1e-3,力是由大到小(例如100->1),维里一般也是(10->1),能量是由小到大(0.01->1)即可。实际过程中可以做几组参数看到底哪组参数训练最快(比如同样都训练50万步)。真实的回传梯度正比于前置参数、学习率和数据真值,如果体系的受力很大(如高畸变的碳,受力几十甚至几百eV/A的水平),那么前置参数的系数要相应降低(比如100->10,甚至直接用1)。前置系数实际上也与数据可靠性有关,DFT计算中能量收敛性最好,力次之,维里更差,所以真实体系中的误差也是如此,能量误差最小,力的误差高一些,维里误差一般最大。第一遍训练的时候这些误差对大致形状影响不大,因此前置因子可以按照上述原则设定;但是第二遍训练时则需要考虑数据自身误差的影响。如果维里误差过高,实际过程中可能会将前置系数设定的特别低,以便获得更精确的模型。添加维里进行训练时,整体训练精度要收敛到与不添加维里的一致水平会比较困难,但是可能对弹性性质,EOS等预测准确性更高(这俩都属于二阶导相关性质)。因此,添加维里一起训练的时候,训练总长度一般需要比较长(千万量级)。https://github.com/deepmodeling/tutorials/blob/master/source/CaseStudies/Convergence-Test/Convergence-Test.md关于DP势的继承性,即在原DP势的基础上加入新的数据集再次进行训练,相当于一个refine的过程,具体参数的设置和操作不是很懂。如果数据的生产打算使用DP-GEN,那么可以将已有数据作为init数据,适当添加自己构造的部分数据(DP-GEN的init功能能够满足也可以用init_bulk和init_surf来产生),后续就直接用DP-GEN来迭代就行。如果数据已经生产完毕,建议所有数据放到一起,按照Q2的方式重新训练;如果真的不想重新训练,那么可以用init-model模式重新训练,设定下新旧数据的访问比例。当然,如果以后很自信了,那么是否冻结部分网络进行模型refine都可以逐渐尝试。训练精度是测试出来的,不是选择出来的。训练集是根据个人的实际需求手动或者自动构造出来的,具体多少数据足够,什么样的数据符合要求得看实际问题,可以参考社区教程原版或中文版:
https://github.com/deepmodeling/tutorials/blob/master/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
https://github.com/dfz05/tutorials-cn/blob/main/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
DP模型的计算成本随体系大小线性增长。具体运算速度还取决于计算资源,如核心数,CPU型号,以及是否使用GPU。体系速度也取决于体系模型的复杂度(主要取决于元素数目,不用type_one_side单个复杂度是n(n+1)/2,用了type_one_side单个复杂度n),所以体系复杂度越高,计算越慢(不仅仅是原子数目一个问题) DeePMD-kit使用的深度学习嵌入神经网络,和图神经网络(Graph Neural Network, GNN)相比,两者在处理不同问题时的性能优劣性如何?什么样的体系是更适合用DeePMD-kit来计算的,而什么情况下GNN的效果会更好? DeePMD-kit一般而言精度比GNN略低,但是计算效率高得多。DeePMD-kit在无机体系已经足够好,在有机体系可能略差;如果对有机体系的高精度模拟有需求,可能需要用GNN模型。但是数据计算也不能用普通的DFT了,需要更高精度hybrid泛函。DeePMD-kit模型相对简单、效率更高,结合模型压缩,效率则非常高,做非常大体系的MD研究比较合适(万~百万原子以上量级),GNN估计(百~千原子量级就已经很贵了)。除DeePMD-kit外,后期还会推出各种其他模型,也有基于GNN的,敬请期待。 DeePMD-kit的训练数据由以下信息构成:原⼦类型、模拟盒⼦、原⼦坐标、原⼦受⼒、系统能量和维⾥应⼒。由以下文件构成。描述符与深度势能模型的关系,描述符是否可以理解为训练数据的前处理,处理后写入模型进行训练。 DP模型包含嵌入网络和拟合网络,嵌入网络和描述符相关。DP模型训练过程中,嵌入网络和拟合网络的中的参数是同时调整的。所以,将描述符理解为训练数据的前处理,处理后进行训练是不准确的。如果有训练好的DP模型,把前面的部分拉取出来用于数据前处理,进行深入研究操作是可以的,不过需要对整个体系比较熟悉,也需要熟悉tensorflow等操作。 深度势能描述符的交换对称性如何体现?以及 DP的构造原因是什么? 现阶段实际上是某种原子全部归类放到网络的同一个区域了(目前模型针对不同元素进行了归类放置),所以不会出现元素交换的问题。模型某个区域仅对应某类元素。构造原理可以参考教程的原版或中文版:- https://github.com/deepmodeling/tutorials/blob/master/source/Tutorials/DeePMD-kit/learnDoc/Theory.md
- https://github.com/deepmodeling/tutorials-cn/blob/main/source/Tutorials/DeePMD-kit/learnDoc/Theory.md
平衡分子动力学中较常见,个人用非平衡分子动力学算过热导率(梁文硕)。更多案例可查看文献。 想了解使用DeePMD-kit的一些技巧以及和其他工具对比的优势和劣势。目前来讲,软件易用性、使用人数、运行维护以及效率等方面DP有优势;小分子体系或者其他有机体系,DP可能没有那么好,GNN可能精度更高。DeePMD-kit在CPU和GPU资源下的适用效率?纯CPU比GPU差多少? 超算GPU资源受限的情况下可以用CPU跑,但是效率和研究迭代速率会差很多倍。快速迭代验证才是科研高效进展的关键。可以考虑用Borium的GPU,价格相对来说低很多。 Manual似乎是针对LAMMPS+VASP用户编写的,有没有针对Amber+Gaussian这种DFT+MD软件组合的手册?dpdata和DP-GEN有Gaussian的接口, DeePMD-kit其实也有Amber的接口。可以,但是体系不宜过于复杂。应用案例:M. F. C. Andrade, H.-Y. Ko, L. Zhang, R. Car, and A. Selloni, Free energy of proton transfer at the water–TiO2 interface from ab initio deep potential molecular dynamics, Chemical Science 11, 2335 (2020).MOF自身并不复杂,此时可能仅考虑晶格振动;如果需要考虑MOF与分子相互作用会稍微复杂点,不过并没有本质困难。可以分两步来做问题,第一步仅做MOF本身,第二步再做MOF和分子相互作用。第一性原理软件用于产生训练数据,用于DP模型训练。DeepPMD-kit采⽤压缩数据格式。所有的数据都应该⾸先转换成这种格式,然后才能被DeePMD-kit使⽤。DeepModeling社区提供了⼀个名为dpdata的便捷⼯具,可以将第一性软件产⽣的数据转换DeePMD-kit的压缩数据格式。支持dpdata转换的第一性计算软件有VASP、Gaussian、SIESTA、CP2K、QE、Fhi-aims、PWmat、ABACUS。直接调用MD软件(如LAMMPS)计算输出即可,数据规模比较小的话,也可以使用dp test输出能量、受力、维里等信息到文件,或者直接调用ase的python结构。如果没有任何经验势的辅助下,直接做metadynamics还是比较困难的,尤其是研究过程比较复杂的话。这个复杂度得看具体问题,比如只是做个扩散路径,那么通过NEB采样可能就大致能够获得数据,再通过metadynamics来丰富下数据集即可;如果是复杂的固态相变,那么获取中间构型会很困难,需要自己对体系有较好的认知来设计一些路径构型,否则DP-GEN过程会不停崩溃,数据不可用。如果只是通过metadynamics来研究问题,需要保证你的势函数能够准确描述整个过程中的奇怪构型,否则结论并不可信。PRL paper介绍的是非光滑版的DP模型,NequIP paper介绍的是光滑版的DP模型。在非光滑版DP模型中,为每个原子和它在截止距离rc内的邻居建立一个局部坐标框架,然后根据与中心原子的距离对邻居原子进行排序,以保持对称性。非光滑版DP模型的局限性是不连续性,这对轨迹的影响可以忽略不计,但对于动态和机械特性的计算可能是不够的。光滑版的DP模型用嵌入网络取代非光滑的局部坐标框架,克服了上述局限性。详细说明可以参考该链接中的Deep Potential in a nutshell部分:https://gitee.com/deepmodeling/deepmd-kit/blob/master/README.md一般而言,残差网络有利于深度神经网络的训练(抑制梯度消失和梯度爆炸问题),添加残差网络应该训练效果会更好。如果要用compressed model那么embedding net不能添加残差,目前不支持。git checkout develop这个命令什么意思呢?git checkout 切换到分支。可以使用git branch命令来查看所有可用分支。DeePMD-kit有三种简易安装方式:使⽤离线安装包安装、使⽤conda安装和使⽤docker安装,安装命令参考参考DeePMD-kit⼿册中的1.1 Easy install: https://docs.deepmodeling.com/projects/deepmd/en/master/#用户也可以选择从源码编译DeePMD-kit,相对复杂,具体细节参考1.2 Install from source code。新版本安装之后没有看到user-DeePMD文件夹,如何编译LAMMPS?需要安装C++ interface。参考DeePMD-kit⼿册中的1.2.2 Install the C++ interface和1.3Install LAMMPS部分,见于链接:https://docs.deepmodeling.com/projects/deepmd/en/master/#DP-GEN中力判据的选择范围,文章中有0.05~0.2、0.15~0.35......很多的设置,是否有相关的标准或者范围? https://github.com/deepmodeling/tutorials/blob/master/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
https://github.com/dfz05/tutorials-cn/blob/main/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
体系不太复杂时,根据上述教程尝试设置即可;但是体系元素很多,整体比较复杂时,可能需要更有经验的操作。 DP-GEN的⼯作流程通常包含:init,run和auto-test。init:通过第⼀性原理计算产⽣初始训练数据集。run:在这个阶段可以实现训练数据集的⾃动扩充和DP模型的质量提⾼。run是DP-GEN的主要流程,包含⼀系列连续的迭代。每个迭代由三个步骤组成:探索、标记和训练。auto-test:计算⼀组简单的性质和/或执⾏测试以与DFT和/或经验原⼦间势函数进⾏⽐较。init可以通过dpgen init_bulk/init_surf param.json machine.json命令启动。run可以通过dpgen run param.json machine.json命令启动。auto-test可以通过dpgen autotest make/run/post param.json machine.jso命令启动。通过machine.json文件指定不同的计算平台。可以关注【教程】一文教你学透DP-GEN machine.json配置和bilibili视频教程:
https://www.bilibili.com/video/BV1h94y1o72C?spm_id_from=333.999.0.0
如果是想获得整体的概念,建议参考社区教程原版或中文版:- https://github.com/deepmodeling/tutorials/blob/master/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
- https://github.com/dfz05/tutorials-cn/blob/main/source/CaseStudies/Practical-Guidelines-for-DP/Practical-Guidelines-for-DP.md
自己为DP-GEN准备初始数据的流程是什么呢?是利用VASP生成OUTCAR文件,再利用dpdata转换成DP-GEN能识别出的数据吗?一方面,可以利用DP-GEN的init_bulk和init_surf以标准流程生成初始数据集,参考https://gitee.com/deepmodeling/dpgen/blob/master/README.md的Init: Preparing Initial Data部分。另一方面,DP-GEN允许用户以个性化的⽅式⽣成初始训练数据集,如直接跑AIMD。注意事项:AIMD温度要高于在DP-GEN的exploration环节设定的温度;多选择一些不相干初始结构跑,扩大初始相空间范围;间隔取点保存成数据集,避免相邻数据过于重复。最后,生成初始数据的软件不局限于VASP,还指出CP2K、SIESTA、Gaussian等多款第一性计算软件。同步学习(concurrent learning)的概念和主动学习(active learning)有何区别? 可以参考DP-GEN paper的Introduction 4-5段:https://doi.org/10.1016/j.cpc.2020.107206如何更加方便地修改源代码以方便在模型探索过程中使用自己想设置的md输入文件,一些针对具体问题的参数设置以及训练出来的模型不理想。 可以使用template功能,这里MD输入文件可以完全自己定义。在准备DP-GEN初始数据方面,除了init_bulk和init_surf外,还有其他方法吗?其他方法的操作流程是什么呢?DP-GEN允许用户以个性化的⽅式⽣成初始训练数据集。初始数据集能用于生成初始模型就行。总体流程是先用DP-GEN生成数据集,然后把数据收集起来,最后用DeePMD-kit训练出势函数吗?对于DeePMD-kit以及DP-GEN的初始数据集有体系大小的要求吗?例如只用原胞的数据集会对PES的模拟产生影响吗?需要扩胞吗?使用的胞一般不宜太小,但是实际过程中还得根据真实情况来判定。一般而言建议胞内原子>20,如此三个方向均不至于太小而产生过多的自相互作用。如果胞太大,DFT算起来太费劲也不行,可以用不太大的胞做完DP-GEN过程,训练好模型后,再对更大的胞进行检验(保证模型用于大胞不会产生明显问题,比如model_devi变得极大),获得更多数据。如果我现在在DP-GEN中只设置了四轮迭代,跑完了之后得出的模型并没有那么理想,那我想接着这个结果继续迭代的话?该如何操作呢?在para.json中直接添加下一次的迭代参数与迭代结构再重新运行DP-GEN可以吗?可以的,直接添加"model_devi_jobs"部分就行。DP-GEN 的 surface creation function 可以选择使用 pymatgen 吗?在使用init_bulk部分扰动原子之后的结构或者自己准备的结构作为探索步的MD起始构型时 还需要对这些扰动原子的结构先进行结构弛豫吗?如果没有结构弛豫的话会对后续的MD有影响吧?在init_bulk中,先弛豫后扰动,然后使用扰动后的结构进行AIMD。自己准备的结构如果确定不离谱,可靠性比较高,就可以不弛豫;如果没有太大的信心,还是让计算机帮你决定什么样的结构更优,先做relax,再做后续。因为我们本身就是要在数据集中添加合适的结构,而不是完全添加平衡结构,所以结构本身合理就不会对后续造成不良影响。
在init_bulk中skip_relax参数如何选择呢?比如Cu.hcp.json和Cu.fcc.json,Cu.bcc.json的skip_relax选择什么呢?是都选择true或false。还是一个是false其他是true呢?看真实需求,比如从数据库中找到的平衡结构,大概率没什么问题,skip掉relax没什么问题。如果是原子结构没变,从Zr的结构随便拿过来用,只是改了元素符号,那晶格常数各种参数可能差别很大,偏离合理状态比较远,那么还是需要relax的。 machine.json文件中"source_list": ["/opt/intel/oneapi/setvars.sh"]表示什么意思呢? 远端机器运行前需要加载的环境,相当于先运行source /opt/intel/oneapi/setvars.sh,再运行其他命令。一些软件是基于某些特定的底层环境编译的,比如intel环境,这里就是加载intel环境 。想了解一下学习一个DeePMD-kit势函数所需要的大概开销(机时)。 这取决于你研究的体系和任务。可以参考相近体系的研究,看一下训练数据集的大小,用DeePMD-kit训练DP势的主要成本在生成训练数据集上。 如果一个体系已有人训练过,是不是可以直接找到模型来研究这一体系的相关性能?取决于数据集覆盖的覆盖的构型空间范围。即便是相同的体系,对于不同的任务,数据集需要覆盖的构型空间范围是不同的。如果任务相同,应该可以使用,但是需要注意一下DP模型的版本。如果任务不同,可以在已有数据集的基础上进行DP-GEN迭代,扩充数据集覆盖范围。
以上就是本次训练营的答疑汇总。如果有你也有在科研中遇到的疑惑,或希望系统学习DP系列方法的使用,敬请关注和参与下期哥伦布训练营。目前,社区即将开始筹备训练营在其他城市的举行。虽然存在疫情的影响,但我们会倾尽所能尽早将哥伦布训练营开办到你所在的城市。我们会依照城市的报名人数安排开办顺序,因此也希望大家多多带动身边对DP系列方法感兴趣的小伙伴加入训练营,全年有效报名链接可见:【DP训练营招募令】加入哥伦布计划,发现计算模拟新大陆!
我们期待着越来越多对DP系列软件感兴趣的朋友加入我们,让我们共同定义科学计算未来,向计算模拟新大陆进发!