2021年7月,DeePMD-kit v2.0.0发布前夕,张林峰和王涵老师——也就是此文的通讯作者——问我要不要给DeePMD-kit软件写一篇新论文,作为该软件的标准参考。
我接受了邀请,不过很快,我便发现写这论文充满了挑战。
第一,我之前从来没有写过这种纯软件的论文。有不少论文,虽然标题是软件,但是这些软件只包含一个主要功能,因此实际上是按照方法学的论文来写的,比如我的第一篇论文就是这个套路。而我现在要写的这篇论文实际上没有提出新方法,而是对软件已有功能的总结,重点就应该是软件本身。这种论文确实不多,不过近年来还是有可以参考的论文,包括LAMMPS、OpenBabel、CP2K、DFTB+,这些软件都历经多年的维护。
第二,DeePMD-kit已经实现的方法极多,但又是拆散在不同论文里,且可能已经过时。DeePMD-kit的首篇论文是2018年3月发表的,其中描述的模型,即local frame,已经弃用;描述DeepPot-SE的论文给出的平滑函数已经被修改过;三体嵌入描述符(se_e3)和fitting tensor的论文还没发表。而我需要全部理解这些公式,然后统一这些方法的符号,整合到同一篇论文里。
第三,我自己对DeePMD-kit的认识,也是逐渐上升的过程。在我还是本科生,开始第二篇论文的工作时,经历了不会用到会用的转变,对C++一知半解,对代码的贡献仅限于文档;本科毕业以后,完成第三篇论文和第四篇论文期间,逐渐能够理解代码、贡献功能、修复bug;而在2023年8月的今天,我已能够驾驭DeePMD-kit的任意一行代码。
这种有挑战性的东西恰好合我的口味,这论文便也断断续续地写着。经过大约半年的打磨,我们将整体内容分为功能和技术细节两大块,功能方面分节讨论模型、训练和模型偏差,技术细节讨论代码结构、易用性、可拓展性和开放性。
到了2022年年初,初稿几乎草拟完成。不过2022年的科研工作颇多,我的主力时间花在第五篇论文的工作上,同时又分了一些时间给很多其它论文,两位通讯作者也很忙,于是,这篇论文几乎毫无进展;另一方面,我们也不太确定这篇文章应该投哪里去,似乎除了CPC以外没有更好的选择。
到了2023年2月4日,我的第六篇论文已经搞定,神清气爽。这时林峰告诉我说,Journal of Chemical Physics (JCP)搞了一个名为Software for Atomistic Machine Learning的special topic,deadline是4月,问要不要把文章投掉。
JCP搞软件的special topic也有好几年历史了。2020年,JCP搞了个名为“Electronic Structure Software”的special topic,结果尝到了甜头,这些软件论文成为JCP引用最高的文章,大幅提高了期刊的影响因子。于是,2021年,JCP又新开辟了一个名叫“chemical physics software”的section,专门用于描写软件包,并且开始定期开辟新的software special topic。
我说好啊。这个special topic看起来非常契合,恰好解决了不知道论文投哪的难题。同时,JCP的口碑似乎不错。事情便明确起来:确定作者名单,并在两个月内完成论文。
经过调研,我发现确定作者名单并没有固定的学术准则。一些软件会邀请所有对代码有贡献的人成为作者(例如DFTB+),另外一些软件仅仅邀请一部分人撰写文章(例如LAMMPS)。考虑到中国人的习惯,以及鼓励外部开发者贡献的目的,我还是选择了前者,通过邮件+问卷的形式邀请了所有贡献者,最后共有47人接受邀请。
给47人排出一个作者次序,也不是一件容易的事情。我也观察到有两种方法:全部按贡献确定,或者除了一作和通讯,其余作者按首字母顺序确定。也就是说,作者次序同样没有明确的标准。我个人认为按首字母排序并不公平,但是这么多作者确实不容易确定贡献大小。最后,我采用这样的方法:将所有作者按照贡献种类分为五大类,每一类中再用冒泡法,凭感觉对贡献排序;对于贡献较小、无法主观排序的类别,再按首字母确定顺序。
与此同时,我翻出了一年前完成的手稿,看看主要还缺少什么:两年来的所有新功能,一个benchmark段落,以及一些参考资料。经过讨论,我们确定了具体的思路。benchmark段落设置5个体系,5个模型,2个精度,以及5种不同硬件,分别进行benchmark。
4月初,在张铎(第二作者)的协助下,我终于把所有内容全部搞定。王涵老师花了一周时间review,我又用ChatGPT润色了一遍文章后,论文定稿,manuscript共50页。在给所有作者确认后,我们赶在deadline的前两天预发表,并在deadline的最后一天提交了论文。
顺便一提,投稿系统很不友好,光作者名单就填了一个多小时。
5月末,我们收到了两位审稿人的二十几条审稿意见。大部分审稿意见多要求修改或补充内容,没有什么大问题。不过其中一条意见很是令人惊愕:“At the moment, this paper has a much heavier computational science and machine learning focus, but less emphasis on chemical physics. There are no explicit demonstrations of how this package could benefit our reader’s community.” 这听起来就很离谱,我投一个“化学物理软件”的section、一个“原子机器学习软件”的special topic,如果不去讨论机器学习算法和软件,不就偏题了吗?尤其是,这个section确实要求讨论算法和软件:
于是我把这一整段贴到了response上,毫不客气地反驳了这条审稿意见。
6月下旬,我投回了论文。主要新增部分包括:introduction一节介绍代表性工作;第三方软件一节新增对各个第三方软件的介绍;新增molecular dynamics一节;benchmark一节新增对数据集的介绍;新增附录介绍过渡函数的生成方法,以及GPU尚不支持的功能。此时manuscript的页数膨胀到了61页。
2023年7月3日,文章终于被接受。此时,距DeePMD-kit v2.0.0发布已有两年时间。这是我第一次写这种大杂烩式的开源软件论文,也是我写过的字数最多、公式最多、作者最多、单位最多、基金数最多的论文。
Jinzhe Zeng, Duo Zhang, Denghui Lu, Pinghui Mo, Zeyu Li, Yixiao Chen, Marián Rynik, Li’ang Huang, Ziyao Li, Shaochen Shi, Yingze Wang, Haotian Ye, Ping Tuo, Jiabin Yang, Ye Ding, Yifan Li, Davide Tisi, Qiyu Zeng, Han Bao, Yu Xia, Jiameng Huang, Koki Muraoka, Yibo Wang, Junhan Chang, Fengbo Yuan, Sigbjørn Løland Bore, Chun Cai, Yinnian Lin, Bo Wang, Jiayan Xu, Jia-Xin Zhu, Chenxing Luo, Yuzhi Zhang, Rhys E. A. Goodall, Wenshuo Liang, Anurag Kumar Singh, Sikai Yao, Jingchao Zhang, Renata Wentzcovitch, Jiequn Han, Jie Liu, Weile Jia, Darrin M. York, Weinan E, Roberto Car, Linfeng Zhang, Han Wang, DeePMD-kit v2: A software package for Deep Potential models, The Journal of Chemical Physics, 2023, 159, 054801.
大部分开源软件的共性问题是,即使积累了足够多的使用者,但开发者仍然很少。如何吸引更多的开发者,仍是一件需要长期思考的事情。DeePMD-kit也不例外。所以最后打个广告:欢迎加入DeePMD-kit的开发团队!
]]>上回说到,去年夏天,导师收到了JCP Special Topic: Modern Semiempirical Electronic Structure Methods的邀稿,但是迟迟没决定写什么。到了10月下旬,JCP把deadline延长到了11月30日,这时他的想法是,写一篇Perspective来总结过去的工作,并把我上一篇文章的一些数据拆了出来,放到这篇文章里。但是到了11月下旬,我把上一篇文章投出去以后,导师又决定,改成一篇benchmark的文章,在QDπ已经benchmark的一大堆机器学习和半经验方法数据的基础上,再benchmark两个方法的数据,最后再得出结论,半经验+机器学习联用的精度最好,QDπ的精度最好。
benchmark当然没啥难度。当然,最重要的是,上一个工作中写了dpdata的Driver接口,所有benchmark的脚本都是基于这个接口的。因此对于新方法,只需要花点时间写一个class,剩下就属于毫无技术含量的低级重复性工作了。受到数据限制,所有benchmark的基准都是ωB97X/6-31G*,距离CCSD(T)有一定差距;不过相比之下,这些半经验方法的误差更大,因此并不影响这些半经验方法精度不高的结论。
一周后,新增的数据完工,便只差文字了。这时已经到了12月,我问导师,deadline是不是到了?他表示,向JCP申请了两周deadline延期。于是又一起努力了两周后,12月19日,这篇文章终于完工了。
1月底,两个审稿人的意见回来,审稿人A要求多benchmark新的NDDO方法,审稿人B要求多benchmark新的DFTB方法。于是,又花了一周时间多benchmark了三种半经验方法。3月,这篇文章便被接受了。
Modern semiempirical electronic structure methods and machine learning potentials for drug discovery: Conformers, tautomers, and protonation states
Jinzhe Zeng, Yujun Tao, Timothy J Giese, Darrin M York
J. Chem. Phys., 2023, 158, 124110.
DOI: 10.1063/5.0139281
这是我第一篇纯benchmark的工作,也是第一篇邀稿论文,确实没什么难度,所以本文写的也不长。
]]>上回说道,2020年春,DPRc被设计出来,并应用于一个简单的RNA自催化体系中。这以后,DPRc的两个后续研究方向也明确下来,其一,是将DPRc应用到溶液反应的自由能计算中,包括组里在搞的几个RNA催化体系;其二,便是将DPRc应用到药物发现中,预测溶液中药物的结合自由能,将其拆成QM/QM模型和QM/MM作用模型,分别训练。
药物分子主要是小分子有机物,当时最好的数据集是ANI-1x。2022年春,受到DPRc启发,我拿ANI-1x数据集,在同样条件下,分别测试了纯DP模型和DFTB3+DP模型,结果发现,DFTB3+DP模型的force error只有纯DP模型的一半,并且已经比其它所有的半经验方法以及ANI-1x、ANI-2x模型的force error都要低。
这时我们便考虑,抛开QM/MM不谈,先搞一个世界上最准确的真空中的药物分子模型。
很快,我遇到了第一个问题。虽然我的模型对force的预测奇准无比,但是能量的误差显得有点离谱。修复两个提取数据的bug后,我最后发现,模型没有问题,有问题的是数据。在一些化学键断裂(可能是自由基)的体系中,DFTB3给出的能量比较离谱,似乎根本没有收敛(可见Figure S1)。AMBER和DFTB+给出了相同的结果,因此不是软件bug。我想,这种奇怪的曲线,应该会有文献讨论吧?然而,遍寻DFTB3相关的文献,以及用DFTB3与ANI-1x数据集做的类似的工作,都没有找到合理的解释。当时,我并不知道还有xTB这种东西(xTB没有这个问题),最后找了三个合理的理由去掉ANI-1x数据集中的这些自由基:一是DFTB3的结果比较离谱,二是ANI-1x数据集把所有结构的自旋多重度设为1(包括氧气),准确性成疑;三是一个药物分子模型,实际上不需要预测这些结构。
遇到的第二个问题,是甲方(导师)希望能训练一个反应的能量(ΔE)。这个需求看起来挺头疼的,因为改造DeePMD-kit输入的难度不小。不过,我想出了一个变通的方案:把反应物和生成物放在一起,但是隔得很远,又是非周期性体系,最后把loss改一改就行了。
最后一个问题,是导师还希望扫描出几个小分子沿二面角旋转的2D PES,并绘制出几个构型之间,能量最低的路径,从而丰富文章内容。现有文献对relax scan的介绍颇少,经过我探索以后,发现一个从我的模型出发的迭代优化方法:首先生成一组初始构型,然后用我的模型,从某点周围的点优化,取能量最小的构型;如此迭代若干次,即可得到我的模型的最优构型;再以此构型出发,得到DFT和其它方法的构型。这样便大大节省了空间。而路径方面,恰好我10月时为了回答一个知乎问题,研究过鄂老师的string method,却没想到,到11月刚好用得上,便手搓了一个string method的程序。
而在具体的炼丹环节,我瞄准了组里一台没人用的台式机上唯一的一块3090Ti,虽然不知道原因,但它确实比V100还快。同时,我也用了压缩训练+FP32,事实证明FP32对精度没有任何影响,反而能大大加快训练速度。最后训练了6轮后(其实是不断返工),总训练步数超过了2亿步,模型的精度成功超越了其它所有方法。
说到“其它所有方法”,就不得不提到我之前实现过的dpdata插件功能。我把所有比较的方法统一到了dpdata的接口,从而能够用同一套代码,比较不同方法的精度。
这个模型叫什么?导师提供了两个idea,一是Quantum Deep Potential Interaction (QDPI,QDπ),谐音cutie pie(小可爱),二是Drug Discovery Deep Potential(D3P)。显然第一个选项更有意思(虽然对中国人而言并不直观),于是我决定,就把模型叫QDπ。
这时,导师收到了JCP special topic的约稿,决定把文章中的一部分结果拆出来,拆成另一篇文章。应该会在本系列的下一期中详细介绍。
2022年11月下旬,文章的所有作者搞定了文章的所有内容后,我便把文章投稿到JCTC。12月下旬,审稿意见返回,一个审稿人打了7分,接受;另一个审稿人打了9分,小修。这是我人生中第一次碰到直接accept的审稿人,也算是最顺利的一篇文章。小修的意见是应该指出模型的缺点。2023年的第2天,我将文章修回;2023年的第8天,文章便接受了。
除此以外,文章的二作还创作了期刊封面,这一封面在修回时一起提交,并于文章接受两天后,顺利接受。
QD$\pi$: A Quantum Deep Potential Interaction Model for Drug Discovery
Jinzhe Zeng, Yujun Tao, Timothy J Giese, Darrin M York
J. Chem. Theory Comput., 2023.
DOI: 10.1021/acs.jctc.2c01172
至此,总算在数量上凑齐五篇代表作。接下来希望能用更好的成果“替换”以前的成果。
]]>经过很长很长的审稿和出版周期,我的第一篇book chapter终于在9月20日前后随书出版了。
书章的主体部分在去年就完成了,后来经过数轮审稿和修改,最终定稿。章节主要分为两部分,前半部分介绍了一些不同类型的neural network potentials,可以在论文的introduction部分引用,后半部分是之前甲烷燃烧工作的介绍和tutorial,从仓库下载输入文件后,可以在没有看过书的情况下快速体验。
5分钟教学教程也已上线哔哩哔哩,甚至可以“云体验”:
邀稿的主编Pavlo O. Darl,曾于2004年代表乌克兰参加第36届国际奥林匹克化学竞赛(IChO),以第21名的成绩获得金牌,目前在厦门大学任副教授一职。
书太贵了,自费是买不起正版的。后来我灵机一动,向学校图书馆建议购买,被采纳了。但是好像有些学校本来就买了Elsevier的权限。
Chapter 12 - Neural network potentials
Jinzhe Zeng, Liqun Cao, Tong Zhu
Quantum Chemistry in the Age of Machine Learning, 2023, 279-294.
DOI: 10.1016/B978-0-323-90049-2.00001-9
前置论文:
时间回到两年前的夏天,我离家数万里,与套磁已久的Darrin M. York会晤,相谈甚欢。按照安排,第一学期分为两个rotation,两个rotation结束后才选择导师。当然,这种安排对于我们来说,只是一个形式,我和Darrin约定在第二个rotation会合。
我的第一个rotation找到了Lu Wang,完成了一个新手级别的任务;第二个rotation期间则没有任何任务,按照Darrin的说法,rotation只是用来“感受课题组氛围”的形式。总体来说,rotation设立的初衷是好的,可以感受到不同课题组的氛围,但是由于时间过短,无法体验到真正的课题,总有一点虚度光阴的意味。在此期间,我的精力就放在了第三篇论文中。
转眼间到了冬天,在我的强烈要求下,我们开始讨论“真正的课题”。考虑到我之前的背景,Darrin提出想让我用机器学习方法改进QM/MM计算,从半经验的势能矫正到更高级别的势能,从而加速ab initio精度的动力学模拟(图1)。
图1:讨论记录
当时,Darrin正好与Adrian Roitberg有合作的项目,便想让我从ANI入手,试一试他们开发的TorchANI。然而,当我开始尝试TorchANI以后,却发现它的文档竟然比当时DeePMD-kit的文档还要稀烂!DeePMD-kit的文档虽然缺少很多细节,但是入门是没有问题的,当年我上手的时候是没有压力的。可是,看着TorchANI的文档,我发现第一步便遇到困难:怎么生成数据集?格式、单位为何?开发者表示,TorchANI不支持构建数据集,需要我自己编写,但又没给更多的信息。我便意识到,他们似乎只是想推广自己的数据集和模型,并不鼓励用户使用用户自己制作的数据集。数日后,我决定放弃TorchANI,转而劝Darrin回到DeePMD-kit的荫蔽下。
此时,和我相识已一年的张林峰刚好在30公里外的Princeton University读书,我便邀请他来课题组参观,顺便做一个talk。2019年12月6日,林峰驾车前来,向组里介绍了Deep Potential(DP)的最新进展,使Darrin大受震撼。我们便确立了使用DP的基本方针。
如果想把深度学习的模型应用于组里已有的课题中,就需要解决两个主要问题:其一,需要修改现有的模型,使之满足相应的物理规律;其二,将DP与AmberTools结合,包括DeePMD-kit的集成和工作流的设计。
我们的目标是从低精度QM/MM模型矫正到高精度QM/MM模型,如图2所示,由于两个模型的MM方法是一致的,它们之间的差应当恒等于0。如果用原始的DeepPot-SE模型,当我们拟合数据之后,这一部分自然应当趋近于0,但是并没有办法使之严格等于0,是unphysical的。很快,我们意识到,需要对深度学习模型进行修改,使模型中MM原子本身的能量和MM原子之间的相互作用均等于0。在林峰和王涵老师的提点下,我很快明白,需要修改embedding network和fitting network,从而实现这一功能。
然而,初版得到的模型预测真空中的原子能量时,虽然接近于0,却并不等于0。疑惑之下,我把embedding matrix打出来仔细研究,发现原来coordinate matrix(坐标矩阵)初始化不为0,从而导致最终的能量也不为0!2020年2月1日,正值农历初八,修复了这一问题后,对DeePMD-kit的改动就算完工了。
图2:从低水平的QM/MM模型校正到高水平的QM/MM模型
另一方面,组里之前一直用AmberTools进行模拟。AmberTools使用古老的Fortran 90语言,而DeePMD-kit使用C++ 11,将它们直接链接起来(而非用文件或者socket转换)似乎有些难度。组里的TimothyJ. Giese经验丰富,提出了如图3所示的链接方案。Fortran 不能和C++直接链接,但是Fortran和C++都有C接口,便可以通过C来实现转换。
图3:AmberTools与DeePMD-kit对接
相比之下,将AmberTools与DP-GEN和dpdata结合则显得没有什么难度,我们的最后流程就如图4所示。当然,更没难度的部分就是跑一个例子了,我们选取了一个简单的例子和两个最简单的半经验方法来测试模型,接下来等着收数据就行了。
图4:整体的workflow
收数据虽然简单,但由于是第一次摸索这一流程,需要设计参数,又可能反复推倒重来,于是便也花费了几个月时间。2020年冬,我先后解决了之前的两篇论文,又通过了Out-of-Field Research Proposal(OFRP)考核,便开始写这一篇文章了!完成了初稿以后,Darrin很细心地教我如何作图,又把文章的字数增加了一倍。
2021年2月,我把文章放到ChemRxiv后,又完成了人生中的首次投稿。预印本刚好成为了我In-Field Research Proposal(IFRP)的引用。当我已经成为一名PhD candidate以后,4月,审稿人意见指出,我们的active learning没有筛选新增的数据,可能为之后迁移到abinitio带来困难。恰好,我和Darrin都算是完美主义者,我们决定,完善方法,重跑所有数据。这一拖便到了9月,我们更新数据后便修了回去,之后很快便接受了。
和上一篇论文一样,这一篇也是方法性质的文章,将为接下来的某一篇论文奠定夯实的基础——有可能是第五篇,也有可能是第六篇,还有可能是第七篇。在这一篇的鼓舞下,我也确立了毕业前十篇论文(仅一作)的基础目标,目前已经实现4/10了,希望能早日完成全部目标。
Development of Range-Corrected Deep Learning Potentials for Fast, Accurate Quantum Mechanical/molecular Mechanical Simulations of Chemical Reactions in Solution
Jinzhe Zeng, Timothy J. Giese, ̧Sölen Ekesan, Darrin M. York
Journal of Chemical Theory and Computation, 2021, 17 (11), 6993–7009.
DOI: 10.1021/acs.jctc.1c00201
时至2021年8月,从大三算起,我从事科研工作也快满四年了。四年来,我也用过不少计算软件,它们无一例外都有一些通病,一是文档写得极差,遇到不属于bug的错误总要手动搜索答案,形成了“软件使用经验”的壁垒,有些软件甚至催生了不少第三方论坛、博客、培训机构提供教程,形成了完整的产业链;二是对于开源项目来说,注释和开发文档几乎没有,看代码只能靠猜,给二次开发带来了极大障碍。
原先,DeePMD-kit也存在着这样的问题。当年我还是DeePMD-kit的用户时,就常常为了理解代码背后的逻辑而被折磨得痛不欲生。虽然解决这个问题需要付出的努力很多,但不积跬步,无以至千里;不积小流,无以成江海。这一问题仍需要去推动、去解决。v2.0.0对这个问题进行了针对性优化,虽然仍有很多欠缺之处,但是用林峰的一句话来说,算是“小学毕业”了。
新版的文档分为了三个板块,一是Getting started,通过一个简单的案例,供初学者入门;二是Advanced,为使用者带来了详细的文档和具体的参数;三是Developer Guide,包含了具体的Python和C++的API,供开发者参考。
API部分旨在为各个函数和类的功能和参数提供完整的注释,以DescrptSeA为例,DescrptSeA的公式和参数都放到了docstring内,相信能给二次开发带来极大的方便。有所欠缺的是,这个坑极大,目前有很多仍未完成。
C++的注释以InputNlist为例,没有注释的话没有人知道如何理解各个member。
另一方面,我在解答问题的时候能够发现,很多人都会遇到同样的不是bug的报错,而这些具体指南是可以写在error message里面的。v2.0.0增加了很多指南型的error message,用户遇到error后可以不去任何地方问,直接跟着指南走就行了。
总之,文档和注释目前仍然是一个很大的坑,但如果想让DeePMD-kit成为一个成熟的、经久不衰的开源软件,这就是一道必须面对的槛!
]]>两周前,经过一周的努力,我终于成功编译了TensorFlow 2.5。在TF 2.5中,我亲自参与的#43951得到了修复。但众所周知,TensorFlow每个新版本都会更新一些bug,TF2.5更新了6个新bug!
com_google_absl_fix_mac_and_nvcc_build.patch
移动到了tensorflow/third_party/absl
。export TF_ENABLE_XLA=0
直接砍了XLA,反正我不用。上述七个issues修复前六个,并砍掉最后一个后,TF 2.5终于成功编译!
]]>今年,组里申到了Longhorn约二十万V100机时。Longhorn是Texas Advanced Computing Center(TACC)前年建成的超算,建成那年在TOP500排名120,不过目前已经下滑到228了,可见现在的硬件迭代速度飞快。这么多机时,它的队列又是空空荡荡的,那当然要尝试一下。尝试了两周,解决了两个很坑的问题,终于跑通了。
第一个问题是,Longhorn开了强制两步认证,登录时即使设置了密钥,仍会受到以下提示:
To access the system:
- If not using ssh-keys, please enter your TACC password at the password prompt
- At the TACC Token prompt, enter your 6-digit code followed by
. (*****@longhorn.tacc.utexas.edu) TACC Token Code:
根据用户手册,我们需要下载一个名为TACC Token的App,扫码获取这个Token Code。
乍看起来,这确实是WorkFlow的噩梦。当我们同时运行十几个甚至几十个WorkFlow时,可能随时都会发生登录事件,让程序去等待人类(可能在睡觉,可能在躺平,甚至可能不可描述)去输token,实在是不可接受的。
但是仔细一看,这个token,其实就是已经成为通用标准的“基于时间的一次性密码算法”(Time-based One-time Password,TOTP)。所谓TOTP,就是基于预设密钥和当前时间戳生成token的算法,维基百科的介绍如下:
扫描二维码,会得到形如这样的地址:
otpauth://totp/njzjz%3Anjzjz?secret=这里有一串密钥&issuer=TACC
secret
后面的就是base32以后的密钥,可以用base64.b32decode(secret)
进行解码;时间戳可以从time.time()
得到;而TOTP算法所需的HMAC算法,则是Python内置的。因此我们生成TOTP的代码如下:
1 | def generate_totp(secret: str, period: int=30, token_length: int=6) -> int: |
得到了TOTP的密钥后,我们把它喂给paramiko的password参数,这个问题就算解决了!
]]>去年,DeePMD-kit的开发者意识到了文档的重要性,给输入的JSON文件input.json
的所有参数添加了相应的文档。为了实现这一重要目标,Yixiao将配置参数抽象成了dargs.Arugenment
和dargs.Variant
类,每个Arugenment
类代表一个参数,类的属性里还有允许类型、文档、允许的子Argument
等信息;Variant
则表示不同的配置变种,例如local_frame
描述符和se_e2_a
描述符。就在此时,我们看到Sion Wang吐槽过DeePMD-kit缺少文档,用起来是最痛苦的。
除了文档以外,我们也意识到,一个优秀的用户界面(user interface,UI)也可以大幅度提升用户体验。JSON文件是一种对程序友好却反人类的语言,常常看到有用户这里多一个逗号、那里少一个逗号。我们也发现,有时用户也会把参数写错位置,却不知错在哪里。例如,在下面节选的参数中,type_map
是model
的子参数,但有用户把type_map
放在model
之前,使其无法被正确读取。
1 |
|
因此,我常常想着能否为用户提供一个图形界面(graphical user interface,GUI),生成这些JSON文件。很多科学计算软件都只有命令行界面(command line interface,CLI),GUI位于鄙视链的最末端,但我认为应该给新手提供更加友好的环境。
上周,我想到了一个绝妙的idea,立即在开发群里提出,获得了其它开发者的赞同:
有一个idea,把dargs的参数导出,然后做一个web-based GUI,读取dargs的参数生成表单,给用户填写,生成各软件的输入文件。
如何把dargs的Argument
导出为JSON呢?起初,我想像生成文档的方法一样,给Argument
和Variant
加一个gen_json
的方法。但是略加检索后发现,Python有一个json.JSONEncoder
类,就是专门用来把对象encode成JSON的。我们只需要继承这个类,给我们需要转换、但这个类不支持的type添加相应的转换规则:
1 | class ArgumentEncoder(json.JSONEncoder): |
这里,我们转换了Argument
、Variant
和type
,之后把ArgumentEncoder
类放入json.dumps
的cls
参数,即可输出JSON字符串:
1 | json.dumps(some_arg, cls=ArgumentEncoder) |
得到了JSON文件后,这周一,我就把目光转向web-based App。2021年了,我们当然使用目前最流行的前端框架:Vue。恰好,这种动态的数据非常符合Vue的数据驱动视图的理念。在上面示例的JSON文件中,参数是个层层嵌套的形式,而我们很容易想到,Vue框架的组件(component)也可以层层嵌套,正好可以对应一个Argument
或者Variant
类。于是,一个DargsItem.vue
的组件便诞生了:
1 | <!-- 节选了重要的逻辑代码 --> |
完整的代码可以在这里看到。在用户视图中,我们将输入的数据jdata
通过if
和else
分为了三个类型,list
(表示多个Argument
)、Argument
(可能有若干个sub fields或者sub fields)和Variant
(有若干个choice,即Argument
),每个类型都可能通过for
来嵌套若干个子组件。而真正的用户输入框,则位于Argument
内,也是通过一组if-else
将不同的type分成了文本框(对应str、int、float)、多行文本框(list)、switch按钮(bool),并提供了额外的下拉框用于在多个接受的类型中选择一个,额外的switch按钮用于可选项的选择。参数的文档则放在了hint的位置。
搞定一个简陋(艺术感欠缺)但可以用的界面后,我们需要实现两个功能:导出JSON(dvalue
方法)、导入JSON(load
方法),刚好是相反的。值得注意的是,这两个方法也需要层层嵌套,节选dvalue
的代码如下:
1 | methods: { |
这里的技术难点在于,如何获取sub_fields
的组件?我们在template内已经给所有子组件标记了ref="subitem"
,因此用this.$refs["subitem"]
即可得到所有子组件的列表。
我们还需要设置传入参数,这个组件就算完工了。之后,我们再创建一个dargs.vue
组件,把DargsItem
包起来,同时提供一个从本地载入JSON的按钮,以及导出JSON的按钮,也设置同样的传入参数:
1 | props: { |
这样,一个darg
组件,就能够表示一个软件的所有参数。那么,如何切换不同软件的参数呢?这时就需要引入路由(router)了。
1 | Vue.use(VueRouter) |
通过在路由路径中加入参数:id
,我们便可以在访问input页面时,用不同的路径加载不同模板了。为了让用户可以自己添加模板,我们也引入了Storge功能:
这时候,我们把这个App取名为DP-GUI,DP-GUI就算基本能用了,访问地址为https://deepmodeling.org/dpgui/。而这时候的准确时间为这周三,距离提出idea,刚好是一周的时间。
]]>今天dev通道推送了Windows 11 Insider Preview 22000,赶紧体验一把。
界面
底下的任务栏,图标跑到了中间。二屏的任务栏被砍了(好像只是个bug)。
PS:右下角并未出现水印。
完全变样的开始菜单。
搜索框跑到了最上面。
似曾相似的“小组件”。
通知和日历。
操作栏。
文件资源管理器。
Microsoft Store。并没有发现什么新app。
设置。
系统→关于。
新增功能
根据更新日志,好像没有增加什么有用的功能。。。
组里拨科研经费新入了16块3090,正好用3090测试一下深度学习势能+分子动力学模拟(MD)的性能。
程序版本:DeePMD-kit 2.0.0.b0 双精度[1][2],TensorFlow 2.4.1,CUDA Toolkit 11.1,LAMMPS 29Oct2020
测试样本为examples中的水,模型为se_e2_a。
项目 | 3090 | 2080Ti | V100 | P100 |
---|---|---|---|---|
训练10000步时间(s) | 341 | 670 | 214 | 228 |
10000步MD时间(s) | 129 | 154 | 49 | 54 |
可以看出,在上述测试案例中,3090的双精度性能较2080Ti有较大提升,但仍落后于V100和P100等专业计算显卡。当然,考虑到计算卡的价格也是3090的数倍,3090仍是不错的选择。
]]>惊闻微软终——于——放出了WSL GUI(WSLg),赶紧体验一把!
首先系统要升到Insider Preview 21364!
升级Win10
升到21364的水印
升级完毕之后,用管理员权限打开PowerShell,升级并重启WSL2:
1 | wsl --update |
兴冲冲打开Windows Terminal,输入pymol
,咦,怎么连不上?
打开GitHub,果然已经有人提了issue,开发者表示,在设置里把第一屏放到第二屏的右边,可以临时解决这个bug……
什么奇奇怪怪的bug
然后再用wsl --shutdown
重启,这次ok了!
pymol,丝滑般流畅!
VMD,也不逊色!拖曳旋转样样在行,甚至触屏体验也不错。
WSL GUI运行VMD
甚至自己用Python写的超级简陋版GUI也能愉快运行:
使用ssh -Y
连接办公室的机子,仍然可以打开VMD!观看静态画面毫无问题,受限于Wi-Fi的网速,拖曳、旋转画面出现稍许延迟,但仍远远优于Xming的体验。
再也不需要Xming了!
]]>2018年,我第一次接触DeePMD-kit时,花了整整一周的时间才测试成功。那时,对于一位驾轻就熟的老司机来说,在超算上安装DeePMD-kit可能仅需要2个小时;然而,对于刚刚接触这一切的新手来说,安装过程可能是数天的折磨,甚至是一辈子也无法解决的噩梦。2019年春,在开源社区的倡议下,优化安装过程被明确列入DeePMD-kit的开发计划。
在DeePMD-kit v0版本中,Python和C++的接口均调用了用TensorFlow的C++库编译的操作。然而,与Python版本的TensorFlow库相比,TensorFlow的C++库需要漫长的编译过程,对新手极不友好,也不利于开发。
于是,在v1版本中,开发者将Python接口与C++接口解除耦合,Python接口调用TensorFlow的Python包中的C++库进行编译。同时,开发者在主目录中添加了setup.py,调用scikit-build实现编译的自动化,并实现了自动搜索TensorFlow,从而使得用户能够用pip命令一键安装DeePMD-kit。
之后,开发者发现,一键安装DeePMD-kit的前提是提前装好scikit-build和cmake,这使得安装流程“不够一键”。这时,开发者发现了PEP-518,这一特性使得pip可以提前装好构建所需的工具。然而,PEP-518带来了包隔离特性,使得发现TensorFlow变得异常困难。在反复尝试下,开发者用了一些trick解决了一些问题。
在此基础上,开发者编译了wheel文件,上传到pypi上,使得安装DeePMD-kit变得异常简单:
pip install tensorflow deepmd-kit
安装成功后,运行dp -h
可以调用DeePMD-kit的Python接口。
在解决了Python接口的安装难题后,我们仍然面临C++接口的安装困难。这时,开发者把目光转向了conda。conda是包的分发和管理工具,和其它二进制分发工具相比,其最大优点在于安装时无需root权限。很多人认为,conda是Python包的管理工具,但其实,它也能分发C++的包。一般来说,分发编译后的二进制包,总有各种各样的静态库的依赖问题,但conda将所有的静态库都打包成了conda包,使得程序运行时无需调用系统自带的静态库。
Conda-build是conda包的打包工具,打包文件主要包括这两个文件:meta.yaml(配方文件,用于定义包的基本信息和依赖)、build.sh(构建包需要执行的命令),以及其它必须的文件。开发者将TensorFlow、DeePMD-kit和LAMMPS依次打包,并传到了anaconda.org上。于是,用户安装Anaconda或Miniconda后,可以使用下述命令安装:
conda install deepmd-kit=*=gpu lammps-dp==*gpu -c deepmodeling
之后运行dp -h
或lmp -h
即可调用DeePMD-kit或LAMMPS。
为了节约人力,DP开源社区将conda包的编译过程搬到了GitHub上,使用Azure Pipeline自动编译。同时,DP开源社区也将DeePMD-kit提交到了conda-forge开源社区中,并积极推动着conda-forge社区TensorFlow的编译。另外值得注意的是,DP开源社区请求清华大学开源软件镜像站镜像了deepmodeling的conda仓库,同时镜像站此前已经镜像了conda-forge的仓库,为国内的用户带来了很大的便利。截至今日,deepmodeling仓库DeePMD-kit的下载量已达6815次,conda-forge仓库DeePMD-kit的下载量已达21182次。
对于不能连通互联网的机器来说,离线包是必不可少的利器。开发者发现conda提供了constructor程序,只需一个配方文件,就可以打包已经编译好的conda程序,生成离线包。这些离线包同样由CI自动生成,可以在GitHub的Releases页面下载。
在离线包的基础上,开发者开发了Docker镜像,使用CI上传到了DockerHub及GitHub Package上,方便Docker精通者使用。
docker pull ghcr.io/deepmodeling/deepmd-kit:1.3.3_cuda10.1_gpu
子曰:“工欲善其事,必先利其器。”在2021年的今天,无论是新手还是老手,均可在5分钟内完成DeePMD-kit的安装。这一变化,为广大科研工作者带来了巨大的便利,也推动着DP走向世界,迈向更有前景的明天。
]]>三年前的一个平常的清晨,天尚未亮,笔者前往秋实阁校车站,乘坐6:30的校车。
2018年1月8日晨
一校两区,理科大楼到宿舍的距离长达25公里。交通不便,除了100元一次的出租车外,5元一次的校车则是唯一的选择。40分钟的车程后,校车准时抵达河东食堂门口,笔者愉快地开始用餐,同时在知乎上浏览最新的劝退信息。30分钟后,笔者掏出钥匙,打开办公室的大门。此时的办公室空无一人。打开显示器,一天的科研生活正式开始。
9:30,每周的组会开始,大家聚集在一起,交流领域内的文章和工作进展。两校区之间路途遥远,因此每周笔者只去办公室1-2次,剩下的日子则在宿舍工作,每周的例会时间便由此固定下来。
中餐和晚餐,笔者往往在河西食堂用餐,早已对每个窗口卖什么菜烂熟于胸。20:15,笔者结束手头的科研工作,前往停车场乘坐20:50的返程校车。又是40分钟的车程后,笔者抵达闵行校区校医院,一天的科研时光到此结束。
今天,上海轨道交通15号线正式开通,笔者却回想起了当年的“科研路”。正是坚持在往返两校区的路途中,笔者才产出了人生中最初的科研成果,开启了人生的科研路。
后记:这个系列目前的更新速度是每年一篇,那么我们明年再见吧。
]]>The tensorflow’s C++ interface will be compiled from the source code. Firstly one installs bazel. The bazel version 3.1.0 should be used. A full instruction of bazel installation can be found here.
1 | cd /some/workspace |
Firstly get the source code of the tensorflow
1 | git clone https://github.com/tensorflow/tensorflow tensorflow -b v2.3.0 --depth=1 |
You will answer a list of questions that help configure the building of tensorflow. You may want to answer the question like the following. If you do not want to add CUDA support, please answer no.
1 | Please specify the location of python. [Default is xxx]: |
The library path for Python should be set accordingly.
Now build the shared library of tensorflow:
1 | bazel build -c opt --verbose_failures //tensorflow:libtensorflow_cc.so |
You may want to add options --copt=-msse4.2
, --copt=-mavx
, --copt=-mavx2
and --copt=-mfma
to enable SSE4.2, AVX, AVX2 and FMA SIMD accelerations, respectively. It is noted that these options should be chosen according to the CPU architecture. If the RAM becomes an issue of your machine, you may limit the RAM usage by using --local_resources 2048,.5,1.0
.
Now I assume you want to install tensorflow in directory $tensorflow_root
. Create the directory if it does not exists
1 | mkdir -p $tensorflow_root |
Now, copy the libraries to the tensorflow’s installation directory:
1 | mkdir -p $tensorflow_root/lib |
Then copy the headers
1 | mkdir -p $tensorflow_root/include/tensorflow |
1 | git: unknown command -C ... |
This may be your git version issue, because low version of git does not support this command. Upgrading your git maybe helpful.
]]>每个知乎答主都有退乎的梦想,但退乎前如果删光回答,则十分可惜。因此,我用Python写了60行的脚本,可以在退乎前备份自己的所有回答和文章,以免事后后悔。
GitHub - njzjz/zhihubackup
1 | pip install git+https://github.com/njzjz/zhihubackup |
假如你是@贱贱,你的id是splitter
,那么可以编写Python脚本:
1 | from zhihubackup import backup_zhihu |
静等一段时间。运行结束后,可以看到产生了名为splitter
的文件夹:
1 | - splitter |
备份已经成功,现在可以删光回答和文章了。
]]>2019年5月,林峰邀请我暑假到北大实习,我欣然答应。拿到学士学位证书后,我在家里休息了一周,顺便处理了升学的各项事宜。这些全部搞定后,6月下旬,我启程前往北京。
2019年6月23日摄于北京大学东门
北京大数据研究院(另一个牌子是北京大学大数据研究中心)坐落于静园六院,位于燕园的中心地带,距离未名湖不远。静园六院为二层三合院结构,外观古朴,而房间里有中央空调。我很快熟悉了周围的环境,以及周围的外卖。
2019年6月30日摄于静园六院
在王涵老师的安排下,一开始的几天,我参与了一些DP-GEN软件的开发工作。DP-GEN是一个基于active learning的自动化框架,可以自动向集群提交任务,用于搜集数据。后来,DP-GEN的四作文章于2020年2月发表于Computer Physics Communications。
2019年7月4日,朱通老师来到北京。我们四个聚集在会议厅讨论,先交流了我第二篇文章的一些细节,接着提出了idea:能否把DP-GEN和燃烧反应结合起来,做一个全自动的流程来逐步探索反应,完全不需要人力操作?我们敲定首先用正十二烷裂解来作为例子,之后再拓展到其它体系。
虽然这个idea只有一句话,但实现起来却有好几步工作要做。主要难点在于,此前DP-GEN是为材料体系设计的,因而通过模拟较小的体系来采样;但高温下的反应体系需要从大规模的模拟中采样,而第一性原理计算又有限制。大体上,这个idea仍延续了第二篇文章的思路。次日,我列了一个开发提纲,计划逐渐实现目标。
2019年7月5日列出的开发提纲
7月下旬,所有代码均已开发完毕,这一课题进入“正十二烷阶段”。于是,7月底,我告别了DP团队,告别了北京。8月下旬,抵达Rutgers University后,我增加了邮件提醒功能,继续监视着DP-GEN的日志。起初进展缓慢,但到了11月,登辉的GPU加速MD的code问世了,MD速度提升了十倍!分析结果以后,我启用relative deviation又重跑了一遍,2020年1月便结束了战斗。
整个流程
拿着训练好的模型,我又进行了正十烷、正十四烷、正二十烷的模拟,并用第一篇文章分析,获得了不错的结果。长训的结果起先不如人意,测试了很久,排查出是sel不够所致。
9月,Darrin York让我申请NVIDIA Graduate Fellowship(最后并未申到),为了完善简历,我赶紧把这篇文章发到ChemRxiv上,并投了出去。最后ACS旗下的Energy & Fuels同意审稿。10月下旬,审稿意见返回,两个小修,一个大修。那时,刚好第二篇文章发表,于是我光顾着兴奋,11月下旬才把文章修回,一周后便顺利接受。
至此,基于深度学习模拟燃烧反应的方法开发算是告一段落了,基于这一方法,可以完成进一步的应用,发几篇大文章。
Exploring the Chemical Space of Linear Alkane Pyrolysis via Deep Potential GENerator
Jinzhe Zeng, Linfeng Zhang, Han Wang, Tong Zhu
Energy & Fuels, 2021, 35 (1), 762–769.
DOI: 10.1021/acs.energyfuels.0c03211
统计了论文宣传稿在微信上的传播路径(图),产生几个有意思的结论。一是学校媒体和传统媒体的影响力仍然是最大的,应当作为宣传时优先考虑的对象;二是自媒体喜欢抄来抄去,扩大了宣传稿的阅读量;三是一些媒体乱改标题,总喜欢搞个大新闻。
]]>转载自华东师范大学新闻网
华东师范大学化学与分子工程学院朱通副研究员指导学生结合人工智能算法、量子化学理论以及分子动力学方法,实现了燃料燃烧的高精度计算机模拟,在原子尺度和亚飞秒时间分辨率下获得了甲烷燃烧的化学反应网络。该成果以“Complex reaction processes in combustion unraveled by neural network-based molecular dynamics simulation”为题近日发表在Nature Communications [Nat. Commun. 2020, 11, 5713.]。华东师范大学为论文第一单位,2019届本科毕业生曾晋哲为论文的第一作者,朱通副研究员和张增辉教授为论文的共同通讯作者。
朱通副研究员和张增辉教授为论文的共同通讯作者
航空发动机是国防、交通等领域的核心装备,反应了一个国家的科技和工业能力。只有掌握先进的航空发动机技术,才能使我国在航空航天领域与发达国家的竞争中获得优势地位。掌握燃料燃烧的本质和基础理论,发现和阐明航空发动机燃烧过程的基本规律和其中涉及的物理化学机制,是我国在发动机设计领域追赶直至超越发达国家的必要条件。
发动机工作在高温高压的严苛工况下,很难通过实验手段对其进行全景式的定量研究。而传统计算模拟方法无法正确高效地处理燃烧过程中剧烈化学反应带来的大量反应路径的量子化学计算。最近,基于人工神经网络的深度学习方法为构建具有量子化学精度、同时十分高效的模拟算法提供了可能。本研究专门为燃烧反应设计了数据库构建方案,采用人工神经网络模型在0.1飞秒的分辨率下对甲烷燃烧过程进行了长达1纳秒的反应分子动力学模拟。
图1. 本文中的人工神经网络框架以及主要物种随着模拟时间的演变
在团队近期开发的ReacNetGenerator软件[Phys. Chem. Chem. Phys., 2020, 22, 683.]的帮助下,该工作不仅复现了多年来积累的甲烷燃烧骨架反应机理,还发现了数百个中间反应路径,揭示了甲烷燃烧的完整反应网络。
图2. 模拟获得的甲烷燃烧主要反应机理
论文第一作者2019届本科毕业生曾晋哲
目前团队正将该方法应用于碳烟的生成机理、航空煤油的热解以及含能材料的起爆机理研究中。该方法的进一步发展还有望为有机合成路径的逆分析提供新的思路。相关算法已集成至DP-GEN软件中[Comput. Phys. Commun., 2020, 253, 107206.]供用户下载使用。
值得一提的是本工作也是曾晋哲同学本科毕业论文的一部分,该毕业论文获得了第二十五届上海市大学生化学化工优秀论文交流会一等奖。相关算法还获得了全国及上海市的大学生计算机能力大赛一等奖。
本工作得到了国家自然科学基金重大研究计划《面向发动机的湍流燃烧基础研究》培育项目、科技部重点研发计划、国家级大学生创新创业训练计划和华东师范大学超算中心的支持。
文章链接:https://www.nature.com/articles/s41467-020-19497-z
]]>在搞定libdeepmd的构建后,我们终于来到了最后一关:LAMMPS。
这里以今年3月发布的LAMMPS stable_3Mar2020为例。在寻常的安装中,我们需要把USER-DEEPMD
文件夹拷进src
目录下,这次也不例外,我们在build.sh
的最开头便做了这件事:
1 | cp -r ${PREFIX}/share/USER-DEEPMD src/ |
这里的USER-DEEPMD
来自于我们上次构建的libdeepmd,我们自然需要在meta.yaml
添加这一依赖。
1 | requirements: |
可以看到,除了libdeepmd和cudatoolkit外,我们还添加了其它LAMMPS需要的外部依赖,如mpich和zlib等。
值得注意的是,我们拷到src
目录下的USER-DEEPMD
本质上是一个第三方的package,并没有得到LAMMPS的官方支持。因此,我们要给LAMMPS的cmake文件打上补丁,加上这个package:
1 | Add deepmd |
现在,我们可以继续编写build.sh
了。首先配置plumed:
1 | make -C src lib-plumed args="-p $PREFIX -m runtime" |
接着,我们用cmake编译LAMMPS,把能开启的包全部开启,尽可能地覆盖大多数用户:
1 | mkdir build |
我们通过cmake的参数开启了一坨LAMMPS的package,同时通过配置CMAKE_CXX_FLAGS
加入了对libdeepmd的链接。同时,我们通过环境变量配置了两类变体(variant):CPU和GPU、单精度和双精度。最后,编译,成功。
值得一提的是,如果使用者想开启更多的package,最简单的方法是修改配方中build.sh
,在conda_build_config.yaml
注释掉不想要的variant,然后自己用conda-build
重新编译一遍。
我们用BUILD_LIB=on
和BUILD_SHARED_LIBS=on
开启了shared libs模式,这样,LAMMPS会产生三类文件:LAMMPS的library、LAMMPS的执行程序、Python package。如何将它们生成不同的库?这时我们需要用到meta.yaml
里的outputs
选项:
1 | outputs: |
在outputs
中,我们把生成的文件分到了liblammps-dp
、lammps-dp
和pylammps-dp
三个子包内,同时利用pin_subpackage
让后两个包依赖第一个包。这样,使用者便可以按需安装自己想要的功能了。
至此,deepmd-kit
、libtensorflow_cc
、libdeepmd
和lammps-dp
已经全部构建完成!下一篇文章中,我们将用constructor
将这几个package打包成离线安装包。