跳转至

ASC 22-23 回忆录

写在前面

这是一篇关于 ASC 22-23 的回忆录,出于技术保密的考虑,几乎没有任何技术干货,只是我的一些碎碎念。

ASC 22-23 在中国科学技术大学举行,我作为初次参与 ASC 的新人,很幸运的一路来到了决赛现场。

在本届比赛之前,学校并没有一个具体的超算队概念。而是济南超级计算技术研究院和数学与统计学院有深入的合作,从 AIDC 组织遴选了一些有能力的同学来参与相关的的比赛。而我作为 QLU 网络运维(后来单独分离出网络与高性能计算协会)的成员,得到了奇妙熟人关系的推荐和介绍,光速走完流程加入了 AIDC,并顺利的被遴选成为有资格参与 ASC22-23 竞赛的队员。

在参加这个比赛之前,我更多的是做一些网络安全和算法相关的东西,外加从 QLU 网络运维那边得到的 Linux Ops 和集群组建运维的能力。可以说我在 HPC 这个领域算是彻底的小白。在确定了 ASC22-23 的参赛资格后,我在短时间内速成了基本的体系结构和 CUDA 编程、MPI、OpenMP,以及部分高端设备(A100 和 InfiniBand Switch/HCA)的软硬件组建调试能力。

在此必须要感谢拉我上车的好哥们儿,例如旭哥、烁哥以及涛哥,也必须要感谢济南超级计算技术研究院/国家超算济南中心为我们提供的强大经费和先进资源 (括号大学万岁)

决赛?寄点换的!

ASC 作为一个不受我校重视的野鸡比赛 (?) 我们作为参赛队员,无法得到任何校方行政方案的支持。换句话说,在济南超算那边备赛以及出席决赛现场,是没办法顺利请下假的。我作为一个生物工程专业的学生 (你没看错,但这是另外一个故事),更无法被学院理解并给予支持。于是我就只能请了一些同学代我签到。这个学期还好死不死的有什么工程实训之类的课程。在课堂测试和期中都摆烂的情况下,我的平时分不出意料的大寄特寄。而我大部分的时间也放到备赛,几乎没有看过课程内容,所以即使比完赛回校突击学习,也没能避免挂科一门、其余课程勉强及格的悲剧。

好在生物工程的课程对于我今后的发展影响不大,我只需要吃一些重修的苦头,拿到毕业证就行了。

分工?软硬一把梭!

当时能被拉进队伍,或许只是看中了我 Linux Ops 和集群组建运维的能力。所以我一开始的角色定位是队伍的软硬件维护。

我之前更多的是接触一些网络路由交换设备和普通业务服务器,对于 ASC 比赛的硬件配置,不能说是很熟悉,但也不算陌生。在手欠搞断一根 Riser 卡的 PCIe 卡扣后,我彻底玩明白了浪潮 5280M6。最大的感受就是浪潮的工业设计、技术资料、以及软硬件都可以说是一塌糊涂。我三番五次被浪潮搞得心态破防,无时不刻不在想念 DELL 和 HPE,但对于国产服务器来说,确实算勉强凑合,毕竟要求不能太高。

浪潮为年幼的我来了一点草台班子震撼

从上手这几台服务器开始,我几乎每天都被浪潮搞得崩溃。 在装系统的时候,我注意到 VGA 显示器总是没有信号输出,或者是键盘无法输入按键,USB 安装盘也时好时坏。这种事情显然是不科学的,我首先选择充分信任看上去 (实际上也) 崭新的硬件,转而从自己身上寻找原因。我更换了新键盘后,U 盘居然不认了;搞来新 U 盘后,显示器居然黑了。

坏了!见鬼了!

我不得不怀疑是接口的问题,于是重新整理线缆,绕到机器后面,把显示器插进了后面版 VGA。突然映出的系统安装界面让我感到视线模糊。 突然,一个大胆的猜想在我心中浮现。我快步跑到前面拔掉键盘 USB 线,然后把后面的 VGA 重新插回前面板,显示器画面还是那么的亮。然后我颤抖着把键盘插进了后面版 USB,按了下回车————安装流程切入了下一页。 我在其余几个节点尝试了上述的操作,居然完美复现。

破案了,浪潮前面板的两个 USB 口和一个 VGA 口由于供电设计,居然不能同时使用!在浪潮用户手册和技术白皮书中,没有任何提及!一瞬间我对整个世界都产生了深深的怀疑,草台班子论在我年幼的心中生根发芽。

在后面的几天,我又被浪潮的 bios bug 坑惨,即使妥善的设置好了启动选项,但一台特定的机器在重启后会随机的自动进入 bios 设置,无法在不干预的情况下进入系统... 我抽出机器的保修卡,SN 号码是九个 9。我沉默着塞了回去。

