分布式计算

1. BOSS用户使用流程

1.1 准备工作

​ 开始使用分布式资源运行boss作业之前,用户需要先申请证书,并申请加入BES VO。

1.2 设置环境

​ 复制ganga配置脚本到用户目录下:

$ cp /afs/.ihep.ac.cn/bes3/offline/ExternalLib/gangadist/.gangarc ~/.gangarc

​ 修改其中的gangadir属性 (66行),指向用户自己定义的某个目录。

​ 创建网格和BOSS软件环境设置脚本,包括BOSS初始化和网格环境,其中网格环境脚本提供如下:

   source /cvmfs/dcomputing.ihep.ac.cn/frontend/gangadist/env_grid.sh

​ 上面的内容以bash为例,使用tcsh的用户可以在同一个目录下找到对应的tcsh脚本。

1.3 作业提交监控及数据下载

​ 本节以bhabha事例为例,介绍作业提交及监控过程。

1.3.1 作业提交

​ 1. 使用上面提到的脚本初始化环境, 这时会提示输入证书密码,此密码为生成pem文件设置的密码。

​ 2. 在某个目录下编辑准备ganga脚本文件,语法遵循python语法。以下为范例(sim_dirac_by_event.py):

# ganga job file for BOSS simulation only
 bossVersion = '6.6.4.p03'
 optionsFile = 'jobOptions_sim_bhabha.txt'
 jobGroup = '150420_bhabha_01'
 metadata = {'resonance':   '4360',
             'eventType':   'bhabha',
 }
 splitter = UserSplitterByEvent(evtMaxPerJob = 1000, evtTotal = 1000*200)

 app = Boss(version=bossVersion, optsfile=optionsFile, metadata=metadata)
 j = Job(application=app, splitter=splitter)

 j.backend = Dirac()
 j.backend.settings['JobGroup'] = jobGroup
 j.backend.settings['Destination'] = ['BES.UMN.us']
 #j.inputsandbox.append("mypdt.table")
 j.submit()

 print '\nThe DFC path for output data is:'
 print app.get_output_dir()
 print '\nThe dataset name for output data is:'
 print app.get_dataset_name()

Note: 推荐参数 "evtMaxPerJob" 不要超过20,000,可以降低失败率。"jobGroup" 可以用来筛选作业。额外的输入文件 (除job option和decay card以外的文件) 需要添加在inputsandbox里面。

  1. 将BOSS作业文件 (包括job option文件,衰变卡片等) 与ganga脚本文件放在同一个目录下,然后运行以下命令提交作业:

    $ ganga sim_dirac_by_event.py

  2. 提交作业完成后会输出作业生成数据将要保存在DFC上的目录位置,以及生成数据对应的dataset名称,比如

    User_tyan_4360_664p01_bhabha_round06_31001_31100_stream001_rtraw

1.3.2 作业监控

​ 作业的运行状态可以能通过访问DIRAC服务器来浏览,选择菜单"Jobs"→"Job monitor"页面。

1.3.3 获取输出数据

​ 作业运行完成后 (或者部分完成) 可以使用以下命令下载已经产生的数据:

$ besdirac-dms-dataset-get

​ 数据文件将被下载到当前目录。下载时也可以指定下载到其它目录:

$ besdirac-dms-dataset-get -D /output/path

​ 下载过程中可以随时按ctrl+C退出。如需要恢复上次的下载,只需要重新运行同样命令即可。下载无需要等到所有作业全部完成后开始,新生成的数据文件会自动下载到本地,用户可以通过查看文件数目判断是否全部下载完成。

​ 如果需要获取作业运行的log文件,执行以下命令,log会下载到当前目录:

$ besdirac-wms-log-get ...

1.4 支持的作业类型

​ 目前BESIII分布式计算系统支持以下3种类型的BOSS作业:

(1)模拟(输出rtraw文件)

(2)模拟+重建(输出rtraw/dst/rec文件)

(3)模拟+重建+分析(输出rtraw/dst/rec/root文件)

1.4.1 模拟

​ 用户需要准备好模拟所需的job option文件,以及对应的产生卡片(可选)。对应的ganga脚本如下:log会下载到当前目录。

