Skip to main content

HPC作业信息记录表模板教程

有时候我们在唐楼HPC上计算任务,想要较为准确地知道当前计算进展(例如,刚刚提交或者计算结束,又或者多个计算阶段到哪了),但是面临一堆Output文件不停catgrepbpeek很不优雅……

为了比较准确知道自己的作业当前的状态,有很多种方法,集群用户大多是这三种做法:

  1. 方法一(千万别这么干系列):自己写个无限循环的脚本不停查询然后维持校园网外网访问,检测到后通过SMTP给自己发邮件。作为eScience高性能计算交流群的年更节目,此方法几乎没有任何优点,不仅浪费一个校园网终端、邮件有概率被过滤、浪费大量登录节点资源导致其他用户也卡顿,还有可能得到集群管理员姚老师的特!别!关!照!
  2. 方法二:使用bwait命令(详细用法自行搜索)在任务后执行通知,优点是够简单,缺点是登录节点如果出了什么问题,该命令也会失效。
  3. 方法三:直接将通知脚本集成在任务脚本里,放在任务前后执行。

本文将重点介绍方法三。你可能会说,那方法三不还是需要SMTP发邮件吗?

非也,如果你知道以下三个事实:

  • 协同表格(table.nju.edu.cn)和计算节点直接连通,而且同属内网无需登录校园网账号
  • 协同表格支持Webhook/邮件消息通知,其中Webhook包括企业微信机器人钉钉机器人,甚至自定义Webhook
  • 大多数手机系统都已经支持企业微信和钉钉的系统级推送(指无需后台驻留应用也能收到通知

那么你就可以自然想到:通过协同表格的API从HPC计算任务提交信息至表格,然后利用表格自动化实现消息推送提醒;既能统一记录信息,方便后期统计分析计算效率,又可以实时通知,妙啊~

那么,如何实现这一构想呢?

创建表格文件

获取模板

在协同表格的模板页,点击科研-HPC作业信息记录表,使用此模板:

这个模板预设的列名可以不用修改,因为后面的脚本预设的就是这些列名:

创建自动化

首先,打开钉钉或企业微信(本文以企业微信为例),在群聊内创建一个群机器人

创建群机器人

之后,复制Webhook地址

复制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_HOSTSEATABLE_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 "计算结束"

表格上便会获得此消息

当然,根据计算任务不同,你也可以自定义更多的状态信息。表格接收到新的记录提交,便会触发自动化,在手机上相应提醒:

表格本身留下的记录也可以用于一些信息统计——