# Batch_Config **Repository Path**: restgroup/batch_config ## Basic Information - **Project Name**: Batch_Config - **Description**: No description available - **Primary Language**: Unknown - **License**: LGPL-3.0 - **Default Branch**: symei - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-03 - **Last Updated**: 2026-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 功能范围 - 串行提交多任务(serial), 主要用于参数拟合,目前仅支持REST下的赝势拟合。 - 并行提交REST任务(queue)用于批处理 # 如何快速开始 这里只讲述大概流程,ctl文件如何填写参见输入卡部分 ## 一. 串行提交(拟合)部分使用 在需要提交的目录下准备好ctl文件和bsub文件,bsub文件的模版为fitting.bsub,在文件夹scripts中。在bsub文件中填写相应的ROOT_PATH,FITTING_PATH (存DFT_Fit.py的地方),IGOR_MODULES_PATH (存my_io.py, rest_manage.py的地方).bsub文件内改动要提交的文件名、所用核数和提交队列。 然后输入bsub < xxx.bsub即可 (xxx.bsub为改好的bsub文件)。 输入卡文件的模板在Batch_Config/DFT_Fit/Data/Pseudo_Fitting/example文件夹下。 ## 二. 并行提交(批处理)使用 在需要提交的目录下准备好ctl文件和sh文件,提交批处理的脚本文件的模版为Batch_Home_new.sh,在文件夹scripts中。在sh文件中填写相应的ROOT_PATH,IGOR_MODULES_PATH (存my_io.py, rest_manage.py的地方),BATCH_PATH(存Batch.py的地方)。如果Batch_Config文件直接被clone到HOME下的话,sh文件不用修改。 需要运行的话输入 ./Batch_Home_new.sh xxx.ctl即可。所用核数和提交队列在ctl文件内部指定。 如果不想每次都把sh文件复制到所在文件夹,可以把sh文件所在目录加入环境变量,这样就不用在当前目录有sh也能调用。 **由于代码逻辑限制,使用批处理功能需要运行两遍./Batch_Home_new.sh xxx.ctl才能得到正常的.Batch文件。**一遍是批量提交计算任务,在所有涉及计算任务都执行结束以后再执行一遍./Batch_Home_new.sh xxx.ctl收集能量信息,得到Batch文件。 注意: 如果不希望每次重新计算任务而只是计算未完成的任务or收集数据,**请把ctl文件中开头的ProjCtrl参数设置为2**,这代表只计算未进行的任务而非全部重算。 意外处理: **在个别任务没收敛的情况下**,可以把单任务提交脚本(single_job.*)复制到对应ctrl.in文件所在文件夹重算单任务。提交到服务器计算还是本地计算施个人情况而定。 ## 三. 在提交前仍需要做的源码变动 **对于拟合:** DFT_Fit.py中main函数部分的ModuDir(约第900行), 请填写my_io.py和rest_manage.py所在目录(这两个文件当然在同一个目录)。 rest_manage.py中run_Job_serial函数部分的ModuDir(约第189行),请填写REST_Environment所在目录。 想更换所用REST版本请修改REST_Environent, 如果使用的是rest的镜像版本(.sif)需要进行本地和容器位置的挂载(bind),想更改bind的本地位置也请修改此文件。**bind位置会影响__rest__::到end rest部分涉及到path的绝对路径的输入,这里面的路径都要写容器视角下的路径**。关于这一点后面还会细说。 **对于批处理:** Modules目录下的rest_runscr_docker, bind位置需要自己指定。**bind位置会影响__rest__::到end rest部分涉及到path的绝对路径的输入,这里面的路径都要写容器视角下的路径**。 # 涉及**可用**功能的文件结构 在默认未改文件名和结构的情况下,赝势拟合/REST批处理中主要涉及到的文件的结构情况如下(意思是无关赝势的没放进来): Batch_Config/(一般为ROOT_PATH) - DFT_Fit/ - DFT_Fit.py - Data/ - Pseudo_Fitting/ - ae-data/ - pp-fit/ - example/ - example.ctl - example_multitask.ctl - rescaling_func.py - Modules/ - my_io.py - rest_manage.py - REST_Environment - rest_runscr_docker - scripts/ - Batch_Home_new.sh (批处理脚本) - fitting.bsub (提交到队列的拟合脚本) - fitting.sh (本地运行的拟合脚本) - single_job.bsub (提交到队列的单任务脚本) - single_job.sh (本地运行的单任务脚本) ## 运行逻辑 对于拟合(串行提交)来说,实际上是运行DFT_Fit.py的main函数,创建my_io.py中的ConfigIO类的对象(MainFit)解析ctl输入卡,在落实到输入卡中单个文件提交的时候会创建rest_manage.py中的RESTIO类的对象(tmpJob)运行相应的操作。 对于批处理来说,运行了Batch.py调用my_io.py解析输入卡,再在单个文件提交的时候创建rest_manage.py中的RESTIO类的对象(tmpJob)运行相应的操作 二者的区别有如下几点: - 一个调用了DFT_Fit.py,一个调用了Batch.py - 拟合的过程涉及到了my_io.py里面的更多内容 - 拟合只能使用串行(serial)提交, 批处理推荐使用并行提交(queue) 体现在输入卡中就是\_\_rest\_batch\_type\_\_的第一个参数填写(后面还会讲) 对于两个共用文件 my_io.py用于处理batch的输入卡.ctl信息,会记录batch层面的这些信息,以及在batch层面处理数据,写入数据。 rest_manage.py用于rest类型的单个任务(e.g. 算br的单点能)提交(serial/queue, 在赝势拟合中只能是serial)和单个任务的数据记录和传递。 DFT_Fit.py描述了函数(calc_statistic,这里为calc_statistic_pseudo, 返回值为wRMS/wMAD)怎么找到最佳参数(calc_statistic中的参量C, 初猜为FitClass(即MainFit).InitGuess)的过程,用来寻找的办法就是run_optimization函数中的几种算法。 # ctl输入卡讲解 这里的讲解和example.ctl给出了所有可能涉及的关键词。实际使用中只会用到一部分。对于没使用到的部分,一般情况留着example.ctl里面的东西不管就行。 ## 一. 批处理和拟合共用部分 先讲输入地址的填写。 \_\_rest\_\_::到end rest部分里面的路径,如basis_path、auxbas_path, 最终要写容器视角下的路径。这里以一个例子简单说明: basis_path的本机地址为/share/home/symei/basis/br/def2-SVP-28, 假设REST_Environment中有:--bind /share/home/symei:/my_path, 那么容器中的basis_path地址则为/my_path/basis/br/def2-SVP-28 而\_\_basis\_dir\_\_, \_\_macro\_path\_\_这些在__rest__::到end rest外面的路径正常写主机下的路径就行。 ### 基本信息 \_\_project\_\_处的ProjDir一般是相对地址,相对于ctl所在的工作目录,存储各个反应物的计算文件。 \_\_project\_\_ ::后第二个参数ProjCtrl在赝势拟合是一定要选0 (覆盖模式)。批处理建议选2(只计算没计算过的任务) \_\_rest\_batch\_type\_\_ ::说明见ctl文件内。对于后面第一个关键词一定**在赝势拟合情况下写serial**。 批处理推荐使用queue,但是serial下也能批处理。使用serial批处理提交过程和涉及文件都和拟合过程一样。第三个关键词在使用容器(*.sif)计算的情况请填写rest_runscr_docker,调用非容器的老版本REST请填写rest_runscr_xhpc1。 \_\_rest\_\_ ::后面写运算所需核数和所用rest版本,调用版本如果是容器写名称**不要带** .sif。REST软件的地址在/share/apps/rust/rest/。 对于赝势拟合,所写核数 **应与bsub脚本中写的核数一致**,后面版本写不写写啥都无所谓,因为serial模式下用的还是REST_Environment里面指定的那个。 \_\_basis\_dir\_\_是需要指定写入的赝势文件。 \_\_rest\_\_ :: ... end的部分为REST单任务计算中ctrl.in公共使用的部分,参数使用参照[REST教程](https://gitee.com/restgroup/rest/tree/master)。 ### 反应物汇总部分 \_\_batch\_\_部分各个反应物的geometry.in和elec_state文件应存放在DIR列所示目录的InpName列所示的子文件夹里。这俩文件怎么写请参照DFT_Fit/Data/ae-data里面找俩看看。\_\_batch\_\_ ::后面的数字是下面输入的要算的反应物数量。JobType列写了energy就是算单点,写了xdh是算双杂化,前提是用了双杂化泛函,不然可能会报错。好像还有一些别的jobtype,但我没用过不知道。 ### 反应、参考值与权重部分 __energy__部分,\_\_energy\_\_::后面第一个数字是下面写的反应数量,第二个数字是从a.u.换成别的单位的换算系数。下面复制一行来讲每一行的含义: 2 br2 -1  br 2 49.5374113 1.000 第一列2是指反应涉及两种物质,br2 -1 br 2指$\mathrm{Br}_2\rightarrow2\mathrm{Br}$的反应,倒数第二列49.5374113是该反应的参考值,最后一列1.000是权重。 如果不想计算反应能量,可以把这部分删掉。但如果反应中涉及到\_\_batch\_\_部分没有计算的反应物会报错。 ## 二. 赝势部分特色讲解 ### 算法部分介绍 算法选择部分位于\_\_optimization algorithm\_\_,推荐赝势优化的误差在达到极限的情况下全局使用cmaes算法。其实是推荐在参数在耦合强、最优点可能在震荡剧烈区域的情况用遗传算法。局部参数优化推荐用powell算法,比downhill simplex法更稳健。 一开始也试图使用过optuna接口里面的TPE算法,这个算法本质上是采样各区域的,评估好点和坏点数量,根据评估移动扫描范围。对于赝势这中函数震荡剧烈的情况扫描区域会逐渐跑歪(笔者猜测)。不过输入卡中还是有对于optuna的选项。 multivariate对应参数间是否存在耦合,group对应耦合的参数是否需要分组。所以在拟合单个角动量通道的参数的时候\_\_optuna\_option\_\_通常为multi,拟合所有参数的时候通常为group。 \_\_n_trials\_\_选项对应第一轮的时候的计算轮次,\_\_n\_startup\_trials\_\_对应第一轮的完全随机采样的轮次。运行完每一轮会改变扫描范围,并根据当前轮次下的最小误差调整每轮的计算次数,即对于n_trials和n_startup_trials乘以一定的比例系数。想要修改算法请前往DFT_Fit.py的elif FitClass.OptAlgo[:6] == 'optuna':处。想改cmaes的东西同理。 ### pseudo part all模式就是拟合所有参数。其他模式需要和下面的\_\_pseudo\_property\_\_参数一起看。\_\_pseudo\_property\_\_处**必须把Angm和PType参数都写上,且Angm处要写整数类型的**,哪怕在某些mod下只会用到两个参数中的一个。 初猜输入的总原则是**先写coeff,再写gexp**。 - mod = mixed,property部分PType = coeff, Angm = 0,指优化角动量为0的所有coefficient参数。 - mod = angm, property部分Angm = 0,指优化角动量为0的所有参数, 此时PType参数无效,但是得随便写点东西 写initial guess的时候,应该先写角动量0的coefficients参数,再写角动量0的gaussian_exponents参数。 - mod = ptype, property部分PType = gexp, 指优化所有角动量的gexp参数。此时Angm参数无效,但是得写点东西。 写initial guess的时候,按照角动量大小顺序写初猜参数。 - mod = manual, property部分Angm = 0, 指优化角动量为0的**部分**coefficient参数。 e.g.: \_\_coeff position\_\_ :: 1 2 \_\_gexp position\_\_ :: 3 指优化角动量为0的第1,2个coeff参数和角动量为0的第3个gexp参数。写初猜的时候,先写coeff的第1,2个参数对应的初猜,再写gexp的第三个参数对应的初猜,就写这三个数的初猜即可。 - mod = all,初猜写法先按顺序写上所有coeff, 再按角动量顺序写上所有gexp参数。 ### multitask功能 服务于多目标的拟合(似乎叫multi target更合适),比如多个泛函下、多个基组下都希望误差更小。体现就是需要多个输入卡和多个相对应的参考值。 涉及包括这几部分: - 多个公共输入卡之间用\-\-\-隔开 - 在原来反应写单个参考值的地方写多个参考值 - 在\_\_multitask\_\_后面写任务数量,在\_\_task\_name\_\_后面写自定义的对应数量的任务名称,这会影响在ProjDir下面新建的不同的子文件夹的名字。不同子文件夹中存储相应输入卡对应的batch中各反应物的计算信息。 - **task name, 参考值和输入卡的顺序要匹配**! ### precondition part 用于参数的预处理,目前尚未完成。功能是作参数变换,如$F(x)=G(log(x))$,其中$G(y)=F(e^y)$。 用于把x变成希望的函数和变换回去的逆函数都记录在rescaling_func.py中。如需使用本功能,请把rescaling_func.py放于工作目录下。这个文件在example文件夹里面。功能旨在通过参数变换减小优化过程中的条件数。 *Hessian矩阵的最大特征值的绝对值和最小特征值的绝对值的比值为条件数。* 等真有人用到了再写吧。