如何使用 thht 来提交高通量作业 - lijiang2014/thht GitHub Wiki
如何使用 thht 来提交高通量作业
About
THHT 是目前在开发的一款基于天河二号 slurm调度环境的高通量作业提高器 , 目前可用来进行 :
- 海量(目前测试可达 百万个)串行作业的提交
- 串行作业失败后自动重算等处理
THHT 目前尚在开发中,尚有些功能(暂时)无法提供 :
- 目前最大管理的节点规模为 100 多 , 超过 100个节点的作业暂时通过提交多个 thht 作业的方式来进行 (下个版本会解决此问题)
- 目前不支持 mpi 作业的管理
在使用过程中如有发现bug 或对其功能有想法请直接联系我([email protected]),更推荐直接在 github issus 中提出 。
如何使用
这里通过一个范例来讲解 :
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ cp -r /WORK/app/thht/thht/test/simpletest/ .
simpletest 是供测试的范例,通过这个可以了解如何来使用 thht 来提交高通量作业 。
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ ./test.sh
Submitted batch job 4332226
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ yhq
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
4332226 work main.sh sysu_hpc_dwu PD 0:00 2 (None)
执行 ./test.sh 即可完成提交操作
How to define the works ?
那么这个作业是怎么设置的呢 ?
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ cat ./test.sh
export THHT_REDIS_PATH=/WORK/app/redis/3.2.4/bin/
export THHT_PATH=/WORK/app/thht
export THHT_PACKAGE_PATH=$THHT_PATH/thht
#export PATH=$THHT_PATH:$PATH
#export THHT_EXEC="/HOME/nscc-gz_jiangli/virtualenv/ht_celery/simtask.py"
export THHT_INPUT="input.htc"
yhbatch -N 2 $THHT_PATH/thht/main.sh settings.htc
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$
查看 test.sh 脚本 , 前面的环境变量设定暂时不用管,主要是最后两行,设定了两个核心文件 : input.htc 和 settings.htc . 其中, input.htc 为 批量作业列表 , settings.htc 则为 thht 作业的一些设定值。
另一个需要注意的参数是 yhbatch 的参数, 如果需要的特定作业分区执行则请加上 -p 参数 , 如果需要 更多节点,请修改 -N 后面的数字 (此版本勿超过100)。
THHT 参数设定文件 settings.htc
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ cat settings.htc
EXEC = ./simtask.py
INPUT = input.htc
queue.max_retries = 2
queue.default_retry_delay = 0
其中比较重要的地方是第一行 : EXEC = ./simtask.py , 表明了可执行程序为何
,第二行还是在设定 批量作业列表 。
批量作业列表 input.htc
目前需要通过批量作业列表来设定需要提交的批量作业。input.htc 的内容大致如下 :
[sysu_hpc_dwu_1@ln2%tianhe2-C simpletest]$ head input.htc
test0 e 0 > output/out.0 2> output/err.0
test1 1 2 3 1 > output/out.1 2> output/err.1
test2 1 2 3 2 > output/out.2 2> output/err.2
test3 1 2 3 3 > output/out.3 2> output/err.3
test4 1 2 3 4 > output/out.4 2> output/err.4
test5 1 2 3 5 > output/out.5 2> output/err.5
test6 1 2 3 6 > output/out.6 2> output/err.6
test7 1 2 3 7 > output/out.7 2> output/err.7
test8 1 2 3 8 > output/out.8 2> output/err.8
test9 1 2 3 9 > output/out.9 2> output/err.9
其中每一行会被 thht 派生出一个作业,每行的第一个字符串,如此例中的 test1 等 是批量作业的作业名 ,后面的字符串则会和前面的 settings.htc 中的 EXEC 一起拼接成一个 命令 , 如 此例中 test1 对应的 为 :
./simtask.py 1 2 3 1 > output/out.1 2> output/err.1
how to run my work ?
参考此例,用户需要在自己的工作路径下 创建 test.sh , input.htc , settings.htc 三个文件。建议直接从这个范例中复制过来进行修改 。
根据 自己需要使用的作业分区及节点规模,修改 test.sh 中的 yhbatch 的参数 。 (注意目前 -N 后面的数字不要超过100) 修改 settings.htc 中的参数 EXEC 为自己的可执行文件的路径 , 如果需要运行不同的可执行程序,则建议采取一个封装调用脚本来进行 。 根据自己的批量作业特点来生产 input.htc , 建议通过脚本和命令来生产 input.htc , 并先通过小的测试来检查设置是否正确可用 。
注意 : 在实际应用于大规模的情景前请先用小作业进行测试 。
封装调用脚本
前面提到的 exec 和 input.htc 的命令拼接方式对于某些场景可能无法直接使用,可以通过封装调用脚本来进行处理。
如我要用应用程序 a.out 对所有的 png 文件进行处理 ,而 当前目录下有很多嵌套的子文件夹,而 a.out 只能处理当前文件夹下的 单一 png 文件, 命令如下 “ a.out xx.png > xx.png.dat ” 则可以这样生成 input.htc :
find . -name “*.png" | xargs -i echo {} {} > input.htc
这样可以生成 批量作业列表 input.htc 这样每个作业的 名字和参数都是 png 文件的路径 。
我们可以编写调用脚本 simtask.sh 作为调用的 exec :
#!/bin/sh
file = $1
workdir = `dirname $file`
pngfile = `basename $file`
cd $workdir
/path-to-a/a.out $pngfile > ${pngfile}.dat