从天堂到地狱
ASC25总决赛结束了,这次青海之旅当然有很多遗憾。学长让我写点什么,我也觉得是该写点什么,反正在飞机上也没什么事干,这篇文章算是给自己的ASC生涯一个交代。
从初赛的一骑绝尘
24年末,ASC25正式发题。我们队伍一共五个学生,我和景愉是去年留下的老队员了,还有李烜、于晓、秋润是三个新招的队员。初赛时间贯穿了整个寒假,寒假前大家基本都略微熟悉了赛题。等到正式放假,我们就立刻入驻实验大楼的710,开始没日没夜的干活。景愉负责系统运维,我带着于晓对m5c赛题进行优化,李烜和秋润则对alphafold3进行优化,我偶尔给他们提供优化的方向。
出于性能考虑,我们选择了相对冷门的clearlinux作为我们的os。队里服务器物理核心数实在太少了,对于m5c赛题我们把目光主要放在了加强整个流程的可扩展性,事实证明对于家里的硬件环境,我们的选择是极其正确的。执行赛方提供的benchmark脚本,整个流程需要花费整整两天。我大改流程,将整个数据流动变为split->merge->split->merge的过程,从而充分利用数据并行尽可能多的用到更多核心,同时削弱每个应用内部线程竞争的压力;由于clearlinux的slurm源损坏,我不得不基于github上对于snakemake构建的一个调度系统进行魔改和完善,以能够发挥snakemake的多节点任务分配的能力;初始,hisat-3n-table应用是一个大瓶颈,我通读了这部分代码,原应用多线程能力低下,想要流水处理,但是因为错误的锁的使用,导致无法流水起来,不过由于之前的流程优化和可扩展性优化效果实在太好,我并没有对其进行重写;此外,我意识到IO是重要瓶颈,想了两个办法,一是将数据提前缓存进内存,并且使用tmpfs存储中间数据,另一个则是将SATA换用nvme硬盘,加快IO速度,这两者效果都很明显。当做完这些,寒假也已经基本结束,我很自信我做的工作,因为此时整个流程可以在五节点上运行,能充分利用176个逻辑核的能力,总的运行时间从最初的四十几个小时缩短到五十分钟。此外,按染色体切分从而并行化UMI任务的优化也已经呼之欲出,但是我没有做到很好的通用性,就没有放在初赛中,而是之后交给于晓决赛做了,当换用nvme硬盘并完成UMI优化后,甚至在队里的服务器只需要二十多分钟。我将所有内容毫无保留的教给了于晓同学,他作为新队员也很好的吸收了很多内容。
当我做完m5c的基本工作,回过头来看alphafold3的工作,起初我并不是很满意李烜和秋润的进度,因为当时还始终处于调参的阶段,我狠狠地批评了他们。于是,我立马自己又安装fold3,尝试帮助优化,在阅读fold3资料的过程中,我立马意识到difussion部分串行的五个任务完全可以并行执行,在和其它学校交流的过程中也确认了这一点,于是我告诉他们后面该怎样做,不过有点遗憾,初赛的时候他们没有做这部分的工作。所幸,最后几天,他们顶住了压力,找到了比较正确的调参方法,并且在GPU和CPU上分别做了一些优化,缩短了运行时间,不幸中的万幸吧,作为新队员也已经很优秀了。
当时间的指针来到初赛交稿的最后一天,才发现还有一道设计计算机系统的题目没做,当时已经熬了一个通宵了,不过没办法,只能再熬一个通宵。没有根据的设计计算机系统,我实在编不出来。于是我灵机一动,根据赛题特点,及比赛功耗,结合队里的服务器,洋洋洒洒写了三页。
交完初赛稿和相应数据资料,整个人都虚脱了,在床上大睡,怎么睡都睡不够。
三月,出初赛成绩的那天,沈立老师上午其实就已经得知了成绩,但没告诉我们。我还记得是下午,我跑完步正准备洗澡,随手点进邮箱,就看见了ASC组委会发的邮件,我们的名字赫然排在第二位,只在浙大下面,我真的超级高兴,立马把成绩发给沈老师,然后沈老师就告诉我们他上午就知道了……
那阵子,大家都很开心,第二名欸,意味着我们很有机会捧起ASC冠军奖杯,创造NUDT计算机学院的历史,能够为银河天河增光添彩。同样,拿到了冠军,意味着不能保研的队员也有机会保研。更何况,后面沈老师告诉我们,我们实际上是和浙大并列第一,每个人都充满了信心。但是,这也让我们放松了警惕,尤其是我自己。
决赛做最后的准备
到了决赛准备阶段,m5c的工作实际上基本停滞了,我太自信了,我仅仅让于晓完善了UMI划分那一步就没继续做工作了。我本可以抽出一天时间把hisat-3n-table重写,本可以将那四五百行的java代码用c++重写的,但是我没有,我甚至基本放手了,因为我感觉我准备好了准确度检测的脚本,准备好了调度系统,准备好了经过论证的高可扩展性流程,准备好了IO优化,一切都感觉无懈可击,这可能也是悲剧的开始,既低估了对手,也高估了自己。
决赛新发了geant4、dpsk纯cpu推理优化以及一道团队赛题。题目发布后,我让于晓给m5c修修补补即可,让李烜继续做alphafold3赛题,安排秋润去做geant4,因为考虑到geant4并没有给实际的负载代码,也禁止修改源码,所以秋润的工作更多是调研和分享即可。决赛现场发布负载代码,然后让大家一起写,但是,后面执行歪了,这是我的问题,我本应该让于晓和秋润一起做geant4的,而m5c则自己继续做。
在决赛准备阶段,沈老师经常找我们开会,帮我们分析问题,同步进度,也很感谢沈老师那段时间的陪伴。
dpsk推理和团队赛题,就到了我手上。在这里,我又犯了一个错误,团队赛题和青海大学东道主在一起,还有最后的冠军上交和很强的中科大,我就放松了,一直到最后几天才开始关注团队赛题,低估了他编译依赖的复杂度,导致最后在现场,甚至没能跑起来。关于dpsk题,其实我并没有太好的办法,诸如vllm这类的开源框架实在太难改进了,我只能不断尝试新的推理引擎,进行各种方法的量化,并且进一步关注AMX指令集的能力。在这个过程中,我熟悉了transformer和vllm的基本特点,也不算没有收获。最后,我选择了xft,一个intel的推理引擎,在纯cpu架构下性能大约是vllm的1.5倍,并且可以量化和分布式推理。事实证明也确实如此,浙大决赛dpsk第一单request也才14tokens/s,但是我们可以跑到21.5tokens/s,最要命的就是准确度,真的就差0.00几,只能说时也命也。有一阵子死活在队里服务器跑不起来,无奈花了四百块钱租了三天阿里的云服务器,虽然最后云服务器上的效果也一般。
实话实说,决赛准备阶段初期,我挺为fold3担心的,因为从初赛新闻稿可以看出,北大的优化做的极为出色,但同样也是新闻稿,让我看出了一些优化方向。比如Intel对fold2做了大量优化,比如通过降低精度提速,我迅速将内容告知李烜,并把Intel对fold2做优化的pdf一并转发,此后fold3就在正确的路上一路狂奔了。李烜也很好的完成了后面的优化工作,保持了工作的稳定性,并且将我初赛一早提出的difussion部分并行化做到了多机上。
至于geant4赛题,由于没有提供负载代码,实际是两眼一抹黑。本着做多机的惯性思维,我就提出用mpi做多机优化,事实证明这并不是一个好主意,同样为决赛埋下了祸根,但是秋润还是尽力做了多线程内部的优化,比如关于锁的优化,我认为他还是做了很出色的工作的,是我没有替他详细研究过程,给他指出正确的道路,作为队长和老队员,这是我的责任。
此外关于系统,我充分信任景愉的能力,于是我们采用了可能是历届比赛唯一一个使用双系统的方案。因为clearos运行多机HPL存在问题,我们不得不使用rocky来作兼容,以此充分发挥clearos的高性能特点。但是从这里开始,我就应该意识到潜在的风险,clearos兼容性和稳定性。很可惜,初赛的成绩已经蒙蔽了我的双眼,我们太自信了,太自信能够解决赛场的所有突发情况,事实证明我们并不能。决赛前四天,镜像打包完毕后,我突然发现队里服务器的xft运行不起来了,我有点慌了,我以为是家里硬件的问题,可能到决赛现场的机器就好了,但这真是一个错误的想法,它确实在系统上起不来了,真的起不来了,oneccl库废了,直到比赛第二天晚上才解决这个问题,IB权限出现了问题,此后就是一系列魔鬼问题。
怀着忐忑和期待我们去到了青海。
决赛现场,绝望之地
踏进决赛现场,我就开始有点不冷静了。看着体育馆上挂着的功耗大屏,我深吸了一口气,冥冥之中就有了不详的预感。八点半,开幕式结束。我们马不停蹄地开始装机,可能是太着急了,装着装着我突然发现满手是血,又去紧急清洗了一下。在装机时,沈老师又给我们提供了很好的指导,比如怎么走线,怎么不挡风道。但是,很可惜,当时确实太着急了,真的太着急了,太想赢了,有四台机器GPU的供电线没有走对,部分挡住了GPU的散热口,我想这也是后面压不住功耗的部分原因。此外,当天IB出现了问题,各个IB接口状态始终为down,一顿排查发现,可能是开源驱动问题。我们必须用一台rocky机器启动openmv服务,才能起IB通信,这又耽误了不少时间。一波未平一波又起,其中一台机器始终识别不到IB,无奈之下反复和组委会申请,换了一台机器,最后成功恢复通信,可这都是时间啊。
当完成基础装机后,就是geant4、m5c、dpsk、fold3、hpl和hpcg等应用的依次试运行。geant4、m5c、fold3都很轻松的跑起来了。但是dpsk遇到了和队里一样的问题,mpi通信起不来,于是迅速采用备用方案,使用vllm进行保底,令人绝望的是vllm的服务居然也起不来,我还需要做推理的多机,说实话,那天我真的慌了。不止于此,在跑HPL和HPCG时,我们隐约发现功耗不太对劲,但由于是第一天,就没太关心。
第一天晚上,我在rocky社区上偶然间发现有人遇到了和我oneccl一样的问题,他说可能是权限问题,需要root权限。我死马当活马医,发现真的是这个原因。普通用户没有给IB分配缓冲区的权限,因此起不了多机。虽然我并不知道一开始我为什么能在队里的服务器上跑起来。那天晚上结束,我对xft充满了信心,并且尝试用了nginx做了一个简单的多机模型实例轮询,以提高吞吐。
到此,第一天比赛结束,总的来说虽然困难很多,但是基本完成任务。
第二天,我们开始考虑出题的各种细节,并继续做准备。这一天,我成功跑起来了单机的xft。但是m5c出现了问题,多机跑不起来了,明明昨天还可以跑成功的,并且我们开始发现HPL和HPCG功耗压不住了,我们分配了大量的时间在这部分上面,想尽各种方法也无济于事,HPL跑出来的成绩也不理想,局势越来越恶劣了,并且网络也存在问题,景愉和李烜付出了很多努力来维护网络。功耗,成为笼罩在我们之后几天永远的乌云。我们开始寄希望于第三天开机,机器的静息功耗能自己小一点。
可是,命运就是这么捉弄人。当我们第三天启动机器的时候,我感觉天都塌了。什么都没干,在4kw的功耗限制下,咱们的机器静息功耗就有3kw,比昨天整整高了500w,只有1kw的空余功耗,这怎么比?更令人绝望的是,相同配置下,HPL的成绩比昨天低了20TFLOPS,并且还压不住功耗。别人相同配置甚至能有100TFLOPS,而我们只有50出头。到这里,心就已经凉了半截了。但是,所幸的是下午李烜的fold3比较顺利,跑完了全部用例,速度也不错,并且腾出时间给于晓对m5c做了多机测试,我们发现m5c多机又恢复正常了。此外,我也完成了dpsk的多机部署。唯一痛苦的是,我原以为能搭上其它队伍团队赛的顺风车,跑他们的容器就行,但是很遗憾,容器在rocky和clear上都出现了问题。我只能迅速手编各种库。由于为了不占功耗,我先远程在队里的机器编好各种库,然后传到机器上面。但是,团队赛题的依赖真的很复杂,最后都编译成功了,但是运行的时候就是会报错,我并不清楚原因,真的很艰难,我没有提前做好团队赛的准备,这又是我的责任。
第四天早上,我稍稍有信心一点了。因为geant4我们做了很好的mpi优化,m5c通过昨天和其它队伍的交流,发现我们效果也超级好,dpsk更是xft吊打一众vllm和llama.cpp。但是,功耗这朵乌云又出现了。整整一上午,m5c都在超功耗,我们从五机降到四机,再降到三机。这时,我们发现,多机起不了了,真的很绝望。没办法,只能分开跑单机,弃用nfs,弃用调度系统。好不容易不爆功耗了,磁盘爆了,甚至只能边跑边删,这甚至可能导致最后结果出现问题,很无力。geant4这边,发现决赛用例和example差距巨大,根本无法mpi并行优化,只能直接边裸跑边研究其它方法优化,一直到最后,一个测例的结果也没能跑出来。最后是dpsk,一方面起初bnechmark脚本跑不起来对单个的request,xft果然性能强大,保持了稳定的21.5tokens/s的输出。这时很多队伍传来推理结果无法通过准确度测试的消息。我心中怀着侥幸,应该能过。等我测试的时候,发现,居然差0.008,天意弄人。我以为是量化的问题,于是我从int4升到了int8,又从int8升到了bf16,结果准确度更差了。我真的心态崩溃,道心破碎了,就差那么一点点啊,就差一点点啊,可这又有什么办法了,我甚至决定临时改用vllm,按赛方的配置跑个baseline,结果有的队伍传来消息,原模型都过不了准确度测试。我真的没有办法了。最后留给我45分钟,回天乏力。m5c好不容易一个多小时跑完了,交上了结果。但是,我们不知道的是,结果是错的,直接爆零了。我们从来没遇见过这种情况,直到闭幕式前,我们都以为m5c起码能拿到基础分,如果我们能压住功耗,是可以和清华掰掰手腕的,很可惜,并不能。
第四天,我们最有信心的一天,可是命运并不会按你想好的剧本运行。
当最后交上去结果磁盘的时候,我知道完了,真的没忍住。沈老师用球赛的例子安慰我,可是我知道有很多事情是我没做好。我们是一支很好的team,大家都很努力,我们牺牲了几乎所有的节假日,寒假、清明、五一,平常周末,只要大家一有空就去705。作为新队员,李烜、于晓、秋润都已经做的很好了,特别是李烜无论是网络维护还是fold3都出了大力气,于晓也很好的完成了我m5c的收尾工作,秋润也仔细研究了geant4的各项特点,但geant4变数太大了,秋润真的已经尽力了,正如我之前所说,我最初就应该让于晓和秋润一起做geant4,我来继续做m5c、dpsk和团队题。双系统对景愉也是一个很大挑战,但是我认为他也已经很出色了,很好的完成了准备工作,他也想了很多办法,无论是系统性能提升还是控制功耗。可能这就是命吧。很多时候,我并没有做出很好的决策,不够果断坚决,没有把队伍带出绝境,我自己先慌了,没有当好队长。
最后的最后
我很感谢ASC25。 我有很好的队友,无论是负责系统搭建和运维的景愉,认真做应用优化的李烜、于晓、秋润,大家在一起度过了很难忘的五个月,空闲时间不是在705就是在709,紧张的时候大家可能两点甚至两点以后才离开实验室,通宵也是常有,我的队友都很优秀。
我有很好的学长,中第学长给予了我们强有力的经验和技术支撑,余骑学长和政翰学长也经常帮我们排解烦闷,很高兴能在科大遇见。
在青海,我们也遇见了好多好多朋友。团队赛帮助我们编译和优化远古程序的上交和中科大的同学,他们真的很好。和我们经常进行交流的福州大学和西北工业大学的同学,给我们带来很多启发。还有清华大学的同学,给我们解答了很多疑惑,分享了很多做题经验。我们也和浙江大学、青海大学等学校以及国外队伍进行了很多友好的交流。另外,对这几天不辞辛劳,热情招待我们的李才让措同学,我们也真的很感谢。
我们有超级好的指导老师,沈立老师,他始终相信和鼓励我们,一直默默陪伴着我们。能在大学遇见这样的老师,我们的队伍很幸运,真的很幸运。
努力的时候感觉很苦,挺过来了又很怀念。我们之前没有接触过生信,没有接触过AI推理,没有气候模拟应用的经验,但是我们都凭自己一点一点啃下来了。当然,决赛现场有很多意外和变数,比如压不下来的功耗,莫名的运行错误。不过我始终相信我的队友做的工作都极其出色。 我的ASC生涯结束了,但是这将是我人生中最难忘的记忆之一。
希望后来的学弟学妹们能实现我们没有实现的目标,加油!
版权声明: 如无特别声明,本文版权归 Mr Huang 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:《 ASC25--未知之境 》
本文链接:https://wingrew.com/asc25/ASC25.html
本文最后一次更新为 天前,文章中的某些内容可能已过时!