ASC19 杂记

ASC19 终于结束了——折腾了我们将近四个月、聚集了我们无尽的怨念,最后也只薅了个一等奖灰溜溜地回来了。回想起来,五味杂陈。

踏入 ASC 这一深坑,也是吃了杜姐姐的安利:某个极为硬核的比赛!GPU!并行计算!那还是去年的 11 月,想到寒假可能无所事事,就答应了下来,募集了一下队伍,踏上了不归路。

初赛

初赛,其实就一个文档赛。主办方下发题目,队伍进行编译、运行、调优,写成文档。

报名队伍三百多支:前二十名进决赛,保底一等奖;二十一至六十还是八十名获二等奖。

环境

既然是超算竞赛,那总得有超算吧……可惜你电没有超算中心,只有各个实验室零散的小集群。

于是联系了去年和工作室合作参赛的实验室,顺利拿到了账号。虽然是 17 年的机器,16 年的 CPU,14 年的 GPU,13 年的 MIC 卡,不过好歹有八台,能用。

然而……

妈的这群研究生天天来抢机子用啊!当然,他们是正当使用,但是能不能拜托他们,不要两台 GPU 机器上各用一张卡啊!能不能不要在三台机器上各吃四个核啊!一台机子 28 核,先把一台用完好不好啊!

加了他们集群的 QQ 群,然而在里面说话无甚卵用:他们经常多个人共用一个账号,看到有奇怪的进程也不定位是谁开的;有的人根本不在群里。

然后上面的环境……混乱,极为混乱。主节点一个 NFS 挂载到各计算节点,各种环境满天飘,天天炸硬盘。系统版本老旧,还只有主节点能连外网,计算节点需要设置代理。

更别说这集群还是千兆以太网互联了。鉴于 GPU 节点只有两台,我自己买了一对二手上古 InfiniBand 卡,把它们直连了起来。

最蛋疼的是,春节期间因为机房断电,集群关机了两周。在这两周时间里,我们到处借其他实验室的机器,甚至在谷歌云上开 GPU 机器跑题,给题目封装容器方便三天两头迁移,不知道砸了多少时间和💰进去……

算了,过都过了。

题目

今年的题目,说实就一个词:恶心。

没看过往年的题目,但今年的简直非人。除了每年都有的那几道,没有一道有任何改进的空间(对我等菜鸡而言)。

HPL & HPCG

年经题。跑分题。

折腾了很久,因为知道每年都有这题,所以在初赛开始之前就在研究了。

最开始是用的开源 GPU 版代码,很上古。一台两张物理 K80 的机子,往死里跑也只有 2 TFLOP/s 多一点。

然后向英伟达要了最新版 CUDA 的内部闭源版,一下翻番。最终结果是单机 4.5 TFLOP/s 左右。InfiniBand 直连,双机四张物理 K80,8.717 TFLOP/s。对这种古董卡而言很不错了。

当然,达到这么高还是调了很久的。HPL 的一亿个参数那是常规操作,直接配置文件里写好候选参数,程序会自动组合,挂在那跑就是了。虽然中途充斥着和研究生的巧取豪夺、谈判妥协。

调参过程中,更有趣的是一些骚操作:GPU 参数相关、NUMA 相关……综合起来能有 10% 的提升吧。

文档里,自然要吹这些各类参数的优化。不过最大的亮点我觉得还是 @Riley 做的 HPL 算法分析。数学的东西,很骚,很强大。我看不懂,真的厉害。

巨骚的根据 L1 缓存计算 NB 取值

而 HPCG,就一个问题规模的参数,其他的优化照搬 HPL 即可,没啥意思,嫌弃。

集群设计

年经题。意淫题。

大概就是自由设计一个 3000 W 功耗的集群,使用指定的浪潮(也是 ASC 赞助商之一)某型号的机器,达成最大理论性能。需要描述软硬件环境、设计思路,还有估计性能、分析优缺点。

这就很爽了,YY 谁不会呢?高端 CPU!顶尖 GPU!固态硬盘!最后把理论功耗逼到了 2998 瓦。

个人感觉亮点在可行性分析。好歹我也玩了三年的实体服(yáng)务(lā)器(jī),把网上往年其他队伍的设计 diss 了一顿,曰:你们这是不行的!根本开机都开不起来!然后曰:我们这个设计,绝对能用!而且实际利用率贼高!

