MPI 简介

11.1. MPI 简介#

Message Passing Interface(MPI)是一种经典的并行计算工具,它允许多个计算节点进行高效的数据交换。尽管 MPI 诞生已久,新一代程序员可能不太熟悉这项技术,但它的重要性不容忽视。随着人工智能领域大型模型的发展,MPI 及其思想衍生的通信库再次成为研究的焦点,因为这些大型模型的训练和运行往往需要并行计算框架来实现跨机器的通信。例如,DeepSpeed 这样的大型模型训练框架就利用mpi4py 库来实现多机通信。

历史#

MPI 的发展起源于20世纪80年代末和90年代初,正值超级计算机的兴起。这些超级计算机主要用于科学和工程计算,覆盖气象模拟、核能研究、分子建模、流体动力学等领域。超级计算机本质上是由一组高性能计算机组成的集群,它们共同服务于科学和工程计算问题,使得程序能够在多台计算机上并行运行。

在 MPI 出现之前,多个研究小组和机构已经开始独立开发并推广自己的通信库。然而,这种做法导致了互操作性和可移植性的问题。因此,计算社区迫切需要一种标准化的方法来编写并行应用程序。

1992年,图灵奖得主 Jack Dongarra 与其他几位学者联合提出了并行计算的第一个草案,即 MPI1。第一个标准版本 MPI1.0 最终在1994年发布。随后,为了适应并行计算的不断发展和需求,MPI-2 和 MPI-3 标准也相继发布。这些标准的修订得到了来自学术界和工业界多位专家的共同参与,他们不断地根据最新的并行计算需求对MPI标准进行更新和完善。

标准与实现#

MPI 是一个并行计算的标准,它不是编译器、编程语言,也不是具体的实现或产品。像 Dask、Ray 这样的框架是一个具体的实现。MPI 的区别在于它是一个标准,不同的厂商可以在这一标准下开发自己的实现。“标准”意味着 MPI 定义了一系列的标准函数和方法,所有厂商都必须遵循这些定义;而“实现”则指不同软硬件厂商基于这一标准实现具体的底层通信机制。

例如,若要实现发送数据的功能,MPI 标准中规定了 MPI_Send 方法,所有厂商都应按照这一标准来实现该方法。

MPI 标准具体定义了以下内容:

  • 每个函数的函数名和参数列表;

  • 每个函数的语义,即预期功能,包括函数的作用和限制。

在具体实现上, 目前常用的MPI实现包括 Open MPI、MPICH、Intel MPI、Microsoft MPI 和 NVIDIA HPC-X 等。由于 MPI 是一个标准,同一段代码可以被不同的 MPI 实现所编译,比如 OpenMPI 或 Intel MPI。每个实现都是由特定的厂商或开源社区开发的,因此在实际使用中也会存在一些差异。

高速网络#

进行多机并行计算时,机器之间需要高速互联网络来实现高效的数据交换。如果你的集群已经配备了这些硬件,并且已经安装了某个 MPI 实现,那么 MPI 可以充分利用这些高速网络的高带宽和低延迟特性。这些网络通常拥有超过 100Gbps 的带宽,但它们的价格也非常昂贵,因此通常只在高性能计算场景中才会配置这些网络设备。数据中心常见的万兆以太网,带宽在 10Gbps 量级,也可以部署 MPI,并且在使用 MPI 时仍然可以获得一定的加速效果。此外,MPI还可以在单机上运行,这意味着它可以利用单个节点上的多个计算核心来执行并行任务。

安装#

MPI 有多种实现,不同的 MPI 厂商一般会提供以下工具:

  • 编译器 mpiccmpicxxmpifort,分别用来编译 C、C++、Fortran 语言源代码。源代码中一部分涉及多机通讯,一部分是单机计算,这些编译器通常将多机通讯与单机计算的代码一起编译,并生成可执行文件。

  • 用于执行并行程序的 mpirunmpiexecmpiexec 可以在多台节点上启动并行程序,创建多个 MPI 进程,实现跨节点的并行计算。

Note

在很多 MPI 实现中,mpirunmpiexec 的功能几乎相同,它们都可以将并行程序拉起。有些 MPI 实现的 mpirunmpiexec 背后是同一个程序。但严谨地讲,MPI 标准中只定义了 mpiexec,并没有定义 mpirun,因此,mpiexec 应该更通用。

如果使用 C/C++ 或 Fortran 这样的编译语言编写代码,一般的流程是:使用 mpicc 编译源代码,得到可执行文件。比如,将可执行文件命名为 parallel.o;使用 mpiexec 在多台节点上启动并运行 parallel.o。Python 是一种解释型语言,不是编译型语言,mpi4py 用户也不需要编译源代码。

如果你的集群环境已经安装了 MPI,可以先将 MPI 加载到环境变量里,然后使用 pip 安装:

pip install mpi4py

如果你的集群环境没有 MPI,而又对编译这些流程不熟悉,可以直接用 conda 安装 MPICH。 conda 安装的是开源社区预编译好的软件。

conda install -c conda-forge mpich
conda install -c conda-forge mpi4py