Linux 世界中的自然选择
天文学家们担心恒星是如何运作的。我们目前的模型将恒星描述为巨大的、炽热的气球,因内部深处将氢燃烧成氦并在此过程中释放能量的聚变炉而膨胀和发光。一种内部恒温器使它们保持稳定,因此我们的星球在其围绕恒星——太阳的轨道上享受着舒适的环境。大约在 60 亿年后左右,所有可用的燃料都将燃尽,并且随着燃料的减少,太阳将膨胀,然后收缩,直到它比现在小 100 倍,变成一颗白矮星。在内部,在炉膛的灰烬中,将写着它的核历史。
我们通过观察许多不同的恒星拼凑出了这个故事,这些恒星的寿命比我们长得多,但我们无法看到任何一颗恒星的内部。恒星非常明亮但完全不透明。地质学家们已经构建了地球内部的详细图像,尽管它也是不透明的;他们通过观察地震的压缩波在内部震动并返回地表来做到这一点:地震学。非常幸运的是,我们发现一些白矮星一直在内部振动,类似于地震。它们亮度的快速变化告诉我们内部正在发生什么:星震学。
为了利用这种宇宙恩惠,我们构建了恒星的计算机模型,其中可调参数一对一地反映了内部发生的物理过程。我们必须“振动”我们的模型并调整其参数,直到该模型的行为像一颗真正的恒星。然后我们相信我们模型中的参数告诉我们关于白矮星内部的物理特性。然后我们可以开始阅读写在那里的历史。

图 1. 进化中的企鹅
基本想法很巧妙,但实践起来有点复杂。这些模型有许多参数,并非所有参数都相互独立,而且我们不能完全确定我们掌握了所有正确的物理原理。为了确保我们使用的模型参数集最适合观察到的行为并且是唯一合理的参数集,我们必须探索一个非常大的多维参数空间——它太大太复杂,无法进行详尽的检查。没有现有的计算机可以处理它。不过,有一种方法:我们在巨大的参数空间中随机填充模型,这些模型的参数涵盖了整个范围。然后我们将它们繁殖在一起,优先允许那些与观测结果相当吻合的模型存活到后代。这种适者生存是通过“遗传算法”完成的,该算法以粗略但有效的方式模拟了查尔斯·达尔文提出的自然选择过程。
即使使用这种技巧,也需要大量的计算,因此我们构建了一个大规模并行系统,将运行时间从几周缩短到几小时。大多数模型计算都是用浮点运算完成的,因此我们以 flops(每秒浮点运算次数)来衡量性能。我们组装的系统,称为元计算机,能够达到每秒超过 2 千兆次浮点运算——对于 Linux 机器的集合来说还不错。
我们设计该系统的策略是极简主义;保持每个计算机节点尽可能便宜和简单,同时与完成我们的工作并获得最大计算性价比相一致。我们的预算相当有限。CPU 成本不是速度的线性函数,因此对于市场上最快的 CPU,您为每兆次浮点运算支付的费用要高得多。旧的 CPU 价格更便宜,但需要更多的机箱和配套电子设备才能获得相同的最终性能。我们密切关注价格下跌,并在 300MHz Intel P-II 降至 300 美元以下后立即采取行动。我们有能力用 22,000 美元的预算购买一台好的主控计算机和 32 个计算节点。