分析完,还贴了个服务器手册里的硬件架构图上去,装得贼牛逼。

NF5280M5 的逻辑架构图

至于缺点分析,我就写了一句:太贵了。

超分辨率

从前年开始的、每年一道的机器学习题。什么是超分辨率?waifu2x 就是。

限定使用 PyTorch 框架,将图像放大四倍,要求某个质量损失评估函数分值最低。

其实比较常规——主要问题是我们没人会 AI

蛋疼。基础代码也不给。然而网上一搜,这题就是去年某比赛的原题。

于是直接把别人冠军的开源代码扒下来用了。

当然,我们是打不过别人的:一月份去北京「培训」,一屋子的人全都在看机器学习的论文。(顺便一提,说是培训,其实主要是英特尔和英伟达的广告大会。食宿路费都不包,我至今还在等你电的报销。)

修修改改,还是交了。不懂机器学习,不予置评。

气候模型

艹他妈的 CESM。

好了,发泄完了。且让我讲讲这个来自上个世纪的 Fortran 程序。

CESM 是什么?啥啥啥气象模型。总之就是模拟地球气候变化的。采用在科学界死而不僵的 Fortran 语言,最古老的代码可以追溯至上世纪七十年代,主体在 2000 年前后写成。

其实把这东西编译出来、稳定地运行,就花了两周的时间。期间改了一千个 bug,踩了一亿个坑。(短短一句话,老子千行泪)

然后就是优化咯——咋优化啊?除了换编译器、改编译参数等常规操作,对这个代码真的是无从下手:

  • 黑洞一样深的调用栈:除非手动内联,基本不可能移植上层函数到 GPU。
  • 普朗克时间的函数长度:移植底层函数到 GPU 时,90% 时间花在了数据传输和 kernel 调用。
  • 循环之间的依赖性:求求你们科学家,重写吧!
  • 极差的 SIMD 指令支持:Profile 出来 3.4% 的浮点计算单元利用率……在 CPU 上也跑不好。
  • 傻逼 Fortran 语言:跨编译器无法链接,和 C 互操作性也极差,数组方向都不同。
  • 搞不懂的气候学:算法根本看不懂,改你🐴呢。

以上缺点,我在文档中统统文雅地说了一遍。实质性的修改,就只有一个傅立叶变换的库——1970 年生产,唯一的软柿子。我用 OpenACC 把它移植到 GPU 了!(短短一句话,老子千行泪)

然后整个程序的速度慢了几十倍。

想体验绝望吗?下载 PGI 编译器,使用 OpenACC 吧!让我最后把它改到在 GPU 上跑只让程序变慢 5% 时,我感觉自己要成仙了。

最鬼畜的是什么呢?Fortran 要用 CUDA(或者 OpenACC),必须用 PGI 编译器;而 PGI 编译器编译出来的 CESM,速度只有 Intel 编译器的 3/4。

所以,我在竭力优化之后,性能终于达到了 Intel 编译器的 75% * 95%。而 Fortran 跨编译器无法链接,做不到只把用到 GPU 的部分用 PGI 编译。

混合编译也不是不行,加一堆 C 语言的适配器就好。@Riley 就试图上 cuFFT 这个库,写了 Fortran、C、CUDA、OpenACC 互操作的一堆东西。链接成功了,很强大,然后程序整个慢了好几倍。

没办法,我也想找块豆腐撞死。

不过呢,初赛文档吹水素材是够了。做一点深入分析,给出这东西不适合移植 GPU 乃至根本难以优化的一万个理由。然后贴一堆 profile 截图上去,表明尽管如此艰难,我们还是做到了一定程度的优化。

狂喷 CESM 一隅

总结

这个初赛,那是真的吃掉了我整个寒假。基本上天天起床就开始折腾,直到睡觉。

要说学习,那的确还是学到东西了的:MPI、OpenMP、OpenACC(呕)、CUDA……虽然不是特别深入,但也能作为未来的一个预备吧。