bossVersion = '6.6.4.p02'
optionsFile = 'jobOptions_sim_rhopi.txt'
jobGroup = 'sim_rhopi_141102'
metadata = {'resonance': 'jpsi', 'eventType': 'rhopi'}
splitter = UserSplitterByRun(evtMaxPerJob = 100, evtTotal = 100*10)

app = Boss(version=bossVersion, optsfile=optionsFile, metadata=metadata)
j = Job(application=app, splitter=splitter)

j.backend = Dirac()
j.backend.settings['JobGroup'] = jobGroup
j.submit()

1.4.2 模拟+重建

与模拟作业不同之处的就是需要提供重建的job option文件:

bossVersion = '6.6.4.p02'
optionsFile = 'jobOptions_sim_rhopi.txt'
recOptionsFile = 'jobOptions_rec_rhopi.txt'
jobGroup = 'simrec_rhopi_141102'
metadata = {'resonance': 'jpsi', 'eventType': 'rhopi'}
splitter = UserSplitterByRun(evtMaxPerJob = 100, evtTotal = 100*10)

app = Boss(version=bossVersion, optsfile=optionsFile,
            recoptsfile=recOptionsFile, metadata=metadata)
j = Job(application=app, splitter=splitter)

j.backend = Dirac()
j.backend.settings['JobGroup'] = jobGroup
j.submit()

1.4.3 模拟+重建+分析

ganga脚本示例如下:

bossVersion = '6.6.4.p02'
optionsFile = 'jobOptions_sim_rhopi.txt'
recOptionsFile = 'jobOptions_rec_rhopi.txt'
anaOptionsFile = 'jobOptions_ana_rhopi.txt'
jobGroup = 'simrecana_rhopi_141102'
metadata = {'resonance': 'jpsi', 'eventType': 'rhopi'}
splitter = UserSplitterByRun(evtMaxPerJob = 100, evtTotal = 100*10)

app = Boss(version=bossVersion, optsfile=optionsFile, recoptsfile=recOptionsFile,
    anaoptsfile=anaOptionsFile, use_custom_package=True, metadata=metadata)
j = Job(application=app, splitter=splitter)

j.backend = Dirac()
j.backend.settings['JobGroup'] = jobGroup

j.submit()

运行分析作业通常会用到用户自己的分析程序,这时需要指定参数"use_custom_package=True",这样会把用户自己workarea下面的程序自动上传。

1.5 作业的拆分

有2种拆分作业的方法:

(1) 按run拆分。根据每个run的亮度进行拆分,每个作业只包含一个run,每个run的事例数与亮度成正比。

(2) 按事例拆分。所有作业都包含全部run范围,而且每个作业事例数都相同。

1.5.1 按Run拆分

每个作业只包含一个run,每个run的事例数与run的亮度成正比,拆分出来的作业数至少是run的个数

splitter = UserSplitterByRun(evtMaxPerJob = 500, evtTotal = 500*100)

在job option文件里,指定run范围时要把绝对值小的放在前面:

RealizationSvc.RunIdList = {-11414, 0, -13988, -14395, 0, -14604};

或者

RealizationSvc.RunIdList = {11414, 0, 13988, 14395, 0, 14604};

​ Note: 负号可以不要。请注意不要设置超过一个round范围的run,目前还不支持这种情况。如果用户希望知道每个作业的运行事例数,可以在splitter里指定输出文件名:

splitter = UserSplitterByRun(evtMaxPerJob   = 500, evtTotal = 500*100,       outputEvtNum = 'run_event.log')

1.5.2 按事例拆分

每个作业包含所有的run范围,每个作业的事例数相同。

splitter = UserSplitterByEvent(evtMaxPerJob = 500, evtTotal = 500*100)

splitter =   UserSplitterByEvent(evtMaxPerJob = 500, evtTotal = 500*100)

Note:由于这种方式会对文件系统产生较大压力,尤其是大量作业并行时。因此建议只用在特殊的情况。

1.5.3 随机数种子

如果不指定随机数种子,系统会自动分配一个唯一的种子。用户也可以指定自己需要的随机数种子:

splitter =   UserSplitterByRun(evtMaxPerJob = 100, evtTotal = 100*10, seed = 10001)

