今年有幸作为队长组队准备并参加了ASC 19,但是因为各种原因并没有拿到太好的名次,把从准备到参赛的整个过程写成blog,以作为参考。
初赛前的准备
大概12月份,和几个同学商量了一下,觉得ASC去年的结果太不理想,所以开始准备19年的ASC。大概上组了个队,以团队lab组的同学为主,拉了cyx做AI题,又拉了rgy,凑了5人正式2人替补,一共是三个大三的四个大二的。首先是找管理员要回了我们之前一直用的4台GPU节点,节点配置是4*K20m,属于稍微比较落后的配置了,这些节点因为实验室做研究的问题,在Ubuntu 14.04上搭了RAID,管理员要求我们不更改机器配置,所以就没有重装系统(后来才发现有多坑
运维最后定为zht,root权限收到运维手里,但是他因为各种事情一直没有怎么干活,我用linuxbrew把该装的东西都装了一遍,又自己编译安装了GCC、PSXE、OpenMPI、MVAPICH2。因为Ubuntu源里的东西太旧,我又编了新版的tmux、vim、valgrind之类的工具,以备不时之需。
12月底大家基本就把自己的工作环境配置好了,然后和他们分配了去年的题目,稍微合作一下熟悉一下这个比赛的模式。
初赛
1月份发题,今年初赛的题目是大气计算相关的CESM,和图片的超分辨率。匆匆搞完期末考试就开始准备初赛,zht负责HPL&HPCG,我、wmy和rgy看CESM,cyx因为不是做CV相关的所以退出了,找了why过来和dtm、zzx一起做SR。
寒假期间因为集群关机,基本上只能本机看代码,这个应用是fortran写的,代码量上百万行,读起来很难受。我们几个QQ电话了几次确定了要优化哪些东西,计算热点尝试上了CUDA但是因为高估了显存与内存的交换速度,提升并不大,要想达到比较好的效果只能把计算的大部分都改GPU或者考虑计算和通信折叠,所以我们最后放弃了GPU版。计算的部分还做了一些简单的向量化以及调库的优化。通信这边我尝试overlap一些计算和通信,以及改变CAM内部的通信模式,但是到最后也没有debug完,只能把一些调参的思路和对代码的理解写进proposal里。
SR那边情况就稳定一些,他们选了几个模型,最后敲定了一个相对效果比较好的。初赛就在不停地赶ddl中结束了,因为我们的proposal写的还算挺漂亮的,以第8的成绩进了决赛。
复赛
3月12号公布决赛结果和发题之后,多了一道基因测序的wtdbg,同时图片的超分辨率那题升级成了人脸超分辨率。我们队伍的配置不变,我和rgy继续CESM,wmy先去读一下wtdbg的算法,剩下的三个同学继续做AI。运维同学持续摸鱼中,不过没什么影响。
直到4月份,我觉得CESM那边的东西是写不完了,要改8k多行的fortran代码对我来说是任务有点重,所以在衡量了沉没成本之后,准备去看wtdbg,我们迅速过了一遍profiling结果和算法,敲定了要改的部分。因为这个应用很大程度上卡访存速度,rgy提出我们可以开巨页,减少TLB miss,我尝试了一下整体性能要提高20%,顿时喜出望外。多机这边MPI进展基本比较顺利,但是因为选了master-slave模型,多机的加速比不是很高,但是比没有要好。
比赛前,突然得知我们只能拿到4块V100,我们商量了一下决定多加几台机器,争取在核数上取得优势。
决赛
day -2
下午,我们几个去机房把系统和各种文件对拷了一份到SSD上,折腾了蛮久。晚上整理了一下wtdbg的东西,也让每个人把自己负责的部分的脚本准备了一下。准备了两套螺丝刀,方便拆机。lkx学长表示可以来帮忙装下机,感觉运维也有保障了)
day -1
下午1点的飞机,4点多就到酒店了,报了一下到(发现我们几乎是最晚到的2333)。和我们的志愿者联系了一下,去食堂吃了个饭(似乎是大工最好吃的食堂了,教职工专属自助,幸福感++)。晚上回酒店催zht写了一下功耗控制的脚本,然后因为旅途劳顿比较早就睡觉了。
day 0
早晨7点起来,跑到比赛现场开始装机。先要了12台机器,为了控制功耗把内存条按每个CPU 96G拆了一半下来,装上GPU,装上我们带的SSD,卸下多余的硬盘仓,到10点多基本就做完了。然后进BIOS配置了一下,浪潮提供的机器主板有点坑,估计是里面跑了一层kvm,所以BIOS只能通过PMI进,而不能直接连显示器上,被坑了蛮久。所有机器的PMI配好之后,插好交换机,就开始dd镜像,但是dd完之后发现主板不支持MBR分区表的设备启动,所以又折腾了一会,重做了分区表。系统全部dd完就已经过了午饭时间,看到旁边北大的同学点了外卖,我们也点了一份外卖2333(物理攻击(笑
这期间,我写脚本拿了一下比赛方提供的功耗网页,给运维备用,然后lkx写了一下从我的电脑create_ap让集群有外网并且其他人可以连我的wifi登录集群的脚本。
然后就是中规中矩的系统配置时间,网络、CUDA、Infiniband、IPoIB、NFS over RDMA、tmpfs…期间出了很多蛮搞笑的事情,比如IB线插反,网线被拔,PMI的telnet操作延迟爆高,等等。所有的东西都做完之后,我们测试了一下MPI,发现Infiniband有点问题,有的机器无法连通,排查了一圈怀疑是IB线的问题,只能第二天测了。
晚上凑到一起讨论了一下第二天要弄哪些东西,主要还是排查IB的问题,跑每个应用来测试功耗曲线,以及其他的一些工作。
day 1
早晨起来,IB莫名其妙又好了,而且速度完全正常,我们就开始跑每个应用了。HPL和HPCG的事情完全交给zht来做,因为我们的机器配置有点差所以功耗方面没什么好控的,HPL跑到22TF,HPCG跑到500GF,基本也算是正常水平了。之后我开始跑CESM,跑起来之后发现10机还是需要限频降风扇,所以考虑了一下降回了8机。wtdbg的多机迟迟跑不起来,Intel MPI似乎又炸了,讨论了一下因为计算量不大,决定之后跑的时候直接用IPoIB & socket。
临走之前,我去四周逛了一下看其他学校的配置,大概有一半的学校用了7机或者8机,有一个学校用了9机,感觉虽然我们没有什么优势但是也不会吃多大的亏。最后测试了一遍就跑路了,好好准备第二天的应用。
day 2
早晨7点多吃了个锅盔就跑进了赛场,8点正式开始比赛。zht用极快的速度跑完了HPL和HPCG,功耗曲线就像我的心情一样毫无波动(成为了全场第一个跑完拿到CESM的学校)(别的学校还没有开始我们就已经结束了)。
CESM拿到的workload和我们之前跑的完全不一样,我们之前在高分辨率上做的一些优化也只能变成负优化,但是估计影响不会大。
我和rgy讨论了一下CESM要使用什么样的PE layout,以及编译参数的问题,开两台机器开始编译,但是编译一直出问题,我排除了一下问题觉得可能是tmpfs的问题,所以换到共享的家目录上开始编译,在11点左右成功跑起来了第一个workload。但是,mpstat看到的CPU idle到了80%,讨论了一下觉得可能是MPI通信耗时太长,估计是MPI还有问题,但是已经没有什么办法了,只能慢慢跑了。因为样例所需时间较长,我们还跑去食堂吃了个饭,顺便讨论了一下策略。
下午拿到了SR的训练集,和我们赛前准备的是同一个数据集,第二天就不需要花太久时间去训练了,省下了大量的时间。
下午2点左右,第一个workload结束了,马上整理一下开始跑第二个workload,然后长舒了一口气,估计应该可以跑完了。但是4点左右的时候我们估算了一下,应该要差半个小时跑不完,zht提出我们可以超频,但是要控风扇,所以我们在几台机器上超频去跑,温度高于70度就开大风扇降温。zht紧盯着屏幕,生怕超功率,我们一度到了2993W,背后全是冷汗。我提前写好了提交的脚本,最后在提交前的一秒钟跑完了workload,敲下提交脚本回车,sync,拔U盘。
晚上根据白天看到的其他队伍的功耗曲线估计了一下,应该只有清华、台湾清华、中山、上交跑完了两个样例,尽管HPL和HPCG不太理想,但是我们第一天的成绩应该是前五。
整理了一下wtdbg的脚本,准备了几个版本,洗洗睡了。
day 3
还是早晨7点多就到了比赛现场,开机之后拿到workload,估算了一下时间觉得问题不大,先交给zht和rgy去跑神秘应用 。神秘应用跑了3个workload之后,因为我们内存不够所以OOM了。
跑去看了一眼榜,我们第一天的成绩是第6,感觉还不错了,跑回去干活。
我写了一下wtdbg的运行脚本,但是发现之前改多机的时候改炸了一些东西导致不能按预期跑24个workload。接下来我做了一个错误的决定,在比赛现场开始改代码,但是因为代码改动太大,下午2点还没能改完。无奈之下,只能开始跑原版,本来原版是可以跑完的,但是我们的ubuntu 14.04 Desktop Version的/tmp并不是tmpfs,而是在根目录下的,我们的运行时间远远超出了预期,当我们发现的时候已经晚了,只能匆忙跑完10个workload然后遗憾地提交了U盘。
一天的比赛结束之后,我已经没有了心情准备明天的答辩,把这个任务交给了英语比较好一点的rgy和why,开始咸鱼。
day 4
上午答辩之后,到附近的购物广场吃了个早饭,石老师也一直在安慰我们,说是第一年成绩已经很不错了,明年加油。但还是心有不甘,觉得没有死在我们有缺陷的地方反而死在了我们认为准备最充分的题目上,我背9成锅。下午颁奖,我们只拿了第8,国立清华是冠军,清华是亚军,中山是季军&E-Prize。
诸多遗憾,只能归咎于准备不够充分,希望明年学弟学妹们能加油啦~