令人心累又兴奋的 MLX

得益于 Mellanox/NVIDIA 完备的资料和网络资源,我很顺利的装好了之前从未摸过的 InfiniBand HPC 全家桶。理论上,只需要用线缆连接到 IB Switch 就可以愉快的感受 MLX 科技了! 成功分清 QSFP56 的正反面后,我很快接好了线缆。淡蓝绿的初音色主动光缆和粗大的 connector 似乎在向我宣示金钱就是性能。

然而在漫长的等待和满怀希望的重启之后,ib ststus 显示端口始终处于 pooling 状态,无法转入期望中的 Active。

为了确认是硬件的问题还是驱动的问题,我 P2P 直连了两个节点上的 HCA,发现成功握手到 200Gbps,尝试了一下跨节点的 MPI 通讯也是可以跑起来的。基本确认是中间的 IB Switch 有问题。最终我到处查找资料和调试,发现是从济南超算备件仓库拉出来的崭新出厂 QM8790 并不认识我们用的 HDR 100Gbps 主动光缆。因为正经的 HDR 是 200G,HDR 100G 的规格是后来才诞生的。所以我们只需要给交换机升级到最新的系统就万事大吉了! 问题就在于,如何给交换机升级系统呢?MLX/NVIDIA 的文档告诉我们,升级系统很简单,只需要在节点侧使用线缆连接交换机,就可以用特定的工具 burn firmware 了。

很好。我看着手中仅有的 100Gbps 主动光缆,回忆了一下我为什么要升级系统。 在仔细端详了 QM8790 充满接口洞洞的机身后,我愣是没研究出还有什么能够 workaround 的方法,因为 QM8790 的确没有什么带外管理的方式。理论上机身上的 I2C MicroUSB 能用来烧录系统,但是找到能用的烧录线比找一根兼容的 IB 线缆还难。

于是我在偌大的超算中心到处借 HDR200 或者向前兼容的线缆,一番努力后,我从算网团队那边借到了一根 EDR 铜缆。我感叹了一下主动光缆真是好文明后,把粗大笨重难以弯折的铜缆接入了 IB Switch。这根铜缆成功握手连接并完成升级交换机系统的重任后,被我送还原有的位置。

I'm Benchmark Man

后来 HPL 和 HPCG 的任务给了我,在队伍成员没有任何 ASC 经历、也没有任何前辈留下的经验资料的情况下,我只能从 CPU 的 hpl 和 hpcg 开始,写脚本自动跑各种不同的配置参数,得到了最好的参数组合。

而 GPU 上的 HPL 和 HPCG 就难搞了。一开始,我像无头苍蝇一样,找到了远古的 fermi-hpl,经过了各种修补,在 A100 上成功的跑了起来。但性能远不及理论水平。由于我们都没有经验,我们参考到上一届 ASC21 决赛现场,中山大学使用与我们相同的四机八卡配置跑出了 79.04TFlops 的 HPL 成绩,于是我将其作为我们的基线。

我尝试动手魔改 fermi-hpl,迫于速成的 CUDA 编程能力,没有成功取得显著的效果。然后只好到处 PY,得到了 NV 交付济南超算时附带的一版需要保密的 benchmark 套件,只是在我们的机器拓扑跑起来,需要动手魔改一些东西。 虽然用起来的过程中也是经历了一些坎坷,比如 UCX 配置、算子库和 NVSHMEM 之类的套件都需要手动调优。但我至少得到了能看的成绩,接下来的问题就是如何在限制 3KW 功耗的情况下取得好成绩。

具体手段还是要保密的,毕竟 HPL/HPCG 是每年的固定赛题。但大概的方向其实就那么几个,无非就是想尽办法榨干功耗性能,从不必要的地方节约每一瓦特的功率。就是看细心程度了。 在我无所不用其极的功耗调教和优化手段下,我们成功在四机八卡 3KW 的限制下,跑出了超越去年 The Highest Linpack 的性能记录。我不禁暗暗幻想能否有机会为初次参赛就进入决赛的队伍拿下一个单项奖...

在决赛现场,Jack Dongarra 老爷子采访我在队伍中的职责,我说了一通 Cluster building and Operation、Linpack、HPCG 之类...老爷子消化了一下,说:“oh,you are the benchmark man!”

我大悟。

好像也不仅是 Benchmark

队友都是数学与统计学院出身的人工智能和最优化理论大佬,但我校的本科生教育规划中的确是缺少一些必要的东西 (The Missing Semester of Your CS Education - MIT).