图 2. 计算机实验室
在我们确定设计后不久,我们通过《Linux Journal》(见资源)上的一篇文章了解了 Beowulf 机器的存在——也是运行 Linux 的并行系统,但以太网连接速度更快,存储空间比我们的问题所需的多。它们比我们构建的系统更通用,因此它们可以处理我们系统无法处理的许多问题。它们的成本也更高。
我们的主控计算机是一台 Pentium-II 333 MHz 系统,配备 128MB SDRAM 和两个 8.4GB 硬盘。它有两块 NE-2000 兼容网卡,每块网卡使用简单的 10base-2 同轴网络连接到 16 个节点。我们从当地一家折扣计算机商店获得的组件组装了这些节点。每个节点都配备了一个 Pentium-II 300 MHz 处理器,安装在 ATX 塔式机箱中,配备 32MB SDRAM 和一块 NE-2000 兼容网卡。我们使用了廉价的 32KB EPROM,使用 BP Microsystems EP-1 编程,并使用 Gero Kuhlmann 的 Netboot 软件包中的 ROM 镜像,允许每个节点从网络启动。
配置软件并不比设置无盘 Linux 机器复杂多少(请参阅 Robert Nemkin 的无盘 Linux Mini-HOWTO)。主要区别在于我们通过为每个节点提供相同的独立文件系统而不是挂载共享网络文件系统来最大限度地减少网络流量。由于节点没有硬盘,我们需要创建一个独立的、可以在 32MB 内存的适度部分中挂载的文件系统。
为了创建这个根文件系统,我们使用了 Tom Fawcett 的 YARD 软件包 (http://www.croftj.net/~fawcett/yard/)。虽然 Yard 旨在制作救援磁盘,但它也非常适合我们的需求。我们在文件系统中包含了一个精简的、仅执行的 PVM(并行虚拟机)软件发行版,该软件由橡树岭国家实验室开发 (http://www.epm.ornl.gov/pvm/)。PVM 允许代码在系统上并行运行,方法是在每个节点上启动一个守护进程,并使用消息传递例程库来协调来自主控计算机的任务。
我们将主控计算机配置为 BOOTP/TFTP 服务器,允许每个节点下载引导镜像——本质上是内核镜像和压缩根文件系统的串联。我们使用 Netboot 软件包 (http://www.han.de/~gero/netboot/) 使用 YARD 创建的根文件系统和为节点定制编译的小内核镜像来创建此引导镜像。
在主控计算机启动并运行后,我们一次打开一个节点。默认情况下,每个节点中的 BIOS 都会尝试首先从网络启动。它在网卡上找到引导 ROM,ROM 镜像通过网络广播 BOOTP 请求。当服务器收到请求时,它会识别关联的硬件地址,分配相应的 IP 地址,并允许请求节点下载引导镜像。节点将内核镜像加载到内存中,创建一个 8MB 的初始 RAM 磁盘,挂载根文件系统,并执行一个 rc 脚本,该脚本启动必要的服务和守护进程。
一旦所有节点都启动,我们登录到服务器并启动 PVM 守护进程。每个节点主目录中的 rhosts 文件允许服务器启动守护进程。然后,我们可以并行运行任何使用 PVM 库例程并包含在根文件系统中的可执行文件。
对于我们的问题,驻留在节点上的可执行文件涉及构建和振动白矮星模型,并将由此产生的理论频率与在真实白矮星中观察到的频率进行比较。在主控计算机上运行的遗传算法负责向每个节点发送模型参数集,并根据结果修改参数集。我们使用与我们的白矮星项目相同的遗传算法主程序测试了完成的元计算机的性能,但节点程序的计算强度较低。使用所有 32 个节点运行代码的速度比使用单个节点快 29.5 倍。我们的测试还表明,计算与通信比率更高的节点程序会产生更高的效率。我们预计白矮星代码的计算强度大约是我们测试问题的十倍。
在三个多月没有事故发生后,其中一个节点突然死机。事实证明,电源坏了,在这个过程中烧毁了主板和 CPU 风扇。处理器过热,自行关闭,并触发了警报。我们现在手头保留了一些备用的 CPU 风扇和电源。这是我们系统遇到的唯一真正的问题,而且很容易诊断和修复。
Linux、PVM、Netboot 和 YARD 等开源软件的可用性使这个项目成为可能。如果我们不得不花费有限预算的很大一部分来购买软件和硬件,并且如果我们无法在我们拥有软件后对其进行修改以满足我们的需求,我们永远不会考虑以这种方式进行。这是我们以前没有讨论过的开源运动的一个方面——在投入大量资金并怀着一切都会好转的美好希望之前,能够尝试一些新事物并证明它是可行的。

