本文篇幅较长,共4部分,分别解答了4个很多人可能关心的问题。这四个问题间的上下文关联不大,可选择性阅读。 1.Folding@home究竟是个什么样的项目? 2.新冠病毒研究,为什么需要算力?算力能为新冠病毒研究提供什么帮助? 3.Folding@home的架构是否真的能够有效利用起全球范围的计算机或更多设备的算力? 4.英伟达为什么重点呼吁PC游戏玩家?
前一阵英伟达官方发推,呼吁PC游戏玩家联合起来对抗2019-nCoV新冠病毒,方法是把自己闲置的GPU算力都捐出来,帮助科学家们做病毒研究[1]。通过采用名为Folding@home(在家折叠?)的软件,就能让每个在家用电脑的人把算力捐出来:每个人一点,就能以全球组合成网络的方式,构建起一个庞大的超级计算机。
微博人民对于英伟达的此次呼吁似乎多有质疑之声,不少人认为这个所谓的Folding@home只是在为他人做嫁衣,无端捐献算力也不知道是拿来做了什么。实际上大规模分布式计算,让Folding@home这样的计划具有十分的可行性,只不过通过并不算可靠的互联网结成这样的分布式结构做计算,带宽之类的问题究竟该怎么解决?以及如果新冠病毒研究真的需求海量算力,为什么不直接采用超算?
这是我们期望通过本文去大致了解的问题。本文篇幅较长,共4部分,分别解答了4个很多人可能关心的问题。这四个问题间的上下文关联不大,可选择性阅读。
1.Folding@home究竟是个什么样的项目?
2.新冠病毒研究,为什么需要算力?算力能为新冠病毒研究提供什么帮助?
3.Folding@home的架构是否真的能够有效利用起全球范围的计算机或更多设备的算力?
4.英伟达为什么重点呼吁PC游戏玩家?
Folding@home是个什么样的项目?虽然我们没办法做到完整细致地回答这几个问题,毕竟其中可能还涉及到相应的生物、医学或病毒学知识,不过勾勒一个框架应该还是可以的。而且理解Folding@home,对于我们参考理解大型项目网络构建也有价值。
针对第一个问题,Folding@home项目的存在历史还是比较久的,其最初发起时间是2000年10月,由斯坦福大学(Stanfor University)的Pande Lab实验室发起。目前参与Folding@home各部分开发的除了Pande实验室以外,还包括了索尼、英伟达、ATI、Cauldron Development等。[2]
Folding@home就是一个分布式计算项目,它主要做的就是蛋白质的分子动力学模拟。最初Folding@home着眼的就是蛋白质折叠(protein folding),现在转向更多的生物医疗研究,包括阿兹海默症、癌症、埃博拉病毒、2019-nCoV等。所以2019-nCoV实际上只是Folding@home研究的一个最新组成部分(于今年3月加入)。
其中的所有大型计算项目,都是由知名研究院校运营或者直接辅助执行的。其实有关2019-nCoV即新冠病毒在Folding@home上的项目具体由谁在推动,这一点我们并没有查到详实的资料。仅知在Folding@home发起呼吁的这位Greg Bowman,目前就是Folding@home的负责人(2019年的新任负责人,也是上一任负责人Pande博士的学生)。Bowman是圣路易斯华盛顿大学的副教授。看起来,2019-nCoV病毒研究项目的发起者就是Folding@home官方。
那么针对这些研究,Folding@home究竟是怎么提供算力的呢?其核心理念就是期望能够利用全球个人计算机的闲置计算资源——当然这些PC需要安装来自Folding@home的客户端软件,至于由谁来安装,那当然就是愿意贡献算力的志愿者了。如此一来,集合全球CPU、GPU各路硬件的算力,就能为科学研究做贡献了。
整个分布式系统实际上比我们阐述得要复杂很多,这在后文还会提到,比如志愿者可以在Folding@home官网上追踪自己的贡献,甚至以贡献算力多少,及积分制的方式相互比较排名;还能组队刷分——Folding@home官网常年更新团队积分排名[3]。让算力贡献在呈现上更加生动和有趣。实际在2009年,Folding@home发布的paper中就提到,为志愿者开发的客户端程序集成了OpenGL,主要是以图形化的方式向志愿者展示蛋白质模拟的情况[4]。Folding@home的团队认为,这种呈现对于科学研究虽然没有多大价值,但是对志愿者去了解正在自家PC上发生什么,帮助Folding@home在人群中扩散是很有帮助的。
这是Folding@home项目一个很小的例子,其整体复杂性都还是比较大的。
从某种意义上来讲,在这些年的发展中,Folding@home已经成为全球性能最彪悍的超算系统——尤其是3月初Folding@home开启了针对新冠病毒的研究项目,为Folding@home整体算力推升到一个新的小高潮。不严谨地说,如今其算力已经达到了768 petaFLOPs。截至3月25日,Folding@home算力达到1.5 x86 exaFLOPs[5],数倍于目前全球最快的超算。
(注:Folding@home给定的算力单位包括native FLOPs,x86 FLOPs等。某一类硬件的每秒浮点运算数即为native FLOPs;x86 FLOPs是指如果将所有算力统统划归为x86 CPU,则有多少FLOPs——GPU的1 native GPU FLOP通常就相当于好多native x86 FLOPs。[6])
很多人对这个算力数字大概没有概念:2007年9月,由于Folding@home加强对PS3的性能利用,以及大量PS3游戏机玩家加入进来,Folding@home算力就推到了1 petaFLOPs。当时Folding@home就成为全球首个跨入到petaFLOPs级别的计算系统,那会儿全球Top 500中最快的超算是BlueGene/L,其算力是0.280 petaFLOPs。
性能在后续还有几波小高潮,比如2009年其算力达到5 petaFLOPs,那时IBM超算Roadrunner的性能是1.105 petaFLOPs;2016年年中,Folding@home超过100 x86 petaFLOPs。实际在今年3月这一个月,Folding@home的等效算力提升是真正飞快的。3月20日,Folding@home在推特上表示其算力达到470 petaFLOPs(958 x86 petaFLOPs),而到了3月25日,这个数字就飞奔到了768 petaFLOPs(1.5 x86 exaFLOPs)。
就科学研究来说,这些数字当然不能代表什么,但Pande Lab实验室已经因此产出了223篇科学研究paper。
这里有个问题可能是很多人更加关注的,即Folding@home产生的研究数据是否公开的问题。因为我们并非科研人员,所以很难理解数据集的透明性如何。这里面实际上涉及到两个问题,其一是志愿者贡献的算力,获得的研究数据或研究结果是否公开;以及Folding@home这套系统本身的软件、硬件是否开源(或足够开源)?
Folding@home曾经提到过来自Folding@home的大型数据集对其他人是公开的,并且随时间推移会有更多数据给出。“我们期望通过对数据的公开,让其他科研人员利用这些数据,也能用于其他的研究。”[7]最早领衔这个项目的Vijay Pande曾在论坛上说过:“根据NIH(美国国立卫生研究院)的规则,所有paper必须免费,但是在发布一年以后。这是科学工作的常规,至于同行评议期刊怎么做是我无法控制的。”(期刊可能会出售这些paper)有关原始数据的问题,“一般我们按需提供,有人需求数据时,我们就会将其公开在网站上。由于数据量非常大,这种按需提供的方法比较合理,我们也无法单独个别处理所有需求。”
而在Folding@home这套系统本身的软件、硬件的开源程度问题,整体我们也很难在短时间内全盘把控。就我们掌握的信息,Folding@home系统本身的打造就离不开很多开源工具,比如Gromacs、TINKER、AMBER、MPICH等[8]。所以它也在为开源社区做贡献,很多组成部分也的确是开源的。比如说后文还会提到,Folding@home的core是基于分子动力学软件包Gromacs,Folding@home自己对其GPU加速开发起到了相当的作用;针对GPU的库OpenMM,为应用开发者和GPU供应商提供相对统一的API等等。
2011年,Folding@home就发布过一个开源的Copernicus软件,基于其MSM(Markov state model,马尔科夫状态模型)以及其他并行方法。主要价值就是针对大型计算机集群和超算,提升分子模拟的效率和规模。这对于其他科学领域的研究也是相当有价值的。
有关数据实际在国际间共享的透明性,以及这些研究数据和开源软件本身可能还涉及到的政治问题,这就是另外一个话题了,这里不再做深入讨论。
算力对新冠病毒研究有什么用?这是个相关生物学研究的问题,理论上应该是生物学媒体更关注的问题,我们简略地谈一谈。研究人员期望搞清楚的是对于2019-nCoV潜在药物靶点(potential drug targets)结构,这样就能设计新的治疗方法。2019-nCoV可以认为是SARS病毒的近亲,行为方式类似。两者的第一步感染就是在肺部发生的,病毒表面的蛋白质会“绑定”到肺细胞的受体蛋白质,这里的受体被称作ACE2。
这里的病毒蛋白被称作纤突蛋白(spike protein),也就是上图中的红色部分。科学家追逐的治疗性抗体,实际上是蛋白质的一种,它的目标就是阻断病毒蛋白与受体绑定,起到阻止病毒感染肺细胞的作用。SARS-CoV的治疗性抗体已经开发出来了。但如果要开发2019-nCoV也就是这次新冠病毒的治疗性抗体,科学家就需要去更好地理解病毒纤突蛋白的结构,以及它究竟是怎样与ACE2受体结合的。
蛋白质会摆动、折叠、展开,形成各种形状。科学家需要研究的,不光是病毒纤突蛋白的一种形状,而是其摆动、折叠成各种形状的方式,这样才能更好地理解它与ACE2受体是如何交互的,如此一来抗体就可以设计出来的。[9]
Folding@home在官网上提到,SARS-CoV病毒的“低分辨率”结构已经有了,外加SARS-CoV和2019-nCoV的已知差别,Folding@home的这个项目就是要帮助构建起2019-nCoV纤突蛋白的结构,并识别抗体的靶点。而构建计算模型是需要海量算力的,这是Folding@home介入的原因。
前文已经提到,Folding@home本身就是致力于理解蛋白质折叠问题的项目。这对于理解蛋白质做什么、如何工作是很有帮助的。这个模拟和理解的过程,也就是computational biology(计算生物学)。蛋白质另外也可能发生错误折叠(misfold),错误折叠会导致各种疾病,比如阿兹海默症。利用计算模型,外加补充实验,理解蛋白质折叠、错误折叠等的完整过程,就非常重要。
由于蛋白质构造,及其可能变化的形状,本身就非常复杂,这个过程对算力需求便非常之高。通用超级计算机也曾一度用于模拟蛋白质折叠过程,不过成本非常高;另外,由于动力学模型计算是连续的,传统分子模拟的规模化执行会非常困难;而且蛋白质折叠是一个随机的过程,随时间推移各种变化。这些对于模拟计算都提出了很大的挑战。
在Folding@home各种模拟轨迹以及新构造发现的过程中,逐渐建立起自适应抽样的马尔科夫状态模型(MSMs)。这种模型法极大地提升了模拟的效率,而且它很适用于分布式计算。一个马尔科夫状态模型构建的时间,与并行模拟数量(比如处理器的数量)成反比。也就是说,并行数越多,模拟效率就越高。
Folding@home利用马尔科夫状态模型,来给蛋白质可能的形状和折叠路径建模
一个完整的马尔科夫状态模型可能包含了数万个蛋白质相空间(phase space,蛋白质可形成的所有构造)的样本状态,以及不同状态间的转变过程。这样一个模型表征到了折叠事件、路径等。研究人员利用这些模型,可了解蛋白质如何折叠,并结合试验,与模拟做对比。
虽然我们并不清楚这次新冠病毒纤突蛋白研究需要投入多少算力,以及需要多久。不过就其原理看来,投入算力也是聚少成多的过程,或者说,其效力大约很难在短期内体现出来——所以即便越来越多的人由于本次新冠病毒而参与Folding@home项目,它也无法立刻显现出成效,并让计算生物学即刻显现出多大的威力,这毕竟是个长久的项目。
Folding@home的系统架构如何?采用互联网构成一个分布式计算网络,其带宽和存储问题怎么解决,应该是我们更关心的一个问题;毕竟互联网和超算中的本地网络比起来实在是太慢了。理解了这个问题,也就可以回答,Folding@home架构对于科学研究是否真的有价值,或者Folding@home对于全球算力利用是否真的有效了。
我们能够找到的Folding@home发布相对详细的解释,实际是2009年的一篇paper[4],在这10多年内,其整体架构应该又有了变化,所以下面的阐述大概会相对落后。但我们相信,其大框架应该是不变的。
客户端界面
首先有必要谈一谈志愿者一侧,也就是用户的软件组成。用户端的软件主要包括了work units、core、client(客户端)。
(1)每一个work unit,就是客户端要求处理的一部分蛋白质数据。work unit实际上就是马尔科夫状态模型不同状态间模拟的一小部分。客户端会自动下载work unit,然后进行计算,再返回给Folding@home的服务器,服务器就会给予一定的积分奖励。
为了保证计算的效率,所有的work unit都有个计算的截止时间,如果超过截止时间还没有计算结束,则这个work unit就会自动移交给其他人。前文就已经提到了,蛋白质折叠是一个连续的过程,许多work unit的生成,都依赖于上一个work unit,所以设立这样的截止时间是非常有必要的。针对更高性能的客户端,会有更短的截止时间设定。
(2)一个特定的分子动力学程序,就是一个core。针对这些core,work unit作为后台进程去执行计算。Folding@home的绝大部分core都基于前文就提到的Gromacs,也就是一个开源的软件包,其中主要包括了手动优化过的汇编语言代码和硬件优化方案。core是独立于client客户端的,这样一来,在不需要更新客户端的情况下就能更新科学方法。另外,core还周期性地创建计算检查点(checkpoint),在计算被打断的情况下,后续可以从这个点上再开始。
(3)Client自然就是指运行在PC(或者其他用户终端)的客户端程序了,用户和客户端进行交互。Client与Folding@home服务器联系:获取和上传work unit;根据用户设置、操作系统、底层硬件架构下载相应的core。
在client上,用户可以暂停折叠进程,查看事件日志,检查进度,或者查看个人数据-比如积分之类。Client以很低的优先级持续跑在后台,仅使用闲置算力,确保设备的日常使用不会受到影响(用户可以自行设置Folding@home如何使用自己设备的资源)。Client部分的软件开发团队,包括来自英伟达、ATI、索尼、Cauldron Development的程序员。程序本体似乎已经经过了多次迭代,据说最早的客户端是个屏幕保护程序,仅在计算机不使用的时候才会运行。
扩展到整个分布式网络部署,则会更复杂一些。很容易想见,Folding@home就是个客户端-服务器这样一个CS结构。首先志愿者在自己的设备上安装客户端,会有一台分配服务器(assignment server)为客户端分配一台工作服务器(work server)。随后客户端与工作服务器通讯,获取work unit——work unit具体就是一组文件;根据分配到的work unit,客户端可能还需要从web服务器下载core。
在计算工作结束后,客户端将结果发回给相同的工作服务器;工作服务器再收集日志文件和积分数据,并交给数据服务器(statistics server),并显示给志愿者们看。
如果我们再细致的剖析一下,整个架构在任务调度、指派、执行等各方各面,都很像是一个放大版的CPU或超算网络。工作服务器(work server)会生成work unit,并且分析接下来需要完成什么工作:前一个计算得到的结果需要用于生成后续任务。每台工作服务器都承载了很多的项目,且由不同的研究人员管理。
分配服务器(assignment server)是一个全局调度机(scheduler),还要确保整个系统负载均衡。客户端首先联系的实际上就是分配服务器。项目优先级本身就受很多因素影响,另外还要结合客户端的各种参数(比如客户端的硬件配置、系统版本、网络带宽、可靠性等)做出工作分配决策。Collection服务器则是一种冗余方案,在客户端无法将结果上传给work服务器时,就会启用。
除此之外,当然还需要有一个专门给用户看的数据网站——志愿者们可以在网站上看到他们自己贡献的成果。这就是数据服务器(statistics server)的工作了,其上还包括分配给志愿者或者团队的积分。数据服务器需要从工作服务器周期性地获取日志文件,以给用户呈现数据。另外网站上面还有社区论坛,这些论坛通常也是志愿者在维护的,交流和提供技术支持,还有用户反馈等。
这就是Folding@home的基本运作方式了。不难发现,这并不是一个对实时性要求很高的系统:其重点还在于大规模并行运算能力,它对整个系统的带宽、延迟并没有那么敏感。另外,上面的描述仅是个梗概,而且这个框架是10年前的,当年Folding@home还提到过系统后端可能存在的瓶颈,所以那会儿就提出了分布式存储Storage@home,以提升运算结果处理的效果。不过这个项目很快搁浅,原因未知[9]。
为什么特别呼吁PC玩家参与?在耗费最低成本的前提下,随加入Folding@home的设备越来越多,实现摩尔定律增长——这也是一个很有意思的说法,就类似于处理器的执行单元可以无限增加一样。而回答“为什么特别呼吁PC玩家参与”,拍脑袋就知道是因为PC玩家的设备性能强,捐的算力就多。
给出算力的第一选择,在Folding@home诞生之时必然是CPU。其完整形式的个人电脑,自然成为捐献算力的一个完美载体。不过在Folding@home经历的这20年历史上,参与到算力捐献的设备并不只有PC,还包括了PS3游戏机、索尼Android手机。甚至2014年,借由谷歌Chrome浏览器的NaCl特性,还能让Folding@home跑在一个沙盒里,这样一来Chrome浏览器就能直接跑Folding@home。但去年6月NaCl已经不在,Folding@home的web客户端也就没有了。
这其中比较令人在意的是PS3游戏机:PS3在Folding@home项目上的服役时间还不短。PS3游戏机的流处理器对于某些计算而言,提供超过PC多达20倍的速度,让PS3成为Folding@home算力上的一支超强战力。Folding@home的PS3客户端,是由索尼和Pande Lab合作开发的,发布时间是2007年3月。当时这个客户端的介绍中提到,它同时利用了CPU的弹性和GPU的速度。
事实上,那个年代GPGPU还不流行。不过PS3是一个固定的环境,做技术支持和开发也就比较容易。那会儿Folding@home的PS3客户端有个比较尴尬的问题,即PS3用户在跑客户端的时候,就不能做别的事情。可是即便如此,在2012年,索尼正式结束对Folding@home PS客户端支持之际,依然有1500万PS3用户,贡献了超过1亿小时的算力。
像蛋白质折叠相关的计算,要求高度并行的计算能力,是Folding@home早就注意到的。所以Folding@home很早就实现了对CPU多核心的充分利用,多核并行能够在相同的时间内实现更长的模拟路径,也就没有必要再把模拟分派给不同的处理器。2006年11月,Folding@home的SMP(对称多处理)客户端进入开放beta测试阶段。这个客户端采用MPI通讯协议进行并行处理,这也是历史上分布式计算项目首次使用MPI。
随后Folding@home也随硬件本身的发展,实现更多算力的获取。比如在SMP2客户端发布之后,某一类名为bigadv的work unit就要求至少8个CPU核心来计算,而且还对内存和互联网带宽资源提出了要求。当然,如果志愿者能够跑得了这样的work unit,就能获得多加20%的额外积分。比较有趣的是,后来SMP2客户端将bigadv的硬件要求提升到至少16个核心,而那些8核CPU用户就只能跑常规的work unit了。据说这事儿伤害到了很多用户,因为他们为了Folding@home在硬件上也花了很多钱,于是在很多人的反馈之下,Pande终止了bigadv。
Folding@home团队
事实上,在谈到高度并行计算的时候,GPU已经成为当代的首选——看看AI training发展如火如荼就知道了。不过早年的GPU编程还是相当有难度的,尤其GPU市场还有不同架构和选择。Folding@home采用开源的OpenMM库——这个库采用一种桥接设计模式,有两个API层级,连接分子模拟软件和底层的硬件架构。加上额外的硬件优化,基于OpenMM的GPU模拟,程序并不需要多大改动就能获得据说是接近于手动调整的GPU代码性能,当然也远超CPU的算力。
Folding@home的第一代GPU支持客户端,是在2006年10月发布的。这也是史上头一次GPU应用到分布式计算中。研究人员也是从这个时候开始积累起GPGPU软件开发的经验。二代GPU客户端开始对英伟达的CUDA,以及ATI的GPU做出更到位的支持,支持更高级的算法更大型的蛋白质,而且还能做模拟的实时视觉呈现。
很多年前,GPU就已经是Folding@home贡献算力最大的组成部分。2012年11月,GPU客户端占到整个项目算力吞吐的87%。
现在GPU通用计算发展得这么风生水起,我们去年参加英伟达的GTC大会,英伟达宣传的就是自家GPU已经应用到了多少不同的领域,而早就不限于图形计算[10]。去年英伟达平台应用就开始支持全基因组测序(NVIDIA PARABRICKS基因组分析工具包),3月20日英伟达发布的新闻稿就提到开始向研究人员免费提供PARABRICKS软件,主要用于新型冠状病毒和COVID-19确诊者的基因组测序。
这就已经完美解答英伟达为何呼吁PC游戏玩家参与Folding@home了,因为游戏玩家的GPU一般都更出色。
一些花絮与下载地址以上我们就基本把Folding@home这个项目大致说清楚了。事实上项目面临的挑战也远没有我们想象得那么简单,在查阅资料的过程中还是发现了一些项目组有趣的吐槽。比如说Folding@home曾提到,数据系统遭遇的一个挑战是,有一小撮志愿者为了提高他们的积分,会作弊。有一些人甚至采用种植木马的方式,把客户端装到别人的电脑上,然后用别人电脑的算力给自己赚积分——听起来就跟挖矿木马一样。
而Folding@home在客户端层面面临的最大挑战还在于,现有硬件平台的多样化。“存在几近无数种硬件、软件、驱动的组合方式,也就是说在进行客户端开发时,要花海量的时间去处理不兼容的问题。”而在硬件架构变化时,又要进行core的移植和测试工作,并对客户端进行重新编译,“毕竟计算机总是要随时间做各种升级。”早年苹果从PPC迁往x86,就得做很多工作。
最后提供一下Folding@home客户端的下载地址,当前macOS、Windows、Android、Linux都支持,具体的使用方法有兴趣的各位可以自行体验尝试:https://foldingathome.org/iamoneinamillion/