当我看到队友参照不多的中文教程资料,使用上古 gcc,以一种奇怪的配置构建 WRF,并屡屡受挫时,就觉得是时候给大家安利 Intel 科技了。我在微信群里向队友扔出各种 oneAPI 环境魔咒、Intel Complier Flag 和 Intel MPI with NVIDIA HCOOL 施法咒语,没有任何解释,只是告诉他们,把咒语粘进去就会快!

后来我觉得这样做实在是太折磨队友了,就配置好了 slurm,写了几版 sbatch 文件。当队友在写 CUDA Fortran 时,我就在捣鼓 Makefile 和 Vtune,力求让队友集中于优化本身,而不是恼人的 building&profiling。

在 deepmd 和 yuan 方面,由于备赛过程中各种各样的原因,我没有仔细去跟进队友的进度和操作,结果在某些方面坑了队友一手,这的确是我的问题,细节我放到下面再讲。

科大?我素未谋面的母校!

在经历一个多月紧张又刺激的备赛后,我们收拾好了东西,整装前往合肥。

值得一提的是,八张 A100/A800 交由我来保管并运输至合肥。我仔细计算了一下这八张卡的价值,将近一百万了。如果稍有疏漏,我恐怕要给研究院打一辈子的白工了。 由于缺少合适的保护容器,我决定先把 GPU 套好静电袋,然后塞进 30 寸的小米行李箱,空隙填满从顺丰搞来的泡泡纸和气泡柱。然后又把这个小米行李箱装进四十寸的国家地理行李箱(套娃),空隙依然塞满泡泡纸。

为了保险,我还在两个箱子之间放进去一个 AirTag,并设定了人卡分离十米范围就会自动 爆炸 报警。

我和女朋友提前一天到达了高铁站附近,定了一家酒店,晚上狂吃了一通,但没有其余的运动项目,因为我整夜满脑子都想着比赛的事情,几乎没怎么睡。第二天一早我就道别女友,拉着一百万的行李箱走进了站厅。 虽然这一通操作真的很抽象,但卡是的的确确被我完好无损的运到了合肥,期间只有高铁站的安检人员看了 X 光后露出了一瞬间的疑惑,好在最终还是放过了我,没有要求我在大庭广众之下开箱检查,否则画面一定很美。

几个小时的高铁后,我们到达了合肥站,接我们的是来自科大的志愿者,途中得知,我们是除科大本校外,最快抵达合肥的队伍。但几乎没有预想中的媒体场面,因为他们的主力都在机场等待 TOP 高校队伍抵达,我们带专确实是不配。

到了江南春酒店后,我们完成了签到和物资的领取。 在房间里调戏了一阵酒店自带的天猫精灵,并床上躺了一会。然后收到快递电话,定制的贴纸被送到了江南春酒店,我就下去取了快递,并遇到了北航和暨南的队员们。一开始还稍微有点社恐,不敢上去 social,后来涛哥直接上去一顿尬聊,我也凑过去膜拜了大佬们。我们几支队伍在大堂休息厅等待配合组委会媒体进行队伍快闪的摄制。

录完很尬的快闪后,我们在科大的几个校区之间穿梭了一番,看到了 ASC 的展板,一时兴起拍了几张照。看着工带校徽出现在一众梦幻级别的高校之间,心中还是有那么些得意的。期间遇到了中山大学的队伍来拍照,虽然依旧社恐,但还是斗胆上前,希望能和吴坎老师合一张照。因为吴坎老师算是参加 ASC 的老前辈,他的工作 (An implementation of HPL-AI Mixed-Precision Benchmark based on hpl-2.3) 也给备赛过程中的我带来了极大的震撼。可惜中山大学的同学们告诉我吴坎老师不在,所以没能达成心愿。

由于我是 QLU Mirrors 的站长,所以提前结识了很多高校超算队的队员和顾问,晚上我就跟 USTC lug 和 TUNA 的人社交了一波,并一起去场馆偷看了一下。发现志愿者们还在加班装鸡架和机器,部署弱电线缆等。后来看了眼手机才知道,我们的队友被主办方媒体拉走上镜了宣传片。

然后我意识到由于长期在研究院闭门不出的备赛,我的头发已经不成体统了,掏出手机在 USTC lug 的群里面问了下有什么剪头发的好去处。Taoky 推荐西区本科生一号楼下的理发店,我便去了。理发店不大,店主是一位极有气质的老先生,我的出现破坏了他打算闭店回家的计划。我胡乱表述了一下发型的要求后,店主开始为我剪发。过程中他看到我穿着的赛服,得知我是从济南来科大比赛的。就开始查户口式的尬聊,从济南一路谈到高性能计算。