虽说如此,今年的题目是不得不吐槽的(尤其从决赛来看更是如此)。其实现在来看,CESM 这玩意可能更适合移植到 Intel 的 MIC 卡。奈何实验室里的 MIC 卡过于古老,而我们又拘泥于 GPU,更何况 MIC 卡都过气了

另一个问题是人员安排。队伍五个人,三个人都去做 AI 题,然而都是零基础。在这种情况下,我们无论投入几个人,都肯定打不过有基础的队伍的。所以,这道题就应该只派一个人,直接在网上拖份现成代码跑跑完事。

三月二号交上文档,还是忐忑了好几天的。不过看到进了决赛,还是十二名,老师好像比我们更激动,说这是西南高校零的突破。笑,我高兴的只是至少能和砸出去的钱和时间平衡一下了。

决赛

进决赛也非事事舒服:四月底的决赛,又要折腾接近两个月,又要和研究生斗智斗勇好多天。

更别说,比赛那几天还刚好学年体测。今年比赛咕掉、明年实习咕掉,那后年不是得两天跑 3 km?阿伟死了。

环境

提前找主办方的支持单位借了四张 v100——统一的,每个参赛队伍都能领。六万一张的卡,真的是比我还贵。(然而北航有 16 张 v100,自己准备了 12 张。)

不过脑残的是什么呢?决赛的时候没装 GPU。不想谈这事了,我脑残,我傻逼,带偏了队伍。因为本来想组纯 CPU 集群,但我没意识到 GPU 直接空载也不过多几十瓦功率。

在申请硬件时,只写了三个节点。到现场一看,全场最少。别人都是七八九十台。这又是为什么呢?因为三月底就要提交配置,当时还以为能搞到很多张 v100,想组的是纯 GPU 节点。别问我这想法哪来的。

到了现场醍醐灌顶,瞬间找主办方升级到了十台。后来因为功率砍到了八台。

十台时刻的集群

总之,现场的集群就是八台机子的纯 CPU 集群。虽然很荣幸的是,我们的集群一次也没爆过功率。

每台机子只插了一个电源,拆了一半内存只留了 192 GB(事实证明绰绰有余)。克服一些鬼畜的 bug 之后,装上了最新的 CentOS 与 Mellanox 版 InfiniBand 驱动。编译器也是最新的 Intel Parallel Studio。

比赛过程中不时有老外来采访,还有领导巡视。

题目

决赛题目除了 HPL、HPCG、CESM,还有 FaceSR——初赛的超分辨率改成的人脸超分辨率,wtdbg2——某奇妙的基因组装软件。另有一道团队竞赛题(四个队伍组成一个团队解题)和一道神秘应用。

HPL & HPCG

别提了。显卡都没装。炸了。

CESM

一句话:几乎没动。

好吧,其实动了的。在那漫长的一个月里,我把 FFT 的库换成了 MKL 中的 FFT,提升效果比 GPU 明显多了。而且是 Intel 编译器!

不过 FFT 占用的总时间也只有不到 5% 吧。或许 MKL 的 FFT 快了一倍,不过又如何呢?

在现场,3 个 workload,4 个 case。第一个 workload 跑完,第二个段错误(CESM 日常,而且是我之前遇到过的,后来也不知道咋解决的),而第三个只能跑完第一个 case。

成吧。至少拿了几分。

FaceSR

本来说另找轮子。没找到现成的。于是咕了。

最后还是用的初赛的那个通用模型。然后试图给它喂人脸训练。v100 训练挺快的,然后生成的图全部绿了。

没办法,md AI 谁会啊!

wtdbg2

我想骂人。@Riley 大概更想骂人。

链接挂出来:https://github.com/ruanjue/wtdbg2。有兴趣的可以自行观赏。

不说这是干啥的了,我也不太清楚。作者怎么写程序的呢?宏定义;宏定义调宏定义;里面再调宏定义。把 pthread 用宏定义包装了一遍,做成了自己的线程库。自己手糊了个 list 库。

你们科学家写代码太可怕了

然后,我们不约而同地以为这是要我们把它移植到 GPU 去。

我在三天之内发现了这个想法多么荒谬,几乎再也没碰过这玩意。可 @Riley 实打实地改了个把月……最后,甚至改到了 CUDA 编译器编译成功。

谁知决赛文档上说,我们只需要调这东西的运行参数就好。

