倏忽间,距离我本科毕业已经过去了三个学期。这一年半里,虽然我作为研究生无法再上场参与超算比赛,但依旧和超算队有着密切的联系,参与了 SC20、ASC20-21、ISC20 和 SC21 这四场比赛的准备。在转换身份后经历的这些比赛,对我来说与上场参赛是完全不同的体验。之前的每场比赛后,我都会花上半天的时间回顾一下整个过程,写一篇总结,包括 ASC19 上 + 下、ISC19、SC19、ISC20(写了标题就是写了!)。而到现在,我已经很久没写过这样的总结了。恰逢 2021 年年末(每个月总有几十天不想科研的日子),又有好几个人在催促我补上总结(在写了在写了.jpg),于是就有了这篇文章。
SC20
SC20 是我进入研究生阶段后面对的第一场比赛。此时超算队的队长是张晨,队员还有杰哥、王雨田(Kina)、宋泽宇、翟明书和钟闰鑫。由于疫情的影响,SC20 的全部赛程都在线上(使用我们的老朋友 Andy Howard 提供的 Azure 云计算服务)进行,并且正式比赛在 SC20 正式会议前一周。SC20 的题目包括常规 Benchmark(HPL、HPCG、IO500)、CESM(怎么又是你)、Gromacs(怎么还是你)、复现(MemXCT)和神秘应用 miniVite。
具体的准备过程按下不表(我也并不了解太多的细节),但在队伍提交完 Final Architecture Proposal 之后(意味着比赛中能用的机型已经确定了),我(想起来问了一下后)突然发现张晨测试用机器的 MPI 性能并不正常,仔细一看是没能用上 IB,再仔细一看是这台机器根本没有 IB 卡。我瞬间就开始紧张,但后来张晨告诉我她把各种机型都写上去了,并且 Andy 确认仅仅限制到 Azure 的粗粒度机型(如写了 NC24 之后就能使用 NC24r,后者是 RDMA capable 的型号)。这才让我松了一口气,提醒他们一定要确认使用了正确的机型和通信库(比如 UCX 和 OpenMPI),并且充分测试性能后再开始使用。
一旦有了性能表现正常的机型,其他的准备过程其实都比较顺利。考虑到比赛有整整 72 小时,同学们需要一个舒适的环境参与比赛,翟老师在学校甲所订了一个大会议室和三个房间供同学们使用。甲所大概是从来没有接待过我们这么奇怪的客户的(不分昼夜连续使用四天,并且不需要会议接待服务),从前台到服务员都反复询问我们究竟是要参加什么奇怪的比赛。为了保证大家舒适,我们从邬老师那里借走了几个显示器,同学们也带去了自己的机械键盘等装备,把会场布置成了高级网吧的样子(如左图)。我还从坏人那里借来了 Go Pro,并用奇怪的方式安装在了会议室顶端的灯罩上,录制了比赛全程的延时摄影留档。为了保证大家能够全身心地投入比赛,我和 aoao 负责了比赛期间的后勤准备,充当了外卖员和大厨的角色,给大家点各种外卖、在房间里准备自热米饭(右图是我们流水线给队员们准备晚饭的场景)。
比赛过程中,我也参与了一些策略的制定,比如从公开数据中观察其他队伍的 quota 使用情况以推断他们的题目完成情况,结合我们的队伍情况,讨论如何分配有限的 quota 给各个题目。由于我们在除 benchmark 的其他题目中都还算顺利, 因此还剩下了相当多的 quota。因此最后我们的决定是把几乎所有剩下的钱都投入 benchmark 中,粗略估计可以获得一个相当高的指标。在开始 benchmark 前(也是比赛结束前的那个晚上),组委会突然宣布了每个队伍额外将获得一些 quota,这当然对我们来说是一个两面的消息,好的一面是我们可以获得更好的性能,而坏的一面时此前猜测的其他队伍的策略可能不再准确了。无论如何,我们已经没有别的方案可选,于是杰哥就用颤抖的手创建了 36 台 4 卡 V100 的机器,开始了 benchmark 的“梭哈”过程。最终我们用 144 卡跑出了 HPL 299.9T(怎会如此.jpg),HPCG 15.81T 的结果,是我在 SCC 中从来没有见过的数字。IO500 由于 MadFS 的加持,也获得了 143.74 分。事实上跑 benchmark 的过程中还出现了一些状况(Spack 使用不当而导致 NFS Server 被挤爆),浪费了一些 quota,否则还可能取得更好的成绩。出于种种考虑,直到比赛结束前我们才提交了 benchmark 的结果,在排行榜上当然也占据了三个项目的榜首。
这次比赛中,还有一段神奇的经历是张晨的特奖答辩。答辩会恰好定在了比赛结束(早上七点)的那天下午,因此她需要在比赛过程中完成题目的同时准备特奖答辩的内容(稿件和 PPT),和她一同负责 CESM 的翟明书当然也作为工具人见证了全过程,不得不说晨特不愧是晨特,最终在 SC 和特奖答辩中,都收获了最好的结果。
SC20 是我们连续第三年取得 SC 冠军,也是超算队第一次(或许很难有下一次)在 SC 所有 benchmark 中取得第一(以及总冠军)。这样的经历当然非常振奋人心,也让我对后续的比赛有了更多的信心。
ASC20-21
ASC20 最终由于疫情顺延,与 ASC21 合并在南方科技大学举办,称为 ASC20-21(这和取消到底有什么区别呢……?)。官方把比赛名字读作 ASC twenty twenty-one,刚好和年份一样,还是有一定迷惑性的。这次的赛题包括 benchmark、脉冲星搜索软件 PRESTO、量子计算模拟 QuEST、AI 赛题、神秘应用 MPAS 和团队应用 VENAS。这次队员组成还是与 SC20 一致;由于 ASC 只允许五位队员上场,因此闰鑫在场外作为替补,我和 aoao 照样前往进行后勤(以及机器安装的相关指导),还有一些九字班同学也一同前往深圳去熟悉比赛的环境。
在经历了一年的 virtual 比赛之后,突然又回到赛场还是给我一种熟悉感的。但有一些令我担心的是,上场的队员们几乎没有接触过真实的集群(都是云平台或者超算),或许缺乏相关的硬件安装与维护经验。但幸好张晨之前在 SC19 的时候有协助过我们安装集群,杰哥也对服务器相关比较熟悉,在出发前我也在我们实验室的机房里简单地培训了一下队员们(例如拆装显卡这些必备的操作技能)。比赛现场,浪潮非常慷慨地提供了新上市的 NF5280M6 服务器,是最新的 Ice Lake SP 平台,配备双路 8358、512GB DDR4-3200 内存、HDR IB 卡。我们自己带了 12 块 A100,我也让队员们要来了更多的内存(不得不说装了 96 条内存的盒子还是非常值钱壮观的),对机器进行改装。不过,浪潮总是不出意料地能给我们一些惊喜。比如 PCIE riser 的卡扣非常难扣上,并且虽然看起来支持三张卡,但怎么插都只能认出来两张(好吧,我们应该相信主办方的),并且走线非常扭曲;比如我们队的 IB 交换机某个风扇损坏了,亮故障灯(让人比较无语的是,浪潮的部分技术人员一开始并不相信我们队员的表述,坚称交换机不可能出问题,最终前往交涉的队员不得不亮明学校名称,他们立刻就派人来看了)。一件比较可怕的事情是第一天 setup 结束之后,杰哥发现原本 head node 的系统盘出现了读写错误(没错,又是 Intel 的企业级 SSD,已经是我遇到的第三块了),还好之前制作了备份(并且不是在比赛中出问题),于是立刻进行了替换。此外,我从宇翔推荐的某个相机租赁平台上借了一台 Go Pro(感谢宇翔不远万里给我人肉闪送),继续对比赛全过程进行记录。
这次比赛中,我受限于非队员身份不能进入场地,只能与同学们“铁窗相望”(隔着体育馆的护栏交流)。这样的经历是非常独特的,我需要了解队员们的大致动向,并和他们充分交流,及时地纠正或者引导比赛的策略。特别是正式比赛第二天,由于翟老师和韩导的时间安排比较紧张,我几乎就完全担任了指导“老师”的角色。好在我给出的大部分建议都没有什么问题,也给大家起到了一定的帮助(比如在 PRESTO 的运行规划上)。
由于机器的限制,ASC 的各个队伍选择的配置都差不多(四机八卡),因此 benchmark 的运行参数和其他应用软件的优化是相当重要的。得益于杰哥之前的充分经验,我们在 HPL 和 HPCG 上都取得了不错的成绩,分别是第二(和第一就差 0.8 T,要是杰哥再卷卷多好)和第一。关于 PRESTO,在赛前我通过一位高中+大学同学联系到了中科院国家天文台的博士生刘丰源同学,由他给超算队进行了长达五个小时的天文学入门讲座,尤其是详细说明了数据分析和搜索脉冲星的过程,让队员们对于软件的计算原理有了充分的了解;明书也对程序进行了充分的 profile。在 QuEST 上,张晨更是借着这一年的时间,彻底重写了底层的计算逻辑,甚至凭借这个工作发表论文并获得了 ICS’21 Best Student Paper,是国内高校首次获此荣誉(不过最终竞赛中的性能还是略差北航一筹,并且也有一些小小失误,但我认为这样的一石二鸟非常值得)。MPAS 与 CESM 同属地球系统模式组件,杰哥和明书在编译运行上都有着比较丰富的经验;虽然花了很长的时间跑完,但我们也成了唯一成功运行完整数据点的队伍。在团队应用 VENAS 中,和我们合作的华科、西工大、乌拉尔联邦大学(特别要赞扬 Alex 同学)都非常给力,协力把应用加速了一个多数量级,并且都完成了运行。看起来一切都很美好,然而我们再一次栽在了 AI 上,并且这次是交了白卷。是的,必须承认,超算队应该对此负绝大部分责任,毕竟确实我们一心做着多机多卡、并行加速的准备,到了现场才发现确实没有能力改正被故意埋下陷阱的模型代码,没能炼成这个奇妙的完型填空丹。这确实不符合组委会某位趾高气扬的女士所言的 ASC 培养 HPC+AI 人才的深谋远略、高屋建瓴的竞赛宗旨,自然也活该是一分不得。但或许高瞻远瞩的组委会也可以认真地思考一下,某些队伍为了这一题专门招募了队员负责炼丹,这就是你们想要的 HPC+AI 吗?ASC17 的时候 ZJU 和 USTC 选择拒绝参赛究竟是因为什么?又为什么另外两个 SCC 比赛(尽管你们坚定地声称「我们不需要和它们学习」,对此我当然也同意,毕竟每个比赛都应该形成自己独特的风格)就没有发生过这样的事情呢?
于是就像两年前一样,我们又获得了 ASC (onsite 组)的亚军(还有一组队伍在线竞赛,新竹清华获胜)。此外,还获得了 e Prize(PRESTO)、应用创新奖(MPAS)与团队应用奖。不得不说结果是确实有些令人遗憾的,但我想我们所有人已经尽力了。这次在南科大还有一个意外收获,是我们队和薛其坤校长的合影(但因为我在角落畸变有些严重,就不放出来了 🙈)。
招生宣传片
今年的 ASC 结束之后,有一个小小的插曲。翟老师找到我们一些老队员(包括我、张晨、王邈),说学校想以超算队为原型拍一部招生宣传片,希望我们能加以协助。因为我当时实在是很忙,主要的对接工作都是由 shanker 负责的。虽然宣传片为了故事性和宣传效果,免不了有改变和夸张的成分,但我们都希望避免其中的任何科学和事实错误。shanker 在前期就超算比赛的形式和内容,以及他自己的经历,和狄迪导演带领的团队进行了多次充分的交流,最终敲定了他们 SC15 夺冠的故事作为主要拍摄内容,突出比赛中遇到的一些波折。为了尽量贴近真实比赛,shanker 甚至找到了原来的 Grafana 数据,我也帮忙运行了当时的一些真实程序,提供了一些屏幕录像和日志(尽管大概没有人会注意到片中屏幕上滚过的字),以及一些真实的服务器硬件。最终呈现在所有人面前的,就是这部《破壁少年》。
当然,它和以往每年的宣传片一样,在收获眼球的同时也会引起争议、招致批评。往年的我也会觉得这类宣传片或多或少有一些过于主旋律或者“红专”的感觉,或者太过故事化、戏剧化(两个例子是 2020 年的《追光少年》和隔壁多年前的《星空日记》)但当我成为了它刻画的群体的一部分,也真正参与到从设想到落实情节到最终拍摄过程中时,对它还是会有不同的体会。虽然受限于种种因素,不大可能完整呈现真实的比赛过程,我们当然也没有片中塑造的人物那样有着坚定而宏伟的追求;但至少在情节和演绎上,《破壁少年》是我能认可的。
SC21 Proposal
同样在 ASC 之后的一个平凡的早上,明书告诉我们:今年 SC 的 proposal 被拒绝了,也就是说,我们无法通过正常的方式参加 SC21 SCC 了。这个消息就像晴天霹雳,要知道上次被拒还是 SC16 的事情,已经过去了五年。稍后具体评分出来的时候,我们一下子明白了原因,有一位评委在 Diversity 这个评分点上给我们打了一个奇低的分数,理由大概是“你们在顾左右而言它,说的这些有的没的都不是真正的 diversity”。同样获得低分的还有国内的其他几支队伍,其中也包括了 USTC。
我们需要承认,在 SCC committee 相当重视的 diversity 这一方面,我们(以及中国大陆的很多其他学校)确实存在显著的不足——队员的男性比例很高(很多时候甚至是无穷大),也没有组委会想看到的其他任何因素(比如不同的性取向、少数族裔等,即通常认识下的 underrepresented groups),因此只能在这里尽力寻找一些其他的内容进行填充 ,或许也正是因此被某些评委所反感。有同学开玩笑说只要声称自己是 gay,或许能获得更高的分数——我们当然绝对不可能这么做,但也反映了在现状下大家对评分标准的无奈。我不想在博客这样的公众场合对这一极其容易引起争议的话题发表更多的评论,因此只能对此表示遗憾。如果无法改变这一标准,倒不如大方地承认我们就是 privileged majority,也不必在编造奇怪的 diversity 理由上煞费苦心。不过,好在我们并非完全失去了参加 SC 的机会,三大超算竞赛向来有邀请其他两个比赛的冠军参与的传统。既然 ASC 输了,那么 ISC 就是我们唯一的希望了。
ISC21
按照惯例,ISC 总是紧随 ASC 之后。今年的 ISC 当然和 ISC20 一样是线上的,队员也没有发生变化。与前一年只使用新加坡的 NSCC 超算不同,今年还多了一个加拿大的 Niagara 超算,两者分别使用 PBS 和 SLURM 作为调度器,配置略有不同。与 ISC20 还有一个不同是,ISC21 要求在集群上运行 benchmark,包括不计分的 HPL,以及计分的 HPCG,还有 ISC 传统项目 HPCC。其他应用包括两个老朋友天气预报 WRF、分子动力学模拟 LAMMPS,以及原子模拟 GPAW、基因组组装 MetaHipMer,还有 ISC 独创的 Coding Challenge(今年是优化一个 MPI 集合通信的 profiler)。
这次 ISC 给我带来的最大震撼可能是 NSCC 集群上我们去年的账号(以及 home 里的所有文件)还在,但被分配给了其他队伍。我们发现这一事实还是因为杰哥发现今年被分配的账号里有其他队伍的文件,于是进一步尝试发现甚至可以用去年埋得公钥直接登录老账号……大家一阵冷汗之后立刻删掉了我们留下的所有文件并立刻跑路,并且告知了组委会。Ophir 则淡定地表示,“啊居然还有这回事,我会清理的”。
由于超算集群和云服务器显著的区别(前者限制机时但可以任意提交,后者只要开机就烧钱),ISC 和 SC 的比赛策略也是截然不同的。同时由于 ISC 转为线上之后,比赛周期拉得很长(有两个多星期),大家同时也有许多别的事情(比如晨特还要准备毕设,大三的同学还有期末考试),因此很容易就在比赛中开始摸鱼。再考虑到 ISC 的结果还会影响到 SC,因此我在比赛中更多地担任了 pusher 的角色,有事没事就 push 各位队员(当然包括队长)干活。事实证明我的角色还是起了一些作用,比如明书被我用(后来证明是错误的)别的队伍的奇高的 WRF 成绩虚晃一枪后,一咬牙花了一整天卷出了一个相当好的结果。再比如我持续 push 晨特修改 CPU 和 GPU 上的 HPCC(因为 Niagara 只能用 CPU),提供了一些十分阴间有趣的编程技巧,最后也跑出了挺好的分数。
总体来说,ISC21 整体都比较顺利,结果也没有出乎我们意料:冠军 + HPL 最高。由此,我们重新获得了 SC21 的入场券。这次比赛也是晨特、杰哥、Kina 这三个大四队员的收官战,他们这一届超算队获得了两个冠军、一个亚军,远远超出我们大四的成果(SC 冠军、ASC 取消、ISC 季军)。
暑假实践
2021 年恰逢清华大学计算机系对口支援青海大学计算机系二十年,黄建强老师指导的青海大学超算队也邀请我们前去交流。借此机会,新任队长翟明书组织了“六十年的破壁故事”实践分队,带着超算队的同学们和一些实验室的、系里的其他同学前往青海开展了实践。在与老师们的大部队在青海大学会合前,我们前往石油小镇冷湖进行了参观学习,拜访了海拔 4200 米的赛什腾山顶上的多个在建的天文基地,并和在那里参加研讨会的中科大老师进行了交流。顺便提一句,出发当天我因为东主楼倒闸几乎一夜没睡,早上四点多出发,坐六点半的飞机到敦煌后,驱车数小时赶到冷湖,又立刻上到山顶,晚上进行访谈,一直到十一点多才休息。我因为没休息好加高原反应头疼了一整天。此后,我们也到清华研究生支教团所在的湟中一中开展了短暂的支教,给同学们普及了高性能计算的基础知识。
实践的七天是短暂的,我其实也没有太多的感想可说。但真正看到上一代人筚路蓝缕艰苦奋斗的环境后,我意识到把我们称作“破壁”其实并不恰当——我们衣食无忧地用着几乎最先进的高性能计算设备,与六十年前的条件根本没有可比性。这些其实让我想到了三年前对吴文虎教授的访谈,他口中的中国第一代计算机人,也同样是白手起家、艰苦创业——或许他们才是真正的“破壁人”吧。
SC21
又来到了秋季学期,SC21 如期而至。虽然此前通知说会分线上线下两场赛事,最终 SC21 SCC 还是只保留了云端(依旧是 Azure)的比赛形式,仅剩的一支到达展会现场的队伍也只是在现场连接云服务器而已(这未免也太搞笑了)。由于七字班同学全部退役(当然,这次比赛也要靠他们作为外援的主力),本次上场队员又补充了一位来自八字班(融凯源)和三位来自九字班(朱昱熹、任彦羽、曹隽诚)的新鲜血液。其中 Nick Cao 同学是我九月份从 TUNA 拉来的集群运维(只要读过我这一系列文章,想必大家都知道这个角色是不可或缺的),在比赛中发挥了重要的作用。SC21 SCC 的题目包括经典的三大 benchmark、心脏模拟 Cardioid(曾经获得 GB Finalist)、复现题 ramBLe、(老朋友)电子结构模拟 Quantum ESPRESSO,以及神秘应用 Cosmic Tagger。
有了去年的经验,SC21 的准备工作也比较顺利,除了——我又偶然发现多机通信的性能还是不对。于是我又把 SC20 时候的各类问题又拿出来强调了一下,尤其是如何快速地在云环境中配置好显卡、IB 卡等硬件(由此可见保证经验的可靠传递是非常关键的)。虽然比赛从 72 小时缩短到了 48 小时,但还是一场鏖战。我们按照去年的经验,继续在甲所租用了会议室和房间。而这一次,我们甚至不需要和工作人员解释我们的意图,因为他们都还记得去年的情况(想想也是,还有谁会有这么奇怪的用途呢?)。照例是租用了板车搬运屋子,在比赛前一天下午布置场地。我在帮队员们搭建回实验室网络的隧道时踩了一些 WireGuard 和 L2TP 配合使用时链路 MTU 不对应的坑(遇到了经典的能 ping 但不能打开网页的症状),花了好一段时间才解决。这一次也照例继续拍赛况的摄延时摄影,我用了新买的 DJI Action 2 来替代比较坏人陈旧的 Go Pro,画质有了比较大的提升。
虽然我不再负责后勤工作,当然也不能上手操作集群,比赛过程中我还是在甲所停留了比较长的一段时间,不过也忙里偷闲在第一个白天去驾校考了科目三、四并领到了驾驶证。麻烦的情况主要出现在第二天中午之后,此时大家发现事实上 Andy 承诺提供的性价比很高的八卡 A100 全场只有八台可用,需要等别的队伍释放之后才能申请。并且或许由于策略问题,只有按照集群模式申请的多机之间才能通信,如果独立申请单机,则 IB 完全不通。此时我们尚且剩下较多 quota,原本的策略就是使用八卡机来运行程序和 benchmark 以求更好的性能。但认识到这一情况之后,我们只能被迫改变策略。一方面,八卡机还是要试着开的,万一有了当然就赚了;另一方面,也要做好开不出机器的准备——那就只能 fallback 到性价比低的 V100 机器了。于是队员们一直盯着其他队伍的 burn rate,就等着有其他队伍释放;而我则饶有兴致紧张地在旁边围观,也希望能出现奇迹。但,奇迹终究没有发生。于是到早上六点距离比赛结束还有半小时的时候,我们被迫提交了 212T 的 HPL 和 7.58T 的 HPCG,这已经是我们用手头的 quota 和机器能够获得的最好水平了。虽然我们的成绩在榜首也停留了一段时间,但比赛结束前五分钟,南科大无情地粉碎了我们的幻想,交出了 280T 的 HPL 和 10.4T 的 HPCG——很显然,他们抢到了八卡的集群。后续问他们队长时,他表示秘诀就是坚持——他一个人点了好几个小时,皇天不负有心人。在 IO500 上,我们依靠 rjgg 的 MadFS 升级版加持,取得了 570 的成绩,没有意外依旧取得了第一。不过有趣的是,至今为止三年的 SC SCC 中,IO500 所有成绩的前三分别来自 2021 年、2020 年、2019 年的清华超算队;也就是说,至今还没有队伍跑出了超过我第 19 年(发着烧)用一块 P4618 在没有 MadFS 加持的情况下胡乱跑出的分数。虽然我知道这完全只是运气罢了,不过也还是有一些小小的得意的。
虽然 benchmark 的结果不甚理想,我们在其他题目上的发挥也还算稳定,因此最终还是取得了总成绩第一,也是在 SC SCC 中的四连冠,并因此(继 18 年获得大满贯后)再一次得到了国内媒体的一些关注。我们都知道,这次的冠军同样来之不易。从最初 proposal 被拒,到比赛最后一晚大家一起熬穿的夜晚,再到最终与第二名相差不多的总成绩,无不提醒着我们这一事实。不管怎样,今年两冠一亚的成绩还是相当不错的,当然也不完美——但又有什么事情总是能如愿而不留遗憾呢?
总结
不知不觉间,又写了洋洋洒洒数千字的流水账。这些零碎的内容大概不会对其他人有任何帮助,只是对我过去一年在超算比赛中种种经历和感想的不完整但真实的记录。作为已经退役的队员,我们之所以还愿意“用爱发电”,当然也出自于对超算队这个集体的感情、对超算比赛的热爱。经历了这么多次作为“指导”身份参与的比赛后,我最深的体会还是要做好传承。除了在具体的技能传授,更重要的是一种状态上的引领:要让新队员们真正地热爱超算比赛、享受比赛的过程,而不是仅仅为了一个好看的性能数字或者最终的排名;要让大家主动去想“我还能做什么”,而不是被分配任务之后机械地完成。现在 virtual 的比赛很难给人现场比赛那样紧张刺激而又热烈的真实气氛,也很少有队伍间真实可感的互动(通常指向其他队伍大量赠送 TUNA 贴纸)与互相交流的机会。别无他法,希望疫情早日过去,还所有人一个熟悉而可爱的世界。
掐指一算,从我 2018 年秋季学期初次摸到超算队的集群(然后立刻搞挂了系统,借此学会了 ),已经有三年有余,从不知道如何跑 MPI 的新手队员,到熟练的集群运维,再到队长带队参赛,最后作为指导,我的身份发生了多重的变化,也对超算比赛的方方面面有了充分的体验和感触。在 2021 年即将结束的时候我写下这篇总结,也是想选择(与其他很多事一样)move on,走出舒适区,去探索新的领域。或许我不会再以上面的任何一种身份参与比赛了,但我将一直为我是清华超算队的一员而自豪。zfs rollback