回到酒店后,感叹了一下科大校园确实够顶级,校园文化也极有亲和力,竟没有身处异乡之感。算是素未谋面的母校了。

DAY1 组建集群

觉没睡醒,咖啡风味过于上流。

不得不说,九点开赛,加上我们不熟悉路,提前了一个半小时起床,根本没睡醒。我几乎是闭着眼糊弄完了早餐。Day1 和 Day2 都是集群组建,我的环节,绝对不能给队友掉链子的。于是跑到大堂吧台点了一杯浓缩美式不加糖,我看着店员熟练的拼配了几种不太成样子的咖啡豆,丢进了研磨机,心想着高端酒店确实上流哈。到手就喝了一口,我的中枢神经立刻产生了中毒催吐的反射,看似人畜无害的拼配组合,居然集齐了一杯咖啡所能附带的全部不良风味。过深的烘焙和不太对劲的豆子品种爆发出惊人咋舌的腐败气息和发酵酸涩。

我当着店员的面体面的咽下了这口魔幻的液体,微笑后扭头逃出了酒店。不得不说,确实挺提神的。我只能用自身见识浅薄以至于无法欣赏上流风味的借口安慰我的钱包。

队友拿来品尝了一口,脸上露出了骇人的神情,“三天前的呕吐物”,他如此评价。

我们就这样拉着套娃行李箱、端着咖啡,签完到走进了场馆。找到了工带校徽,开始施工组建集群。撇了一眼,发现东道主就在我们隔壁。

事故频发的集群组建。

相对于其他队伍来说,我们的物理机经验可以说是无人能及,毕竟常驻了很长一阵子济南超算。我和队友光速配置好了四个节点,发现场馆内别的高校还在研究 Riser 卡,不禁大为得意。我双手叉腰,盘算着剩余的时间是不是可以先跑跑 hpl、处理一下 Yuan 的数据。

我决定先测试一下 slurm 是否正常工作,熟练的启动了四机八卡的 hpl,短暂的装载过程结束后,理论上应该出现的计算 log 没有出现,取而代之的是满屏幕的红色 Error。果不其然还是出锅了,我定睛一看,发现是 GPU 任务分配出了问题。敲下 nvidia-smi 后,四个节点只展示了七张显卡。

我的冷汗顺着脊梁就开始流,因为每台节点装完后都检查过 GPU 的状态,明明刚才读的到的啊...

我 gerp 了一下 lscpi,发现辣么大一张 A800,真的凭空消失了。我竭力保持冷静,查了一下白皮书的 pci id 和槽位对应情况,断电掀开机盖准备重新插拔一下 GPU 卡。拆卡的时候留意了一下,发现没有任何的虚位和接触不良迹象,但只能死马当活马医,插拔后按下了电源键。漫长的等待后,nvidia-smi 和 lspci 依旧是只有一张卡。

这可坏事了!我赶紧再次断电掀开机盖,交换了一下两张 GPU。上电开机,果不其然还是只有一张,但是我们确认了是右侧 Riser 槽位不能读卡。我跑到浪潮那边扯皮一通,发现他们没有可供替换的 Riser 卡,但是可以从备用机器上拔一个下来。

我急眼了,说不用拆了,直接换整机!

等待新机器搬来的过程中,我绕着场馆偷看了一圈,似乎听到不少队伍都在抱怨右侧 Riser 不读卡...浪潮的工程师过来考察故障的时候,我小声问了下,“5280 出货量这么大,应该不会有品控问题的吧?”浪潮的人信誓旦旦的说:”绝对没问题的,一定是你们安装不当导致不读卡“。我回忆了几个月来被浪潮机器无数次迫害的场景,默声不语。

换好新机器后,终于能读到卡了。我再三确认了所有的驱动、软件栈和文件系统正常工作后,调了一下自动读取和控制功耗的脚本,配置好了局域网 BMC 和 SSH。队友开始调试赛题,我开始利用 hpl 测试赛场环境的硬件功耗性能曲线跟备赛时的区别。 我当时在想, 只要 hpl 能跑起来,就代表 CPU、GPU、MEM 乃至 HPC 套件都能正常工作了吧... 没想到一瞬之念在几天后成为灾难上演在决赛现场。

期间兰州大学、哈工深、上交、南科的好兄弟和我们交流了一波团队赛题。不知为什么,赛方提供的资料“强烈建议使用 slurm 进行任务提交”。而超级团队中的高校似乎只有我们实际部署了 slurm。 我看了眼团队应用,是一个抽象的量子线路模拟,我评估了一下认为确实没啥必要上 slurm...脚本启动又快又好,真的没必要去费时间在好几个节点上部署 slurm。

