高性能集群作业信息记录表模板教程
有时候我们在唐楼HPC上计算任务,想要较为准确地知道当前计算进展(例如,刚刚提交或者计算结束,又或者多个计算阶段到哪了),但是面临一堆Output文件不停cat
、grep
、bpeek
很不优雅……
为了比较准确知道自己的作业当前的状态,有很多种方法,集群用户大多是这三种做法:
- 方法一(千万别这么干系列):自己写个无限循环的脚本不停查询然后维持校园网外网访问,检测到后通过SMTP给自己发邮件。作为eScience高性能计算交流群的年更节目,此方法几乎没有任何优点,不仅浪费一个校园网终端、邮件有概率被过滤、浪费大量登录节点资源导致其他用户也卡顿,还有可能得到集群管理员姚老师的特!别!关!照!
- 方法二:使用
bwait
命令(详细用法自行搜索)在任务后执行通知,优点是够简单,缺点是登录节点如果出了什么问题,该命令也会失效。 - 方法三:直接将通知脚本集成在任务脚本里,放在任务前后执行。
本文将重点介绍方法三。你可能会说,那方法三不还是需要SMTP发邮件吗?
非也,如果你知道以下三个事实:
- 协同表格(table.nju.edu.cn)和计算节点直接连通,而且同属内网无需登录校园网账号
- 协同表格支持Webhook/邮件消息通知,其中Webhook包括企业微信机器人和钉钉机器人,甚至自定义Webhook
- 大多数手机系统都已经支持企业微信和钉钉的系统级推送(指无需后台驻留应用也能收到通知)
那么你就可以自然想到:通过协同表格的API从HPC计算任务提交信息至表格,然后利用表格自动化实现消息推送提醒;既能统一记录信息,方便后期统计分析计算效率,又可以实时通知,妙啊~
那么,如何实现这一构想呢?
创建表格文件
获取模板
在协同表格的模板页,点击科研-HPC作业信息记录表,使用此模板:
这个模板预设的列名可以不用修改,因为后面的脚本预设的就是这些列名:
创建自动化
首先,打开钉钉或企业微信(本文以企业微信为例),在群聊内创建一个群机器人
之后,复制Webhook地址
回到之前创建的表格,我们打开第三方集成
可以看见,表格支持发送邮件/企业微信机器人/钉钉机器人。本文我们主要关注机器人,因此邮件就暂时略过了。
在此处,我们添加一个企业微信机器人并粘贴刚才的Webhook地址
测试可以发送消息,即设置完毕。
如果你需要更高级的Webhook触发其他外部工作流来实现更加强大的自动化,可以选择另一种方式
此自定义Webhook会被所有新增、复制、删除、修改行操作触发,并以特定的格式发送消息。详情见官方手册。
打开表格的自动化规则,新增一条规则:
在规则中,我们设置只要新增记录的任务状态列“不是空”,
然后增加一个动作,动作类型为发送企业微信,并选择刚才我们在“第三方集成”创建的那个企业微信机器人
如果你想要“花里胡哨”一些,可以选择Markdown格式,并且按照企业微信机器人官方文档的Markdown格式要求配合{列名}引用的模板语法来撰写。钉钉机器人同理。
下面是一个企业微信机器人的例子:
集群任务新动向:
>任务ID:<font color="warning">**{任务ID}**</font>
>队列信息:**{队列}**
>节点信息:**{节点}**
>任务状态:<font color="info">**{任务状态}**</font>
保存这个自动化规则。至此,自动规则设置完毕。
获取脚本
在eScience的Seatable-Reporter代码仓库中,找到seatable-reporter-LSF.py
文件,这就是脚本了。你可以把这个脚本放置在你的home目录下或其他什么地方,本文示例放置在~
下面。
这个脚本配合上边的模板,什么也不用修改,可以直接拿来用。
使用脚本
获取Base API Token
脚本读取两个重要的环境变量:SEATABLE_HOST
与SEATABLE_BASE_TOKEN
,其中前者对协同表格用户而言填写table.nju.edu.cn
即可,后者需要自行填写之前创建表格的API Token。
API Token的获取方式:
获取后,通过export
命令将上述内容写入环境变量:
# 偷懒的话,可以直接加到`.bashrc`里面去
export SEATABLE_HOST=table.nju.edu.cn
export SEATABLE_BASE_TOKEN=<刚刚获取的API Token>
提交计算任务
由于提交作业之前的alias
无法继承至LSF作业环境里,为了简单起见可以在LSF作业脚本开头写入命令,例如叫mylog
。
在你想要的地方,直接mylog
你想要的信息即可,消息便被发送至协同表格。以下是一个示例LSF作业脚本,
#BSUB -q 7702ib
#BSUB -n 1
alias mylog="python ~/seatable-reporter-LSF.py"
mylog "提交任务"
<your job>
mylog "计算结束"
表格上便会获得此消息
当然,根据计算任务不同,你也可以自定义更多的状态信息。表格接收到新的记录提交,便会触发自动化,在手机上相应提醒:
此外,表格本身留下的记录也可以用于一些信息统计——
结语
本文主要实践通过协同表格与HPC的联动,在纯内网环境实现了低成本的计算任务实况通知。
事实上,类似的自动化案例在eScience的各种服务中比比皆是。得益于eScience多个服务的灵活性,看似不相关的服务平时各司其职;一旦互相协同,就能在小至办公智能化,大至工作自动化的各方面有很大便利。