我与世界大学生超级计算机比赛
5月12日,2020-2021 ASC世界大学生超级计算机竞赛(ASC20-21)总决赛在南方科技大学落下帷幕。经过激烈角逐,我校超算中心张洋老师指导的由信息科学与工程学院高宸、萃英学院王博凡和迟智名、物理科学与技术学院刘尚昊和魏弘亮五位本科生组成的兰州大学超算代表队荣获总决赛一等奖和最佳人气奖。这个比赛举办了了八届,有超过10000名大学生参加过比赛,是世界规模最大的超算比赛。我校首次参加ASC,并成功从300支队伍中晋级决赛。受去年疫情的影响,ASC20取消和ASC21合办,我校前后有多名同学加入这个比赛,同学们为这个比赛付出了很多的努力,为学校争得了荣誉,本次比赛也得到网络安全与信息化办公室超算中心、信息科学与工程学院陈文波老师研究生团队的大力支持,让我们看看这些同学都是如何跟超级计算结缘的…
ASC20-队长黎婕
2021年1月8日,中午和朋友吃兰州牛肉面的时候,我笑着说“去年这时候我刚从北京比赛培训结束”,微信闪过老师的消息“我们今年进决赛了”。
回去路上仍在恍神,原来我们真的实现了“兰州大学首次晋级ASC”的目标,虽然当时仅出于学习技术的心态报名。毕业前夕,我跟老师说“希望从ASC20后,每届比赛学校都有队伍参加,因为学生总是越来越强”。老师笑着摆手“今年指导参赛太辛苦了,我不知道以后能不能坚持”。值得庆幸的是,他一直坚持下去了,那个看似不可能的晋级目标,他和新队伍真的实现了。
回想起2019年我们看到学校招募ASC队员的信息,经过了三个月的培训,最后选拨出五名队员,并在张老师带队于2020年1月前往北京中关村参加ASC20主办方的集训。在返乡前,我们对四道赛题进行了分工,没想到回家后之后全国爆发疫情,但是疫情并没有影响我们对赛题的准备,五位同学基本每周通过线上会议与张老师沟通赛题思路与遇到的问题,使用Seafile进行文档协作;通过队友间的密切协作与张老师及其研究生的耐心指导下,三月底完成HPC集群搭建,HPL/HPCG测试,LE Challenge与Quest赛题。很遗憾, ASC2020最终还是因为疫情取消了,我们把最终的比赛报告按ASC20的提交要求将附加材料及参考文档打包,希望能供后续比赛同学参考。
尽管没有参加最终的比赛,但是我们还是很高兴自己能有这样的经历。去复旦大学读研后,助管面试时被老师问到“你有没有当过学生干部,最难忘的学生干部经历是什么”,我很认真地说“当过,但我最难忘的是担任ASC20的队长”。也不知要吃多少碗异乡的兰州牛肉面,才能再次回到那个梦开始的地方,与那些我珍视的人重逢呢。
ASC2020参赛队员李腾祥、黎婕、梅君夷、高宸、魏人
ASC2021参赛队员-队长高宸 2017级 信息科学与工程学院
ASC世界大学生超级计算机竞赛的队员选拔工作于2019年初就开始了,在经过面试之后,我成功进入了ASC竞赛的培训队伍,随后张洋老师和研究生学长学姐就对我们展开了定期的培训,从Linux基本操作、集群结构等基础内容,到OpenMP、MPI并行等进阶内容都进行了详细的介绍。2020年初,我们顺利完成了初赛赛题,但由于一场突如其来的疫情,ASC2020被迫取消,合并至2021年举行。为了应对这一变化,补充2020年已毕业同学的位置,我们进行了新一轮的选拔,在这次选拔中,为了更切合竞赛实际情况,直接选择让同学们挑战ASC初赛赛题,以考察同学们的基础编译能力、并行优化能力等。经过选拔,我们最终组成了两支共10人的参赛队伍。ASC2020-2021初赛中,我们需要完成Linpack、HPCG基准测试;使用PRESTO完成对FAST射电望远镜数据进行脉冲星搜索;使用QuEST进行量子计算的模拟;利用BERT模型完成阅读理解测试等题目并整理成文档提交。我们依次对题目进行了向量化、多线程、多进程等多方面的优化,认真完成了赛题优化文档,最终顺利晋级决赛。
竞赛的总决赛于2021年5月8日至12日在南方科技大学举行,5天的比赛时间主要分为三个阶段,5月8日-9日为集群搭建、调试阶段;10日-11日为正式比赛阶段;12日为最终的答辩。在集群搭建和调试的过程中,我作为队长,自然承担起了搭建集群过程中的主要任务。虽然我们在赛前做了充分的模拟训练,对于集群的安装过程已经做过多次练习,但是于我们初次参加比赛,对于组委会提供的集群环境并不十分了解,现场状况不断。在集群搭建过程中,例如GPU安装不到位导致无法识别、InfiniBand网卡驱动版本与硬件不匹配等问题频频出现,面对这些问题,需要我们团队具有很强的随机应变的能力,对参赛队员做出合理分工,面对问题依次排插问题原因、查找其解决方案,将问题逐一解决。
在正式比赛的两天时间中,我们需要在3000W的功耗限制下,除初赛题目外,我们还需要使用VENAS对新冠病毒演化进行预测;使用MPAS-A进行天气预报等题目。虽然部分题目与初赛相同,但题目数据量骤增、功耗限制严格、每日比赛时间有限,这些因素都导致决赛难度较初赛有了大幅的提升。在决赛中,我们不仅需要扎实的编程能力和计算机体系结构基础,也需要一定的数学、物理、生命科学、大气等学科知识,这样才能迅速理解题目,快速对赛题中的代码进行优化。此外,由于严格的3000W功耗限制,团队成员需要紧密合作,关注集群中的各部件功耗情况及时调整GPU工作频率、风扇转速等,既要控制集群功耗不超过限制,也要防止机器过热导致意外。
最终,经过5天的努力,我们获得了一等奖和最佳人气奖,这是我们在这一竞赛上首次突破,但也存在着巨大的进步空间,我也希望我们可以进一步总结经验,在未来的竞赛中获得更优秀的成绩。
ASC2021队员-王博凡 2017 萃英学院
ASC世界大学生超级计算机竞赛(ASC Student Supercomputer Challenge,简称ASC超算竞赛)由中国发起组织,并得到亚洲及欧美相关专家和机构支持,旨在通过大赛平台推动各国及地区间超算青年人才交流和培养,提升超算应用水平和研发能力,发挥超算的科技驱动力,促进科技与产业创新。大赛始于2012年,迄今已连续举行9届,自创办以来,影响力不断攀升,共吸引了全球超过10000名大学生参赛,是目前全球规模最大、参与人数最多的大学生超算竞赛,与德国ISC、美国SC并称世界三大超算竞赛。作为一个数学系的同学,能参加这样一个世界级的计算机比赛,是我的荣幸。
在写这个回顾总结的时候,还是有些压力的,一来我不是计算机专业的,许多知识我还并没有很了解,二来为了这个比赛我们学校的老师真的筹备了很久,因为疫情的影响,直到今年才第一次参加并一路进了决赛,是一个从0到1的突破,但是相较于别的老牌学校,我们的经验还是欠缺许多,最终成绩和排名靠前的学校还是差距不小。不过,说实话这样的回顾是很好的一个机会,自己自从上了大学以后越来越懒,也很久没有写下一点像样的文字记录,以前总觉得记录下来的东西是经过无意识加工美化的,和真实的体验并不相同(大概就是为懒找借口吧),但是如果不写,这样难得的经历可能就什么也不剩了吧。回望这段从19年就开始的比赛,横跨三年,历经一次队员换届,终于在上周(21年5月13日)到达了终点,一路下来作为半个见证者我也挺感慨的,虽然最终结果有些差强人意,但在这段比赛中确实是成长了不少。不知道自己这段经历能不能帮助别人,但也就让我在这里随便写一些什么吧。
缘起——指令与控制纯黑的背景,一个如心脏一般跳动的光标,这是计算机终端的界面,也是早期还没有图形界面时,人们面对计算机时所见到的画面,纯净而……无从下手。我大一在C语言课上被要求使用这样一个东西控制计算机时,就像是高中的时候做一题多解的数学题,发现自己想到的方法全都在范例里,而要填的空白却毫无头绪。感谢我的C语言老师,周宇斌教授,让我这么早就接触到了终端和命令行这种更底层和高效操控计算机的办法,也让我燃起了对计算机的兴趣。计算机是一个忠实的助手,它会认真地执行你发出的每一个指令,它会不知疲倦的运行,直到得到一个结果或者遇到无法解决的错误。当自己编写程序时或输入指令时,你只需要遵守基础的语法规则,(理论上)就能拼凑出几乎任何想要的功能,这种相对自由地和计算机直接沟通的体验是使用大型商业化软件时所没有的。在学习了一些编程语言,熟悉了和计算机交互的指令后,我逐渐找到了一个很有意思的课余活动——最大化利用计算机。当然这个“最大化利用”在一开始的时候,只指的是把计算机的每个部分应该怎么用弄清楚,并没有涉及到优化程序之类的范畴。
带着这样一个小想法,我在大二上半学期时选修了萃英学院开的通识课《GPU超算算法与并行技术》,毕竟我的电脑可是个游戏本,独显除了打游戏用用,平时大部分时间都在睡觉,这不得学习下怎么调用它?非常感谢学院开设这样一门硬核通识课以及感谢田园研究员的悉心授课,我在这门课上正式认识到了并行化编程的重要性,不仅学会了怎么调用GPU帮你干活,还接触到了一些从代码层面“最大化利用”计算机的方法。这时,我才逐渐意识到想要最大化利用计算机,可不只是能让每个部分运行起来这么简单,还要仔细考虑你下达指令的方式,否则写出的程序要么只利用了CPU部分核心,其它核心都在围观,要么就是做了很多无用的计算也得不到正确结果。在这门课上,我也认识了后来拉我加入ASC比赛的一位学姐,没有她提醒可能我都不会知道这样一个比赛,这当然是后话了。
回顾大一大二这段和计算机结缘的历史,可以发现我其实真的没有投入太多,相较于班上一些去打算法竞赛的,我这个真的是能算是些课余爱好了,再加上个人比较懒,所以各方面都学的不是很系统,都停留在大概会用的层面。
ASC初见——准备与错过
第一次知道ASC大赛,是在大二下半学期,具体应该是在19年4月份清明节前后,印象很深当时我一直在准备清明节后的雅思考试,看到“招募2020世界大学生超级计算机竞赛(ASC20)参赛队员”的通知的时候我还是挺犹豫的,毕竟我只是个计算机半吊子,到时候选拔面试的时候可就要露馅了。还好当时一起上GPU编程的学姐也想参加这个比赛,两人简单商讨了一下,觉得反正有培训不是直接去比赛,报个名也没啥代价,还能学点东西,就抱着试试的心态投了报名表。同时,我们班上一位搞过算法竞赛的同学也投了报名表,记得我们还紧张兮兮地讨论了选拔面试可能会被问到的问题,甚至还讨论了什么时间去面试比较有利。后来发现这些担心都是多余的,可能是因为这个比赛第一次出现,报名的人并不多,基本上大家都进入了培训阶段。
之后,我们保持着大概两周一次的培训频率,学习了linux的操作、计算机网络相关的知识,以及具体的集群搭建性能测试之类的内容,不知不觉到了19年11月份,培训结束了最后一次课,到了考试选拔正式队员的时候。但是我最终还是放弃了参加比赛的机会,没有参加考试。一是因为考试时间和专业课程冲突,二是因为我打算在接下来的寒假出国交流,无法继续参加更深入的培训。最终,和我同班的那位同学也因为其它原因放弃了参赛,而和我一起报名的学姐和另外几名同学成为了参赛队员,成为了兰州大学ASC大赛一代目队员。
之后接近一年我都没再特别关注过这个比赛了,因为20年实在是发生了太多事,前两个月我在国外交流学习学业压力就比较大,二月份的疫情爆发更是打了我个措手不及,直接被困在了美国,本应三月份回国的计划因为航班取消一直被拖延到了五月底,回到学校又面临着保研的焦虑,一直忙到了20年10月份才尘埃落定,闲了下来。就在十月底,我在群里又看见了一条熟悉的通知“招募2021世界大学生超级计算机竞赛(ASC20-21)参赛队员”,这才想起了一年前的那段培训,正在我准备问问学姐比赛情况时,她先找到了我。原来因为疫情原因,本该去年举办的ASC20合并到了21年,变成了ASC20-21,且初赛题大部分保持不变,只是多加了一道题。然而在20年6月,学姐和当时队里的其它16级的同学都已经毕业,这意味着他们虽然花了很大精力做了初赛题,却没有机会参加这场比赛了,而这个机会留给了我们。我赶紧拉上当时一起培训过的同班同学,再次投出了报名表。
初赛再一年——传承与新生
虽然是第二年招募队员了,但可能因为去年比赛没办成,也没什么新闻宣传,所以报名的人还是不多。然而这次的时间紧张了不少,不像去年是先培训再确定人员,这次比赛的指导老师是准备通过测试直接确定参赛队员,之后再开展培训,不过参赛队伍从去年的一个队扩充成了两个队,总的来看竞争并不大,我和班上的那位同学都顺利成为了参赛队员。
之后,我们保持着一周一次的频率进行了培训,并在培训的同时抓紧时间在去年参赛文档的基础上修改。由于去年的参赛队员已经完成了大部分工作,我们要做的基本就是熟悉并在新集群上复现他们之前的工作。在这个过程中我才真正了解了比赛的规则,学会了一些基本的性能分析工具和常用的并行化方法。问题是学习的一个动力来源,在比赛中我们会遇到各种平时不常见的问题,而这些问题给了我们继续学习和深入研究的动力,可能这就是在获取荣誉之外我们参加比赛的意义吧。
两个月时间很快过去,我们也在20年12月底完成了初赛文档的结构性修改,并在21年1月初,提交了最终文档。这场前后跨越一年多,以接力的方式进行下去的“初赛”终于在提交的那一刻结束了。
苦心人,天不负,感谢去年和今年所有队员的付出,和指导老师的辛劳,我们队入围了ASC20-21的决赛,并将于21年5月到南方科技大学参加现场决赛。
确定进入决赛后,我们抓紧在寒假前的一点时间进行了一些针对性的培训,并分配了赛题。每道题我们采用“双重保险”的方案,即每道题至少有两个人非常熟悉,我作为学数学的,自告奋勇承担了人工智能那道题和之前初赛就负责的Linpack性能测试。这学期最后一次培训结束,又迎来了寒假,恍惚间,我仿佛又回到了19年的11月份,也是那学期最后一次培训,也是阴冷的天,但那时候疫情还没有爆发,我们也没有经历20年的那些痛苦与焦虑。物是人非,新的一年里,我们接过了上一代队员们手中的笔,并将在决赛场上书写属于我们的故事。
总决赛小记——事故与故事
在寒假到决赛的这段时间我也没闲着,趁着大四没课,我在家附近找了份自然语言处理的实习,一来是因为我自己想学点相关的技能,二来就是因为今年人工智能那道赛题是对BERT预训练模型进行微调,从而实现机器阅读理解,具体的问题就是让机器来做四六级的英语阅读理解,这显然是属于自然语言处理的范畴。
工作的时候,我发现我来对地方了,但是又没完全来对地方。来对地方是因为工作上做的项目确实是要用BERT预训练模型,没完全来对地方则是因为公司里做这方面的人很少,大家经验也都不是很足。于是经过几周的独自摸索和团队讨论,我才逐渐理解了模型的原理和具体的用法,期间也是遇到了各种各样的奇怪问题,有的时候数据标签分布极度不均匀导致模型学不到东西,有的时候数据标注错误很多需要增加修正,有的时候参数只是微调了一下模型就会莫名其妙的失效……这些问题有的通过调整模型、数据预处理以及一些统计方法解决了,但是也有的问题花费了长时间的修改,将原本端到端的模型拆成了多个子步骤才勉强解决。
大概了解了BERT模型的使用方法后,我也开始在RACE数据集上测试和调整决赛的baseline程序,这个时候我遇到了一个之前实习的时候并未深入考虑过的问题:加速训练。之前实习的时候,公司给的机器就是单机单卡Tesla K80,不需要多机多卡训练,Tesla K80卡也没有tensor core加速,不支持fp16半精度加速训练,而比赛我们会用更为先进的Nvidia V100,并且会用多节点多卡。幸好这方面的教程非常充足,基本按照别人的代码对应着修改就行,难度不高。修改完后,就开始在学校的小集群上进行一次次寻找最优超参数的实验,最终经过8次完整训练,找到了一组可以使得BERT-baseline达到其最优准确率65%的超参数。但是注意,目前为止我们都没有对finetune网络结构做任何优化,65%的准确率是BERT论文中写的BERT-baseline(BERT+全连接层分类器)可以达到的最高准确率了。接下来最棘手的就是通过调整finetune网络结构来提升准确率,这方面因为比赛要求不可以修改模型的backbone,即BERT模型的基本骨架,所以我们也只能在finetune部分做网络结构的优化。
为了更快测试模型的性能,我向老师申请了4卡v100的独占GPU实例,在此感谢网信办的设备支持。通过查看RACE数据集的排行榜,翻阅排行靠前的网络结构的论文,我尝试复现了两种排行靠前的finetune网络DCMN+和DUMA,并在独占集群上进行了测试。没想到的是,同样参数,同样训练两个epoch,新的网络结构的准确率完全达不到之前baseline的准确率,只有30%左右。这便是赛前代码调试噩梦的开始,因为这个时候离比赛只有两三个星期了,时间还是有点紧,所以看到这样的结果我还是有点慌张,一慌就忘了版本控制这件事,开始直接大张旗鼓地修改代码,增加了一系列的tricks,包括前后学习率分离、对抗训练、混合精度训练等。一顿操作猛如虎,一看准确率25%,效果是不升反降,全选C都比训练后的模型选出来的答案得分高,更尴尬的是代码更改没有分步提交到git,复原起来都很麻烦。于是,第一个大大的教训:一定要做好代码版本控制。
为了复现之前自己的代码,我又花了不少时间从baseline程序一步步改过去,边改边测试,发现在4卡v100的独占实例上用之前小集群上训练用的超参数就是达不到之前的准确率,这时我才想起来,原来小集群上的GPU是两卡P100,显存是v100的一半,所以我在新集群上训练时把batchsize增大了一倍,显然这个参数的调整改变了模型的收敛性。于是,第二个教训:batchsize变动时,学习率也应该跟着调整。
当我在屡次实验后终于意识到上述低级错误时,我们已经在收拾行李,前往深圳了。在飞机起飞前,我又调了一组超参数,并将训练指令提交给了服务器,心中默念着“英伟达保佑”,一边关上了电脑。不知是这次参数确实比较合适的原因,还是老黄真的显灵了,到酒店后我一看,loss确实是降下去了,意味着模型至少是从训练集学到了不少信息,之前的猜想是对的,确实需要调整学习率。我高高兴兴地提交了在验证集上验证的指令,就哼着小曲儿上网冲浪去了。冲了会儿浪,回来一看准确率,52%,嚯,至少不是25%了,但这52%也不行啊,之前可是能65%的。训练集上loss很低,验证集表现却不好,那么答案几乎只有一个了:过拟合。于是,第三个教训:需要增加防止过拟合的手段。此时,比赛在第二天早上就正式开始了,幸好人工智能题是在比赛的第三天才运行,我还有一定的时间修改。
比赛的前两天都是集群搭建和调试,一直可以从早上8点调到晚上8点。为了控制功耗,我们最终留了4台服务器,其中一台纯CPU服务器,另外三台每台插了两张v100。我们学校比赛位置就在清华的旁边,因此沾他们的光,电视台采访还能拍到点我们学校。清华是这个比赛的常年冠军,不是冠军也基本是亚军,他们就看起来很轻松,两天时间都在不紧不慢地安装显卡和各种配件,而反观我们这边,是手忙脚乱的边装显卡边装系统,期间还因为显卡没插上的问题返工了两三次。我们虽然第一天就完成了集群的搭建,但是之后出现了各种各样的系统问题,队长是忙的焦头烂额,终于是赶在第二天结束前把每道题都测试了一遍。可见我们集群搭建的方案还不够自动化,问题比较多。
比赛第三天就是正式跑程序了,上午是测Linpack,这时不同队伍之间的差距又有些拉开了。我们为了控制功耗,手动降低了GPU的频率,并手动在服务器管理的网页里调低了风扇转速,但是仍然出现了功耗报警。无奈只能继续调低GPU频率,得到了个比之前测试要低一些的结果。而很多别的队伍,直接使用树莓派或者可以修改bios的程序,自动化控制风扇转速和GPU频率,从而基本上能最大化的利用这3000w的功耗限制。
在测完Linpack后,我又继续开始了人工智能题的优化之路。经过一天一夜的奋战,终于是在比赛第四天前调整完了程序,增加了固定训练步后保存checkpoint并在验证集上测试的功能,并利用“早停法”的思想,在训练集loss下降,验证集准确度不上升的情形下及时停止训练防止过拟合。此时,用BERT-baseline终于是能达到65%的准确率了,但是别的后接网络效果还是不行,于是我最终决定直接用BERT-baseline。改完程序后,我是信心满满地和队长说,明天早上,先跑我这道题,绝对两个小时内出结果。
那么,第四个教训,FLAG不要立得太早。比赛最后一天早上,拿到赛题,我愣了一下,这个给的预训练模型居然不是BERT,而是蒸馏压缩过的改进版:ALBERT,这意味着之前的代码还是得更改,结果就是一紧张,改代码的时候连犯了好几个低级错误,查BUG花了一个多小时,FLAG直接倒了,浪费了差不多一个小时,还好队长及时止损,让后面的赛题程序先跑,才不至于浪费太多时间。终于,在临近中午的时候,我开启了人工智能题的训练。出乎意料的是,效果格外的好,好到只训练800步(一个epoch需要1033步)就已经在验证集上达到了85%的准确率,而训练800步只需要半个小时左右,这可能就是ALBERT的威力吧。此时我确实是信心满满地杀掉了训练进程,准备在程序里加一个控制开关,固定800步后停止训练,以在获得不错准确率的同时,减少训练的时间,因为这两部分是都算分的。这样就可以先运行别的赛题程序,最后结束前一小时留给我这道题就可以了。
最后一个教训,能得出结果的题,请先跑个结果出来,因为你不知道临时搭建的这个集群能有多么不稳定。下午,集群的系统就出问题了,IB卡配置出现问题,导致节点间通信出问题,上午还可以跑的多机训练,下午直接报错运行不起来。我们中也没有研究网络的,所以遇到这种情况是束手无策,只能遗憾地提前放弃,剩余的时间里我们几乎只能整理整理文档,聊聊天,总结总结经验。
在答辩完后的下午,比赛结果便出来了。结果在意料之中,又在意料之外。意料之中的是我们确实只拿了个一等奖,没有获得任何赛题的单项奖;意料之外的是,我们还是获得了一个单项奖——最佳人气奖,在这里,我非常感谢父母和亲戚朋友的支持,帮我们拉了这么多票。
至此,这毕业前最后一次,也是大学生涯第一次的超算大赛落下了帷幕,确实是给我留下了深刻的印象。
ASC超算大赛的分量其实是很重的,它是国际三大超算竞赛之一,而且是规模最大的。由于这是我们学校第一次参加超算比赛,所以宣传、优惠政策和配套课程都没有放开,这大概也是比赛招不到很多新队员的原因,希望在我们这第一次之后,有更多的学弟学妹加入进来,构建一个良好的超算竞赛生态,把比赛经验传承下去!
ASC2021队员-刘尚昊 2019级 物理科学与技术学院
我本科专业是物理。物理是需要大量运用计算的学科,而我本身对计算机比较感兴趣,大一疫情在家的时候就自学了数据结构、算法和C++。暑假的时候,刷了一个暑假的算法题,把整个编程语言和算法练熟,同时趁空闲的时候看了些CSAPP(深入了解计算机系统),了解到并行、并发、现代的计算机体系结构。虽然这个时候学计算机挺有意思的,但是我并没有找到这些知识和我专业的交集。所以大二开学的时候,因为课程紧张,也就停下了学习计算机的进度。
一个月以后,我在兰小e的推送中看到了关于ASC竞赛召集队员的通知,我其实当时想去报,但是物理院大二的课实在太多了,感觉自己已经是分身乏术。不过后来机缘巧合,这个通知又发送到了物理院的年级群,我有个朋友看到了,就劝我去参加这个比赛。所以当时也就抱着试一试,报了个名。
在第一次开预备队员会议后,张老师布置了之前一届赛题中的最后一题作为选拔题。其实这个题目几乎是这几个题目中最简单的题。可那会我报着打算连干几天的决心,结果一节课就把题目做完了。我都有点懵,我想着这个应该没有这么简单吧,就开始查阅资料,看赛题的文档,知道不少之前陌生的名词OpenMP、MPI、CUDA、GPU编程...。其实到后来才知道,这道题远远不那么简单。
过了初筛,分了队之后便开始了培训。培训的时候,之前查资料看的名词又出现了,由于时间比较紧,感觉也是一知半解。计算物理正好有一个计算时间特别长的作业,我用培训所学的OpenMP把这个作业优化了下,写出了我第一个并行程序。我之前学习的一些疑惑在这次作业的时候才开始慢慢明白,比如浙大翁恺老师为什么说全局变量有害...虽然现在看起来当时还有不少可以再优化的地方,但看着核全部跑满,用时只要之前的50分之一,自己还是感觉到学以致用的乐趣。
做初赛赛题的时候,我知道自己的基础知识并不清楚,便主动要求去写集群搭建的文档和HPCG(benchmark之一,用于超算性能测试)。在真正开始做赛题的时候才感觉对计算集群有了进一步的认识。另外通过查询文档,发现基本上决赛使用的都是GPU加速版本,速度比CPU快很多.只能变换方向找GPU版本的hpcg测试。之后又学了python,python多进程,openACC...,不过真正站在决赛的赛场上之后,我才明白这个比赛的"阵势"。每个大学都特别重视这个比赛,不少学校的观摩人员都跟正式参赛人员一样多,比如清华大学、国防科大、浙江大学、上海交通大学等高水平大学。在装机的时候,大部分学校都带来不少备用的内存,磁盘和顶级的NVIDIA A100显卡。他们准备的程度,跟我们第一次参赛的队伍完全不一样。正式比赛的时候,我们也因为没有在学校用浪潮机器训练而吃了不少亏。不过我们因为准备不少程序的安装脚本受益不少。
这次ASC比赛四个应用赛题就有两个物理方面的应用(presto搜索脉冲星,QuEST模拟量子计算)。在这次比赛中,我了解到了大量的计算机体系结构知识和并行计算方法,学习到了"parallel Think"的思考模式,培养了我进行大规模计算的能力。尤其是比赛完参加ASC的论坛,听了张林峰研究员(戈登·贝尔奖获得人)关于HPC+AI+Physical的讲座,让我知道了物理学新的研究模式。凝聚态物理里面有一句名言,"More is different",当我们具有更先进的计算的方法,更快的计算速度,做出一些全新的研究。
感谢兰州大学超算中心给与我们参加比赛相关的支持,感谢张洋老师组织我们参赛,对我们比赛进行指导,让我有机会在本科阶段就可以接触到科学计算的最前沿领域。
ASC2021队员-魏弘亮( 2018级 物理科学与技术学院):
在去年10月份,我们院的通知群里面发了一则超算竞赛的招募通知,在此之前我虽然对计算机很有兴趣,也自学了很多知识,但这还是我第一次知道跟超级计算机相关的竞赛,于是报名了。随后的一周,我们就做选拔题目。当时我其实不太有信心,因为竞争者都非常厉害,高绩点、萃英、算法竞赛金牌等等各式高手都有。不过我确实非常想进入队伍,所以很认真地对待选拔,幸而最后如愿进入。
选拔过后,老师和队长就开始组织培训。那个时候我虽然对并行编程模型有一定的了解,但是毕竟没有专门学过HPC(因为以前在自己电脑上面根本没有硬件条件来做HPC),所以只能算是有最基本的理论基础。所以后面的培训对我知识体系的完善其实起了很大作用。我还记得参加第一次培训的时候,主题是性能监控,那时候我才学会如何监控系统运行、侦测代码的热点等等技巧。那时候我有一个深刻的体会:虽然计算机相关的资料很多,但是如果没有人指导培训,其实也很容易找不到重点而迟迟入不了门。所以超算中心提供的服务器资源+培训是此次超算竞赛备赛的一个很重要的环节。学习HPC确实得要“Get your hands dirty”,真正地在机器上面实操,发现问题然后讨论解决。
所以,去年10月直到今年1月,我们的工作基本就是做自己分配到的题目+参与培训+自己补足知识框架+写初赛论文。这样的过程实际上不同于大家经常谈起的数学建模大赛。题目直接就是一个GitHub项目,各种程序优化方法都可以用上,题目既可以做得很浅表也可以往深了挖,这里面没有套路可言,全需要自己去看代码、尝试各种优化方法。在这个过程中遇到自己不熟悉、不会的问题简直是家常便饭,所以基本上这就是一个探索的过程。可以说,准备比赛的过程里,我有一半以上的时间其实是在学东西,MPI ,OpenMP,操作系统这些高性能计算基本知识自然要有;但是这以外也有很多非计算机相关的知识,我负责的QuEST实际是个量子门电路模拟的程序,那我自然不光要知道计算机方面的东西,更加要读一点量子计算的知识(前沿问题面前,即使自己是物理专业也得费不少劲来学)。总体来说,初赛过程就是学东西+改代码+调优的过程。
时间来到寒假,得知我们进入了决赛,我自己心里很高兴,但也感觉到不少压力:去南科大可不是免费旅游,而是要与众多强校竞争(虽然事实上南科大之旅还是非常令人愉悦的哈哈哈)。当时我们的程序还是在学校的集群上面运行的,环境已经齐备;但是到南科大可是要实打实地现场搭建一个集群出来。
所以在本学期开学后的培训,主要就是针对搭建集群来开展的。我们以两台服务器为样例搭建集群,其中一台为主节点。连接交换机、加载镜像CentOS、配置PXE启动,用脚本为计算节点安装CentOS、安装编译器工具链、显卡驱动等等。第一次搭建集群时确实也遇到很多问题,最后花了很多力气才配置完成。其实在决赛现场也是遇到很多临场问题,所以我深深感觉到当我们要从头搭建一个集群环境时,可能会遇到很多从来没遇到的突发状况。解决这些问题当然需要随机应变的能力,但是其实更重要的是熟悉整个基本流程,尽量深入地知道每个步骤背后的原理。
学习搭建集群+继续优化应用成了决赛前的最后准备工作,5月份我们正式到达决赛现场,这短短5天时间使我受益匪浅。现场时间紧迫,每位队员的任务都是不一样的,我主要负责团队挑战赛题VENAS和独立赛题QuEST。其中令我印象最深的是赛题VENAS,我们要和南方科技大学、青海大学合作完成这道题目的优化。赛题一发下来,我们就开始分配任务,阅读代码、并行化、尝试不同的解释器等等。在紧张的时间限制之下,单靠一个队伍完成这些工作是很难的,三支队伍经过很多次讨论、尝试才得到了最终的结果。在这个过程中我体会到相互合作真的很重要,整个过程并不是自己单打独斗,而是要大家通力合作。而题目QuEST遇到的最大困难是我们只能做基础的编译选项并行优化,但是即使进行了并行化,程序运行的时间也远远超出我们能分配给这道题目的时间(因为同一天还有其他赛题需要运行)。由此我们可以看到,决赛的题目和初赛是有非常大差异的,数据量更大,运算量也更大,没有足够优化的话甚至无法完成题目,更别说在此基础上缩短时间。其实很大程度上ASC需要我们对待优化的程序有很深入的认识。这个程序并非几百行的程序,而是一个巨大的代码工程,全盘掌握自然是困难的,所以哪一支队伍了解得更深入,就能做出更好的优化。
这次比赛让我们获得了一次和各个强校同台竞技的机会。我能够作为成员之一进入这样一个国际级别竞赛的决赛,这与张洋老师以及四位好队友的努力是分不开的,我衷心感谢他们,同时我相信兰大在这个比赛上会取得越来越好的成绩。
ASC2021队员-迟智名( 2017级 萃英学院):
2020年9月,偶然的一次机会我初识超算比赛,恰巧学校下发了参赛意向通知,出于对“超算”的好奇心,抱着重在参与、了解学习的心态我向学校发送邮件报了名。不久便收到了学校的培训通知,在本部网信办开启了我的超算之旅。和我一样,大部分参加的同学们对超算比赛,或者说超算这个概念不甚了解,只是听说过超级计算机特别厉害云云。经过张洋老师的介绍,我才对超算以及这次比赛有了初步的了解,超算的内容远比我想的复杂严密,但也勾起了我继续学习和挑战的兴趣。
随着培训和自学的不断深入,我对超算有了进一步的了解,对计算机的内部体系结构的认知更加立体。在这次学习中,原来只闻其名未见其踪的名词(如:GPU、CPU、操作系统、编译等),逐渐被我们所认识、得知其实意。这次比赛经历对于只学过编程语言的我来讲是一次可遇而不可求的学习机会,十分感谢兰州大学能给我们这个平台、有针对性地指导我们在实践中提高自己的能力,拓宽自己的视野,这在很多其他学校是做不到的。
由于疫情影响,2020年比赛顺延到了2021年,初赛的比赛题目也有所增加。在做初赛题目的时候,我们进行了分组,同时也开始攻克初赛题目,从对较为简单的部分开始编译,一步步过渡到困难的部分。我们的队长高宸同学和我一同对中子星搜索软件presto进行优化。为了模拟比赛的环境,从头到尾都是我们自己下载软件、阅读文档进行编译。编译的过程远比我们想象的坎坷,尤其是对我这种非计算机专业的人来说,碰到的报错基本无法理解,只能将其粘贴复制到网上查询,通过比对其他人的分享粘贴,一点一点地修改错误,直至编译通过。过程很艰辛,也走了很多弯路,中间做的时候经常是坐在电脑前就是一天,但是我觉得我的能力正是在那些一次次的报错中提高的。我也十分感谢在这期间我们的队长,他在完成这项任务之余,给了我很多帮助,也让我学习到了很多知识。最后,这道题目终于完成,我们也成功进入了决赛。这是我们学校第一次参加ASC,也是第一次进入决赛,同时也意味着我们在ASC的旅程,并没有结束。
决赛在深圳举行,出发赶往深圳前,我们对决赛出现的题目进行了研究,在线上展开了多次会议并进入机房进行了多次的服务器搭建训练。时间在一次又一次的调试中流逝,不知不觉来到了决赛的时间——5月8日上午八点,比赛正式开始。
前两天都是集群系统的搭建和调试,我们快速阅读了浪潮服务器的搭建说明,并根据前面的训练经验,我们开始了服务器的搭建。网线、电源线、IB线、交换机、GPU等,都需要现场安装。虽然经历了一些小挫折,但是这些困难也被我们一一克服。在这之后,我们5名队员对各自负责的赛题进行了提前部署,队长高宸同学负责安装系统和benchmark测试,王博凡同学负责人工智能题目的测试,魏弘量同学负责量子软件Quest的运行,我和刘尚昊同学负责中子星搜索软件presto的部署。我们根据具体使用的计算节点数量及环境,将这些软件进行了并行化的操作。本以为我们的任务在这两天己经完成一大半了,只需要关注团队应用和神秘应用即可,殊不知其实还有更大的挑战在后面。
第三天一上电调试,发现功耗控制和预期不同,于是赶紧一点一点地调整参数,最终成功将功耗调整到3000W以下。但是紧接而来的中子星搜索presto的数据和分段程序,让我们有点傻眼:数据太大了,磁盘存储装不下运行时产生的数据。首先我们赶紧将它发下来的分段程序进行并行化,但在运行时,就发现了数据太大的问题。我们顿时有点后悔应该多备几个磁盘,但是现在也只能把能跑出数据来的部分运行完成。不过由于这道题目还是较为困难,所以我们这部分的成绩尚可。
第四天的比赛,我主要负责的是神秘应用的部分,这是一款大气学科的软件MPAS。由于大气方面知识的缺乏,我们读懂文档就花了很多时间,不过程序还是较为简单的。在我们以为形势大好之际,我们遇到了一个很大的问题,IB连不上了,这将直接导致我们并行化的失败。虽然我们紧急修复了这个问题,但时间不够了,最后这个任务我们没有全部完成,在遗憾中交上了答卷。
在这四天的比赛中,虽然我们每个人都有自己主要负责的部分,但是对于其他赛题,我们都会相互讨论,提出自己的一些建议和意见,比如人工智能问题中过拟合的处理方法、团队应用中基因序列的读取并行化等部分,我们都进行了充分的讨论,相互提出建议。这样的任务并行化,但各任务之间仍互有关联的方法贯穿了比赛的始终。
比赛完成后张洋老师和我们交流了准备ASC这近乎一年的感受和心得,张老师和我们说,比赛重要的不是结果,真正让你们受益的应该是在这其中收获的知识和经验,学到的本领,并发现自己的不足,努力的去弥补它。张老师说的这些话,我记忆犹新,并且会一直铭记下去。
再次回顾ASC比赛的过程,我其实有了一些更深刻的感想。一年的准备,一年的拼搏,这一年里我认识了一群志同道合的朋友,很庆幸认识了和我一起并肩战斗的队友,通过这次比赛,我也学到了很多,我觉得它不仅仅是一种普通的编程比赛,是一种从底向上了解计算机的过程,更是一种精神的磨练,这种磨练不单单是对自己毅力,同时也是我们对于团队成员配合能力的磨练。关于最后的获奖,我没有什么特别的感受,只是感觉很高兴,这是对我能力的一种肯定,更重要的是对自己的鼓励。以后的挑战还很多,更需要努力。
ASC世界大学生计算机大赛,是我平凡大学生涯的一个亮点,它让我对计算机有了一个全新的认知,我也会继续努力,在研究生学习中对理论计算机科学方向做出自己的贡献。
紧张的安装和调试
赛后参观华为松山湖