当时还没有了解到 slurm 的无配置部署方式,但后来想想,就算是用无配置部署各个节点的 slurm,所耗费的时间和得到的回报也是得不偿失的。只是没想到阻止大家真的部署 slurm 就是我们对超级团队赛题作出的唯一贡献了。

我看到大家都在不限制功耗的暴力烤鸡,打算也来一发,看看工带校徽被超功耗警告的红框锁定是什么样子。刚准备试的时候,隔壁科大居然断电了。 ”这么变态吗?“我心想,“难道超功耗时间过长就会被拉闸?” 我跑过去围观了一下发现工作人员和科大运维在研究 PDU,似乎是预期之外的故障。我为东道主遭遇的不幸感到悲伤,然后回到工位继续调试 hpl,然后回车 run 了一发。

工大的校徽瞬间红温,伴随超功耗的警报声。我和队友掏出手机准备拍照发个朋友圈,结果还没来得及对焦,工带下面的功耗读数显示为 0W,我扭头一看,发现机器断电了。

工大校徽恢复了健康的绿色,我红温了。

我赶紧跑到科大老哥那边,请教了一下他们是怎么解决断电的。他们告诉我,赛场的 PDU 十二个插孔分配到了三个供电模块,需要分散机器电源的插孔位置,将负载均摊到三个供电模块才行。我立刻照做,然后成功跑过了 hpl。

中间好像并没有做什么记忆深刻的事情了,调好机器后,队友测试赛题,我出去偷吃了不少小蛋糕。 第一天的比赛时间接近尾声,我们给机器关机断电,带着东西沿着场馆往外走。之前在别人的博客里听说过一些奇妙的传闻,就特意观察了每个队伍的机器,发现这次没有树莓派挂在鸡架上。

比赛结束后,队友均表示要在房间开摆,点了外卖。我约了几个 USTC lug 的同学在外面吃了点,跑到科大校园里闲逛了一下。结果到最后手机没电,没办法导航,又不好意思说迷路了,只能沿着围墙一直转,转到了一个只能能送外卖进来的铁门,我看四下无人打算钻出去,结果被保安当场捉到,并指引了我正确的出口。

我终于回到了酒店,充了一会电后,顿觉口渴,跑出来去酒店对面的便利店买了两瓶椰汁回来,路上差点儿被电摩撞到。

DAY2 还是组建集群

第二天,我依旧是没睡醒。但是经过昨天一天的品味,我已经充分适应酒店出品的咖啡了。依旧是美式浓缩不加糖,主打的就是一个提神醒脑。

暴风雨前的宁静

我发现决赛现场的硬件配置与我们在家调试的机器有较大的差异。于是我重新匹配了功耗限制脚本的几个超参数,然后闲的没事逛了下 NVIDIA Networking,发现 MLX OFED 今天居然发布了新版本。

我闷声做大事,全部升级一通后跑了一发 ib_send_bw 和一发 hpl,发现有 5% 左右的性能提升。我就继续查看其他组件有没有近期没注意到的更新,一看不知道,居然还不少,我全部升级到最新的版本后,评估了一下限制功耗后的 linpack 成绩应当比备赛时测出的成绩好很多。然后我们看到浙大还在他们的鸡架上装装卸卸,还搬上了一个不得了的大机柜。我们让老板过去偷看下,老板回来告诉我们浙大搞了个大矿机,一机八卡走 PCIe 拓展柜,其他队伍也有不少是采用了三机九卡的配置。

在这之前我还满怀期望能有机会拿下 Linpack 单项奖,因为我们确实做了极致的优化,在相同的硬件情况下,有足够的信心取得领先。但大家都用三机九卡和一机八卡的情况下,我们的能耗就处于下风。老板说他想办法去 PY 一点卡回来,不行我们也搞三机九卡。

老板去找了科大的熟人以及附近的厂商,说如果能拿到卡也是下午五六点钟了。我算了一下时间,考虑到浪潮机器的因素,两个多小时进行硬件的大改动不太现实,要是今天是集群组建调试的最后一天,要是硬件出锅可就彻底翻车了。于是我和老板说了一下情况,决定继续采用四机八卡的构型。