此处应有某些表达愤怒的东西。

不说了,伤心。

最后自暴自弃了,然后结果应该是自爆了。

申必题目

ShengBTE,又一个国产科学计算软件。它做的事情我都找不到中文翻译。

代码也挺老的,六七年前的吧。Fortran 写就,纯 CPU。里面有一个坏掉的 makefile,不适应现代编译器。修改后能跑起来。MPI 什么的都是现成的。

跑完了分值最低的一个 workload。然后,第二低的段错误,第三低的内存不足。

当时在赛场上,尽管挺冷的,但脑子也处于糊掉了的状态。段错误?改不来。内存不足?加 swap。我阻止了加 swap 这一危险的想法,而是降低了进程数目。可是就算降低,跑一阵后还是内存不足。

于是我们放弃了这道题。当天比赛结束后,官方微信发的文章里包含了这道题,说到「内存溢出是一大难点」。

蛤?内存溢出?Excuse me?原来我们还要在一个白天的时间内给你发现并修复 bug 的?

我服了。组委会牛逼。

团队题目

呵呵。ASC 编译大赛。

题目是 Fluidity。分到了和清华、南科大、华沙联队一组。前两天配集群的时间,第一天就把题发下来了,然后一天没动静,第二天开始狂战,第三天就开始跑——要是我们编译成功了的话。

这个 Fluidity,本来有新版,但是主办方曰,强烈建议使用某古董版本,结果不一致会判零分。

然后这个古董版本……呵呵。

总之,最后只有一个团队编译出了这玩意。然后他们拿了团队题冠军。

大连

我不得不狠狠喷一下大连。

首先是,根本没有从成都到大连的火车,绿皮都没有,沈阳转车要屁股坐烂。傻逼计算机学院坚持只报火车,听闻飞机票比火车票便宜之后,曰:你们买最便宜的飞机票吧。

于是凌晨五点飞过去,凌晨两点飞回来。每次都要转机,往返各五小时。

再就是,极寒地狱,狂风骤雨。比成都低十度,去了嗓子就废了,直到现在都还没好,咳得像肺痨。而且可能因为纬度高又靠东,餐厅八点钟就关得差不多了。

至于大连理工,客观评价:荒芜。到处都是挖开的路,走在路上一张嘴一舌头灰,推土机一开过去就是沙尘暴;晚上十点,冷清得如同这里的凌晨三点;很多地方没有路灯,两边还布满那种只有枝条没有叶子的树,略恐怖。

这里还好,至少还有路灯

稍微好点的,也就只有吃的了。大连理工给参赛选手吃的都是教师自助食堂,味道不错,据本校学生说从来没见过这么好的。校内校外的海鲜也都挺好吃的,除了比较贵。

但是,这还是弥补不了我嗓子废到现在的创伤啊。

总结

最后一天在大连理工附近某个科技中心,答辩、颁奖仪式,第二天又「玩」了一天,溜之大吉。

最终还是只拿了一个保底一等奖,不过这完全是意料之内。

仔细算来,决赛乃至整场比赛失误不断。不过再转念一想,没有这些失误是不可能的,而且以我们的水平,没有失误大概也拿不到更高的奖项。毕竟对超算、并行计算啥的全都没经验,然后你电的比赛环境也的确……恶劣。

而且呢,反正我是觉得,今年的赛题没啥意思。且不说 HPL 这些例行烧钱大赛,其他几个题根本无从下手,处于不可做的状态。

不知道明年你电还有没有人参赛,我们是不可能了。实习的实习,考研的考研。

ASC19 杂记”已有6条评论

  1. 您好,请问初赛提交的文档还在吗,可以分享给我吗,我是ASC20的参赛者,想看下文档参考一下,谢谢您了

  2. 学长你好,你真的好强啊。大一小白我参加了ASC20,目前在HPL的优化上遇到的一定瓶颈,怎么都调不上去,我想学长是调的那些GPU参数,还有NUMA这些相关的10%的提升能否稍微和我讲解一下,还有就是NVIDIA的最新版CUDA的内部闭源版能否发个我一份,如果您能回复我的话真的很感激
    [email protected]

  3. 我是上一楼的大一小白,联系方式忘记留了:
    QQ:2178449776