在为科学领域开发应用程序时,有时您需要超越桌面环境,但快速的单节点系统也可能足够。在我作为研究人员和科学软件开发人员的生涯中,我有机会在各种不同的系统上工作,从处理旧数据的系统到地球上一些最大的超级计算机。
单系统
由于许可限制、硬件预算以及许多其他因素,单系统非常常见,并且它们的管理方式相当临时。它们可能需要 NVIDIA 显卡的特殊驱动程序,但除此之外,它们的安装和配置旨在良好地运行一些应用程序。它们还依赖于少数研究人员之间资源的临时共享,并由学生、博士后研究员或在某些情况下由研究人员进行更新和维护。这就是让我对 Gentoo 产生兴趣的原因之一:最大限度地发挥系统的性能。那时,64 位处理器仍然很新,因此运行 64 位系统是很时髦的。
这些系统通常设置为在不连接显示器的情况下运行,而 Linux 是一个显而易见的选择,使用 SSH 进行远程访问和管理。少数人,或者在我的情况下通常只有我,拥有 root 权限,其他人可以登录并完成他们的工作。它们仅暴露于本地网络,文件通过 SCP 传输。一两个系统具有 Samba 共享,以便 Windows 和 Mac 用户可以使用他们自己熟悉的工具更轻松地共享文件。单系统允许针对特定目的进行大量专业化,并且在研究小组环境中可以非常有效地共享。
小型研究集群
这种设置非常常见,它是特定研究小组的专用集群的混合,或者是购买一组额外的节点以添加到更大的部门集群中。这些机器可能由专职人员管理,或者可能由研究小组成员负责。您通常可以通过调度程序中更高的优先级、一段时间的独占访问权限、安装自定义软件的能力或为特定任务优化硬件的能力,获得对所购买机器的更大访问权限。
我在学术环境中管理的第一个集群是 Apple XServe 集群,这是苹果公司为了在服务器领域产生影响而进行的一次现已失败的尝试。大多数其他团队都拥有基于 Linux 的集群,但在这种情况下,决定使用 XServe 集群。我之前的大部分经验都在 Linux 方面,因此这是一个相当大的学习曲线。大约五年前,我曾在 Sun 机器集群上安装和管理了 Sun Grid Engine,因此我在其他 Unix 版本方面也有经验。
典型网络拓扑
集群的典型设置(这通常也适用于超级计算机)是用户登录到头节点(或登录节点)。这些是从网络访问的唯一节点,也是用户可以直接登录和交互的唯一节点。集群的大部分由计算节点组成,这些节点位于私有网络上,调度由某种 作业调度器(如 Portable Batch System (PBS)、Sun Grid Engine、Torque 或 Slurm)控制。用户帐户在所有节点上通用,共享文件系统使数据易于在计算节点之间传输,并且许多计算节点都具有本地磁盘存储,速度更快,但只能从节点访问。
如果需要编译自定义代码,通常在头节点上完成。在我使用的一些系统上,架构与计算节点不匹配,因此我们不得不使用交叉编译,但这在如今不太常见。计算节点通常使用快速网络结构,例如 InfiniBand,并且需要链接到自定义的 消息传递接口 (MPI) 和通信库,以便获得最佳性能。这些机器通常设计为尽可能异构,通常使用较旧的 Linux 发行版和过时的库。这在一定程度上通过使用 环境模块 得到缓解。模块系统使您能够执行命令,将自定义库、编译器或您需要的任何内容添加到您的环境中。这些模块系统在较大的集群和超级计算机上非常频繁地使用,如果软件需要互斥的库版本,较小的集群也可以使用它们。
运行作业
在过去的几年里,我一直在努力使科学家们更轻松地在其工作中使用集群和超级计算机。研究人员仍然非常典型地登录到头节点/登录节点,调度他们的作业,并使用命令行工具监控它们。一些较大的项目编写了作业执行脚本,但这仍然是一个手动过程。双因素身份验证系统与 SSH 和其他安全限制相关联,这使得情况更加困难,这些系统不适合被任何更高级别的系统使用。时间分配通常基于共享协议或针对更大超级计算机的提案进行。
系统管理员确保批处理调度程序设置为记录使用情况,并强制执行分配给各个系统用户的配额。超级计算机通常设置为并行运行大型作业,这些作业通过使用分布式内存编程模型来利用机器的大部分资源。 越来越多的情况是,这些作业还需要使用本地共享内存并行性,在最极端的情况下,可能需要三种并行性模型:分布式内存、CPU 上的共享内存和 GPGPU 共享内存。存在一个范围,并且当为集群或超级计算机使用正确的编译器时,OpenACC 规范提供了一些代码的自动并行化。超级计算机和集群正变得越来越复杂,在多个级别上进行并行化变得越来越重要。对网络结构的许多投资实现了节点之间的低延迟和高带宽通信。这使得磁盘 I/O 成为一个巨大的瓶颈,而且情况正在变得更糟。
百亿亿次级
当前超级计算领域的推动力是 百亿亿次级计算。这是计算能力的下一个飞跃,需要巨大的功率以及在功率效率和容错能力方面的改进。随着系统变得越来越大,磁盘带宽变得非常宝贵,人们正在探索解决这些问题的新方法,例如突发缓冲区、非易失性 RAM 和 原位处理技术,以最大限度地减少需要写入磁盘的内容。
开源之道
开源对于超级计算社区非常重要,对于集群来说也比较重要。许可模式通常不能很好地扩展到这些应用程序,并且使运行大型作业变得困难。开源的一个更大的优势,除了许可费和模式之外,是能够修改源代码,针对超级计算机或集群对其进行优化,针对自定义 MPI 库、数学库等重新编译,并将这些结果与其他计算中心公开共享。这促进了快速的进步,并实现了对主要成功案例和一些超级计算机代码优化失败案例的自由共享。
随着社区向百亿亿次级发展,我认为这将变得越来越重要。并非专门为超级计算机开发的库可以进行修补、更新,并且在许多情况下,这些更改可以合并。超级计算机与更广泛的社区关注的一些问题相同,例如内存量相对较小的计算节点以分布式方式运行代码的多个副本,这使得内存占用和启动时间成为必须优化的关键点。这些优化还可以使相同库的嵌入式应用程序受益,例如手机、平板电脑和片上系统(例如 Raspberry Pi)。
超级计算机和集群通常需要不寻常的构建环境、移植到不太常见的编译器以及努力充分利用专用硬件。过去,我必须编译相当大的软件堆栈,以便使代码在科学计算资源上工作,但是随着容器、虚拟化和其他解决方案的探索,情况正在发生变化。云资源也在补充,或者在某些情况下取代学术界/研究中的计算需求,但通常会受到节点/实例之间通信速度降低和延迟增加的影响。
希望这次关于我在这些系统上的系统管理和软件部署经验的快速浏览能提供有用的见解。
1 条评论