后来想想,备赛期间没能想到三机九卡的构型,有这么几个原因。第一点就是过度参考了为数不多的 ASC 资料和传闻,想当然的认为之前大家一直用的四机八卡 A100 就是最合理的配置,然后就是我们在济南超算用的定制版 5280M6 和决赛现场用的 5280M6 有细微的差别,Riser 卡和主版接口是不一样的。济南超算的机型缺少中间 GPU Riser 卡,只能放两张卡。所以我就没想到可以做三机九卡的配置,更没想到主办方居然允许 GPU 拓展柜上场...我个人觉得这显然就是犯规行为(x

与各路大佬 Social

我和 iBug、RTX、Taoky 他们约了晚上出来吃点便餐,后来 TUNA 的 Harry 等认识的或不认识的大佬都来了。我们选定科大对面的一家日料店,吃了点寿司、烧鸟之类的,一开始是尬聊、互相交换贴纸,后来天马行空的瞎谈技术。虽然网上天天在群里口嗨,但线下会面竟一时无法将网名与真人对应。

大家是真的来吃简餐的,只有我在聚会尾声追加了一份加量拉面。因为真的饿急眼了,早上和中午几乎没怎么吃东西。

我们互相道别后,回到江南春的路上又差点儿被电摩撞到。有一说一合肥的电摩是真的多,驾驶的也是相当野蛮。

DAY3 我们翻车了

如此美妙的开局

我照例捧着江南春出品的加浓美式不加糖来到了会场。赛方再次强调了规则,就算是正式开赛了。

我让队友先休息会,我先跑一发 hpl 看看。我盯着自动功耗控制的脚本在疯狂调整限制,linpack 也在终端不断的打印进度和瞬时性能。想着可能要做很多次 hpl 取最好的成绩。

hpl 很快跑完了,我们队伍的功耗警报也没有响。我看了一眼终端,发现我刚刚创造了有史以来的最好纪录,远远超越了在济南超算备赛的成绩和前两天在赛场实测的性能。 我人傻了,在犹豫是放弃这次记录再跑几遍,还是直接梭哈交上这一发。镇定了一下,我想明白了这次成绩的合理性:我们刚才是冷机启动直接开跑,经过一晚上的停机,硬件温度都只有十九度,所以取得了性能提升。

如果我们放弃这次成绩再跑几发,一定难以超越第一次的性能。我把想法告诉了队友和老板,商议一番后,叫来了裁判组提交了 hpl 成绩。

如此美妙的开局,我双手叉腰。

开始出锅

我紧接着按住队友的手,告诉队友跑完 hpcg 后省下的时间都是他们的。然后回车启动了脚本。 将近半个小时后,我们这边警铃大作,功耗居然超了。不知道为什么,功耗控制居然没能压住,所以我们浪费了半个小时,跑完 hpcg 提交成绩后已经靠近中午了。

中午的时候组委会公布了 hpl 榜单,我们只拿到了第五名。在我们前面的大多是三机九卡(以及浙大的一机八卡),算是小小的心理安慰。但是东道主科大使用了四机八卡跑出了比我们高 9TFlops 的成绩,实在佩服。

我们打算先跑完 Yuan 然后再跑团队赛题。然而 Yuan 这个赛题从数据预处理就遇到了各种困难,我们不断看到各个高校都跑出 Yuan 提交成绩,而我们的预期剩余时间却长得令人绝望。 我吃完小蛋糕回来发现进度不对,然后就一起凑过去研究是怎么个事。然后我就猛然发现队友在脚本里写的多机互联是用的以太网地址。我人傻了,赶紧给改成 IB 互联。理论上应该正常了,但由于各种原因,我们的进度还是明显落后于其他队伍。 就在我们焦头烂额之际,队友告诉我 Yuan 卡住没反应了。我起了一个 nvidia-smi,终端死一样的寂静。

nvidia 驱动挂了。

我尝试卸载所有的 nvidia 内核模块,但是上天在关上一扇门的同时把窗户堵死了。我们的操作系统完全 hang 住了。 无奈,我们只能请示裁判方,让我们得到一次冷重启服务器的机会。我当时还觉得只是自己时运不济,撞上了预料之外的错误,重启之后一切都会好起来的。

没想到等待我们的是狂风暴雨。

至暗时刻

在 Yuan 跑了一个小时之后,队友告诉我噩耗。Yuan 又卡住了。我 pdsh 了一下 nvidia-smi,三个机器很快回显了两张卡,有一个节点挂掉了。 而这不是最糟的事情。更糟的事情是我发现挂掉的机器居然不是之前的那台。这表明这个崩溃并非是偶然的不幸,而是必然的、不可避免的发生。

我意识到了问题的严重性。叫队友再次请示裁判方,申请冷重启。机器重启之后,浪潮的的技术顾问也来查看问题出在哪里。我们从 dmesg 中滤出了关键错误。

kernel: NVRM: Xid (PCI:0000:ca:00):119, pid=3588, name=python, Timeout waiting for RPC from GSP1! Expected function 76 (GSP_RM_Control) (0x20801702 0x4).

我们查阅了一番文档,发现能导致 Xid 119 的原因可以说是非常广泛:

XID Failure Causes
HW Error Driver Error User App Error System Memory Corruption Bus Error Thermal Issue FB Corruption
119 GSP RPC Timeout X X X X X X

除了 User App Error,其他的原因都有可能导致 Xid 119

我傻眼了,然后查资料研究了一下 GSP 这个东西。

Some GPUs include a GPU System Processor (GSP) which can be used to offload GPU initialization and management tasks. This processor is driven by the firmware file /lib/firmware/nvidia/510.39.01/gsp.bin. A few select products currently use GSP by default, and more products will take advantage of GSP in future driver releases.

Offloading tasks which were traditionally performed by the driver on the CPU can improve performance due to lower latency access to GPU hardware internals.

看上去是 GPU 上的一个小处理器,用于将 driver 上的业务负载从 CPU 卸载过来。注意到数据中心 GPU 是默认启用 GSP 的,就算看上去关掉 GSP 似乎也不会造成什么不好的影响,理论上就可以规避掉这个问题了吧! 我很快的改掉了 driver 的 conf 并 dracut -f,然后厚着脸皮再次求组委会让我们将集群整体重启一遍。

结果系统起来后,我们发现关掉 GSP 会导致 nvidia 驱动与 GPU 硬件之间的交互极其缓慢,开启 pm 后稍有改善但也是难以接受的 (可预见的时间内不可能跑完任何一个 case)。 于是我们趁上次重启调试的机会还没过期,立马改了回去又重启了一遍。

我们决定赌。因为我注意到每次重启后,负载一个小时后,几个节点的 nvidia driver 才会陆续暴毙。只要我们在暴毙之前跑完任务就是胜利。 结局当然是我们赌输了。裁判很恼火的给了我最后一次重启机会,并质疑我前几天为什么没有压测出这个毛病,导致现在场面搞得很难看。

我们想清楚 nvidia driver 只会在 Yuan 的负载下崩溃后,最终放弃了整道 Yuan 的赛题。

我对不起负责这道题的队友,我作为 SysAdmin 或其他的什么职责,都应该在备赛的时候配合队友使用大规模数据做压测的。

令人心虚的超级团队奖&我的崩溃

经过了 nvidia 的一番折腾,我们的时间已经所剩无几。我们决定用剩下的时间跑超级团队赛题。

我们都急眼了,以至于没有一个人记得在启动脚本中输出进度。我们用兰大的脚本开跑后,看着终端字符闪动,都沉默不语。我们还没从 Yuan 的失利中走出来。 然后队友从别家问了一下团队赛题的预期耗时,我然后看了一眼时间发现剩下的时间恐怕也不足以跑完超级团队赛题。

兰大和哈工深的老哥来我们这边了解了一下进度,我们只是告诉他们正在跑,但恐怕难以完成此重任。外校的老哥没说什么。

我清楚的知道,可能就差十来分钟。此刻我的心境无限濒临崩溃的边缘,我在考虑这一切,似乎都是因为我负责的 hpcg 由于功耗控制的低级失误浪费了半个多小时;都是因为我对于驱动挂起的错误判断浪费了无法估算的时间;都是因为我想当然的使用 hpl 这种单一的负载就评估了集群的稳定性;都是因为我对于灾难事件的反应和处置比灾难本身还要灾难...

最终,我以一己之力坑惨了队友、坑惨了兰大、哈工深、上交、南科以及港中文的兄弟。

终场铃声响起,我浑浑噩噩的把需要提交的数据(其实在这种情况下并没有太大的必要了)拷进要交的硬盘中,然后扔下队友和老板逃出了场馆。我在场馆对面的建筑楼梯间蹲了一会儿,看着其他的队伍陆陆续续挎着包走出场馆。 然后队友问我去哪了,我说中午吃的有点多,需要逛逛消化一下。但是他们说需要上交的数据似乎出了问题,需要我来看一下。所以我还是回去了,虽然看上去需要交的数据都在,但我其实已经不是很在乎了,我将为数不多的数据又重新考进磁盘,但心乱如麻的我连基本的磁盘挂载都难以顺利操作。

折腾了一会,我们走出寂静的会场。老板问我难道是伤心了?我哈哈一笑跟老板装坚强不在乎的样子。我们在昨天吃烧鸟的馆子旁边儿找了一家烧烤店,老板和队友对着菜单点了一通。我喝了点可乐,吃了点烧烤,听老板吹他当年搞国产军用处理器之类的牛逼,心情稍好了一些。然后我们集体润色,在超级团队群里发了一些没头没脑的话来表达我们队伍没能跑出团队赛题的歉意。

后来才知道,全场只有极少数队伍跑完了团队赛题,我们队伍虽然只有两个大学跑完,但确实成为了第一...虽然如此,我们还是觉得接受这个超级团队的荣誉还是令人心虚的。我们对这个奖项作出的唯一贡献,可能就是提供了不必安装配置 slurm 的意见。

DAY4 经历至暗时刻后,已经没什么是不能接受的了。

其实 day4 的印象已经很模糊了。deepmd 和 wrf 都是其他队友负责的赛题,我协助他们跑起任务后就一直在看神秘应用 fvcom 了。

我花了一上午的时间编译构建 fvcom,然后发现赛方给的例程无法运行。仔细 debug 了一下发现是因为例程不能完整的读入 OBC 数据。 我修改了一番代码,然后将 oneAPI 回退到了某个远古版本,fvcom 终于跑起来了。

由于跑完 deepmd 后时间不够,我们只能跑完 wrf 和 fvcom 的部分 case,但也不是不能接受了。

第四天就这么模模糊糊的过去了,没留下什么可回忆的东西。可能是因为我还没从前一天的灾难中缓过来。

DAY5 旅游

负责英文答辩的队友前去答辩,我和老板去参加了第三十届国际超算高峰论坛,听各路大佬讲了一些行业泛用或是前沿的东西,最终坐不住跑出去偷吃了不少小蛋糕。

中午大老板在酒店的餐厅请我们吃了一些高级菜,聊了聊未来发展之类的。

下午是颁奖典礼,北大冠军、科大亚军。我们上去拍了一张一等奖照片,然后就是听市长、校长的发言。挺无聊的。

晚上照例是老板请吃饭,老板以为大老板要来一起吃,点菜标准直接上了好几个台阶。最后大老板没来,饭菜全都便宜了我们。学校的宣传部也是嗅觉灵敏,很快就在各大平台上不留余力的宣传比赛的所谓佳绩。 尴尬的是供稿方写着计算机科学与技术学部,但我们整支队伍没有一个人是计科学院的。

DAY6 旅游&回家

我们老板和科大的李会民老师有一些熟,所以李老师邀请我们去参观科大的 HPC 机房。

科大的 HPC 中心果然名不虚传,封闭式机柜,全水冷热交换,集群中还穿插一些金灿灿的高贵 DGX 大盒子。走的时候,李老师还送给我们一些极有纪念意义的伴手礼。

中午我们在科大文创店消费掉了主办方给的 300 元储值卡,买了一通笔记本、马克杯、明信片之类的纪念品。 下午我们则是分头行动,虽然我们的卡刷不进图书馆门禁,但经过 iBug 的一番教学,我还是偷溜进图书馆并推开了 USTC lug 办公室的门。

办公室小小一间,但是空间利用率极高。驻办公室的同学友好地带我参观了一番,我和他们尬聊一顿后薅走了一些贴纸和钥匙扣。

看了看表,快到时间了。剩下的几个小时去哪里好呢。 我最终再次去了西区本科生一号楼下的理发店,就是刚到科大的那一晚去的那家理发店。店主还记得我,我从包里翻了一顿,没找到什么能送给他的东西,只有一张印着我们学校、社团和济南超算的贴纸。

我告诉店主今天就要离开科大返回济南,并说科大的校园环境和文化、合肥的水土人情给我留下了深刻的印象。店主说我有机会还会一定再来的吧,到时候重返科大,再次来到他的理发店,他可能已经记不清我的样子。但只需要告诉他,我是当年从济南来科大比赛的学生,他一定能会想起来。说着就比划着要把贴纸贴在他那小小理发店的墙壁上。

我说,一定...大概有机会再来的的吧,并与他告别。

返程的途中发生了一些小小意外,主办方送我们去高铁站的车,由于司机对时间把控的过度自信、抑或是变化不定的晚高峰交通状况,总之是严重迟到了。以至于我们完全延误了高铁,只能选择改签。

后记

唯有热爱,可抵岁月漫长。

这篇回忆录写于 ASC22-23 之后将近一年,我们用更成熟的姿态拿下 ASC24 初赛,准备在几个月后前往上海参加决赛,我心血来潮想要补上本该动笔的回忆录。

在那年比赛结束后,我在很长一段时间内都在不停复盘当时的备赛和决赛过程,也不断精进自己的技术,磨砺我的意志。

在写的过程中,看着手机中的照片和视频,仿佛魂穿回那个时候————那个懵懵懂懂,能力贫弱,心态稚嫩却稀里糊涂闯入 ASC 决赛的时候。 当时的每一丝记忆都慢慢从尘封的记忆中回溯,大致拼凑出一群少年尝试挑战巨人的 ASC 故事。希望能给有意、或无意了解 ASC 的读者一些参考。