每个作业的随机数种子依次为10001, 10002, 10003,...

1.6 其他

1.6.1 选择输出数据

​ 默认情况下的输出文件由作业最后一步来确定,比如模拟返回rtraw文件,模拟+重建返回dst/rec文件,模拟+重建+分析返回root文件。

​ 如果用户希望得到中间步骤的输出结果,可以如下指定:

app = Boss(version=bossVersion, optsfile=optionsFile,         recoptsfile=recOptionsFile, anaoptsfile=anaOptionsFile,   metadata=metadata,         use_custom_package=True, output_step=['sim','rec','ana'])

1.6.2 使用自定义产生子

​ 用户如果需要使用自己编写的产生子进行模拟,比如BESEVTGEN的DIY模式,可以和分析程序类似处理,添加选项"use_custom_package=True"。 这样他工作目录下面的软件包将自动上传到grid。

app = Boss(version=bossVersion, optsfile=optionsFile,  use_custom_package=True, metadata=metadata)

1.6.3 其它输入文件

​ 用户在编写自己的程序时,可能会用到一些额外的输入文件,或者是某个程序包需要额外的输入文件,这时需要指定将这些文件上传:

bossVersion = '6.6.4.p02'
optionsFile = 'jobOptions_sim_rhopi.txt'
recOptionsFile = 'jobOptions_rec_rhopi.txt'
anaOptionsFile = 'jobOptions_ana_rhopi.txt'
jobGroup = 'simrecana_rhopi_141102'
metadata = {'resonance': 'jpsi', 'eventType': 'rhopi'}
splitter = UserSplitterByRun(evtMaxPerJob = 100, evtTotal = 100*10)

app = Boss(version=bossVersion, optsfile=optionsFile, recoptsfile=recOptionsFile,
    anaoptsfile=anaOptionsFile, use_custom_package=True, metadata=metadata)
app.auto_upload.append('/your_extra_file_path_1/extra_input_1.txt')
app.auto_upload.append('/your_extra_file_path_2/extra_input_2.txt')

j = Job(application=app, splitter=splitter)

j.backend = Dirac()
j.backend.settings['JobGroup'] = jobGroup

j.submit()

Note: 要注意的是这些文件在程序中的路径必须是指向当前目录的相对路径。这些路径最好可以在job option里指定,这样更加容易与本地运行兼容。

2 CEPC 用户使用流程

2.1 准备工作

​ 使用分布式计算之前,需要申请网格证书和加入CEPC VO。

2.2 设置环境

运行下面的命令设置环境:

source /cvmfs/dcomputing.ihep.ac.cn/frontend/dsub/setup/env_dsub.sh

2.3 准备作业配置文件

作业配置文件是一个描述作业的普通文本job.cfg,下面示例列出了其中主要参数,具体可参见/cvmfs/dcomputing.ihep.ac.cn/frontend/dsub下面的例子:

job_type = cepc_sr
repo_dir = ./repo
work_dir = ./work
input_filelist = ./stdhep.list 
output_dir = test_001
evtmax = 10
evtstart = 0
batch = 1
job_group = CEPC_test_001

2.4 提交作业

作业配置脚本 (job.cfg)准备好之后,运行下面的命令提交作业

dsub job.cfg

2.5 监控作业状态与调试

​ 用户使用带有自己证书的浏览器, 通过访问DIRAC服务器(http://dirac.ihep.ac.cn)来浏览,选择菜单"Jobs"→"Job monitor"页面。JobGroup是一个很方便的筛选作业的参数。

​ 遇到作业出错时,分析出错原因并寻找解决方案。

​ 常见的错误代码如下:

10 准备阶段错误
11 cvmfs 没有准备好
20 模拟阶段错误
21 数据库连接错误
22 Too many substeps 错误
23 没有输入事例数
30 重建阶段错误

2.6 获取作业输出数据

​ 当全部作业完成后,可以在下面的目录找到输出数据

/gridfs/cepc/user/<initial>/<username>/<output_dir>/sim   /gridfs/cepc/user/<initial>/<username> /<output_dir>/rec

results matching ""

    No results matching ""