使用MPI Jupyter笔记本

概述

本教程介绍了如何使用Jupyter笔记本用一个多节点使用消息传递接口(MPI)的工作。使用MPI应用程序设计运行在多个处理器上分布在多个节点。内存使用率这些类型的工作同样是分散在多个节点用于计算(分布式内存),因此一个MPI库变得必要为了管理存储在分布式空间数据和指令。这与应用程序使用多个处理器在单个节点上运行,使用一个简单的共享内存模型。

Prerequistes

这里提供的说明假设您已经创建了一个合适的conda环境和理解的基础启动Jupyter笔记本。文档提供了对这两个概念在我们的知识库(请参考链接)。

虽然可以启动Jupyter笔记本会话使用的工作脚本,本教程将使用预定的互动运行使用粘命令“srun”很多。

Conda包

虽然有几种方法和包可用于创建一个MPI-capable conda环境Jupyter笔记本,本教程将专注于使用一种比较流行的方法,利用的结合ipyparallel,mpi4py,MPICH

首先,激活conda环境,检查安装了哪个渠道及其顺序:

(myenv) [(电子邮件保护)~]conda激活myenv美元(myenv) [(电子邮件保护)~]美元conda配置——显示通道渠道:——conda-forge——默认值——bioconda

经验表明,包的组合与conda-forge效果最好,和混合这些包频道有时可以产生意想不到的结果。如果conda-forge不存在,或者不是第一频道列表中,请输入以下:

(myenv) [(电子邮件保护)~]美元conda conda-forge配置——添加通道

如果conda-forge不存在,它将被安装和插入在列表的顶部。如果它存在,进入上面的命令将列表的顶部。

现在你可以继续安装必要的额外的包:

(myenv) [(电子邮件保护)~]conda安装mpich美元(myenv) [(电子邮件保护)~]conda安装mpi4py美元(myenv) [(电子邮件保护)~]conda安装ipyparallel美元

如果一切正确安装,你可以继续下一步。

运行Jupyter

首先安排一个交互式的工作。在这个例子中,我们将使用3节点,24个任务,每个节点和8个任务:

((电子邮件保护)~]srun - n 3——ntasks = 24美元,ntasks-per-node = 8 - t 5:00:00——企业/bin/bash登录

一旦你连接到主节点(在这个示例中,hpc-throughput-p01)运行,确保激活conda环境,然后开始Jupyter笔记本:

((电子邮件保护)~]conda激活myenv美元(myenv) [(电子邮件保护)~]jupyter-notebook——没有任何一种浏览器——端口= 8889美元——ip = 0.0.0.0[我15:01:29.649 NotebookApp)加载IPython并行扩展[我15:01:29.650 NotebookApp]从本地目录服务笔记本:/home/u/user[我15:01:29.650 NotebookApp] Jupyter笔记本6.4.6运行:[我15:01:29.650 NotebookApp] http://hpc-throughput-p01:8889 ?令牌= 5 eec98287a8e7c43c7c8d7edf52c0e62ee8f01346df5a24c[我15:01:29.650 NotebookApp)或http://127.0.0.1:8889 ?令牌= 5 eec98287a8e7c43c7c8d7edf52c0e62ee8f01346df5a24c[我15:01:29.650 NotebookApp]使用control - c停止该服务器并关闭所有内核(跳过两次确认)。[C 15:01:29.661 NotebookApp]访问笔记本,在浏览器中打开这个文件:文件:/ / / home / u / user /。local /分享/ jupyter /运行/ nbserver open.html——1130563或复制和粘贴这些url之一:= 5 eec98287a8e7c43c7c8d7edf52c0e62ee8f01346df5a24c http://hpc-throughput-p01:8889 ?令牌= 5 eec98287a8e7c43c7c8d7edf52c0e62ee8f01346df5a24c或http://127.0.0.1:8889 ?令牌

现在在另一个终端窗口,打开SSH隧道到适当的节点和端口:

ssh - n - l 8889: hpc-throughput-p01:8889(电子邮件保护)

现在打开你的浏览器和列出的URL复制粘贴后开始Jupyter笔记本:

= 5 eec98287a8e7c43c7c8d7edf52c0e62ee8f01346df5a24c http://127.0.0.1:8889 ?令牌

这将把你变成一个Jupyter笔记本会话。下一步是开始一个新的Jupyter笔记本通过点击“新”(右上角),选择“Python 3”下的“笔记本头”:

开始的笔记本

一旦你在新的笔记本电脑,您可以输入的代码和测试将在下一节中介绍。

运行MPI代码

下面是一个示例,它使用一些关键语句中找到“ipyparallel”和“mpi4py”。前者允许建立一个“集群”节点分配给你粘的工作很多,并促进这些主机之间的通信。后者提供机制多处理跨多个处理器在一个分布式的内存空间。

请下面的示例代码复制并粘贴到一个细胞在笔记本上:

进口ipyparallel ippdef mpi_example ():从mpi4py进口MPI通讯= MPI.COMM_WORLD从排名返回f“Hello World {comm.Get_rank ()}。总排名= {comm.Get_size ()}。主机= {MPI.Get_processor_name ()}”与24 #请求一个MPI集群引擎ipp。集群(controller_ip = " * ",引擎= mpi, n = 24) rc:#得到broadcast_view在集群上的是最好的#适合MPI计算方式视图= rc.broadcast_view ()# mpi_example函数在所有引擎并行运行r = view.apply_sync (mpi_example)#从引擎中检索和打印结果print (" \ n " . join (r))#在这一点上,集群的过程已经被关闭

现在点击“转移”和“回归”一起执行代码块。它应该看起来像下面的:

Jupyter python代码

等待几分钟,你就会看到“引擎”开始。一旦开始,你应该得到一个结果如下:

MPI的结果

注意上面,我们有8任务运行在3节点(hpc-throughput-p01 thru hpc-throughput-p03)。每个任务/核心报告从每个主机集群。

当你完成之后,你想要停止饱一笔记本通过选择“文件”,然后“关闭并停止”,如下所示:

停止笔记本

一旦你回到主页面,点击“退出”,然后进入“退出”一旦你返回到终端。这将结束你的工作。

MPI代码解释

为了清晰起见,我们解释的一些元素在接下来的例子中给出的代码。首先注意我们的第一个声明:

进口ipyparallel ipp

这个进口的功能“ipyparallel”作为对象“ipp”,使我们能够建立一个集群节点中留给我们的工作。接下来,我们注意以下函数:

def mpi_example ():从mpi4py进口MPI通讯= MPI.COMM_WORLD从排名返回f“Hello World {comm.Get_rank ()}。总排名= {comm.Get_size ()}。主机= {MPI.Get_processor_name ()}”

这个Python代码是使用“mpi4py”和建立我们的集群上运行并行编程元素。在这种情况下,我们从“mpi4py”导入“MPI”和创建对象处理“通讯”。这使我们能够获得排名,总排名,每个并行分布式处理的主机名。

接下来,我们看到以下:

与24 #请求一个MPI集群引擎ipp。集群(controller_ip = " * ",引擎= mpi, n = 24) rc:#得到broadcast_view在集群上的是最好的#适合MPI计算方式视图= rc.broadcast_view ()# mpi_example函数在所有引擎并行运行r = view.apply_sync (mpi_example)#从引擎中检索和打印结果print (" \ n " . join (r))#在这一点上,集群的过程已经被关闭

我们建立了“集群”使用ipp和传入参数“controller_ip = " * ",引擎= " mpi”, n = 24”。“controller_ip”参数建立所有主机之间的通信,而“引擎”启动引擎线程(进程)使用MPI在我们所有的节点上。“n = 24”指定数量的引擎开始,应该对应于总任务指定当我们开始粘“srun”很多命令。我们把这个分配给处理“钢筋混凝土”。

我们运行“钢筋混凝土”是一块连续的执行(通过Python”与“语句),创建集群,同步,“mpi_example”运行的函数。

这是另一个有趣的方式我们可以这样做:

进口操作系统进口ipyparallel ippdef mpi_example ():从mpi4py进口MPI通讯= MPI.COMM_WORLD从排名返回f“Hello World {comm.Get_rank ()}。总排名= {comm.Get_size ()}。主机= {MPI.Get_processor_name ()}”集群= ipp。集群(controller_ip = " * ",引擎= mpi, n = 24)cluster.start_cluster_sync ()c = cluster.connect_client_sync ()c。wait_for_engines (n = int (os.getenv (SLURM_NTASKS)))c.ids#得到broadcast_view在集群上的是最好的#适合MPI计算方式视图= c.broadcast_view ()r = view.apply_sync (mpi_example)#从引擎中检索和打印结果print (" \ n " . join (r))cluster.stop_cluster_sync ()

在这个例子中,我们定义函数作为前(注意我们也“进口操作系统”以后我们需要它),然后我们开始和连接集群作为独立的步骤。然后我们“wait_for_engines”开始,并显示他们的“id”(c.ids)。如果你输入这个代码的第一部分(通过c.ids)和执行,你可以打开另一个终端,登录到另一个节点分配你的工作。然后,输入“顶级- c - u <用户名>”。你会注意到有几个工人“引擎”运行,并等待输入。

然后,我们建立一个“broadcast_view”对象运行的集群,最后“应用”我们“mpi_example”代码。

请注意,在这种情况下,集群将继续运行,直到我们停止和清理使用声明:

cluster.stop_cluster_sync ()

总结

正如你所看到的,我们有几种不同的方式可以建立一个运行MPI“集群”SLURM-assigned工作的一组节点。希望这个教程帮助您区分使用MPI集群的建立,和并行代码从Jupyter笔记本上运行它

更多的信息


CategoryHPC