主要内容

通用调度器的插件脚本

通用调度器接口为配置MATLAB的交互提供了完全的灵活性®客户端、MATLAB工作者和第三方调度器。插件脚本定义MATLAB如何与您的设置交互。

下表列出了受支持的插件脚本函数及其计算阶段:金宝app

文件名称 阶段
independentSubmitFcn.m 提交独立作业
communicatingSubmitFcn.m 提交通信作业
getJobStateFcn.m 查询任务状态
canceJobFcn.m 取消工作
cancelTaskFcn.m 取消任务
deleteJobFcn.m 删除作业
deleteTaskFcn.m 删除任务
postConstructFcn.m 在创建parallel.cluster.Generic实例

类指定的文件夹中,这些插件脚本只有在具有预期的文件名时才会被计算PluginScriptsLocation集群属性。有关如何配置通用集群概要文件的详细信息,请参见使用通用调度器接口进行配置(MATLAB并行服务器)

请注意

independentSubmitFcn.m必须存在才能提交独立作业,并且communicatingSubmitFcn.m必须存在才能提交通信作业。

插件脚本示例

为了支金宝app持通用调度器接口的使用,插件脚本可用于以下第三方调度器:

每个安装程序为三种可能的提交模式提供脚本:

  • 共享——客户端可以直接提交到调度器,客户端和集群节点(或机器)有一个共享的文件系统。

  • 远程——客户端和集群节点拥有共享的文件系统,但客户端计算机不能直接提交到调度器,例如在没有安装调度器的客户端实用程序时。此模式使用ssh使用远程主机向调度器提交命令的协议。

  • 非共享—客户端和集群节点没有共享的文件系统。此模式使用ssh协议,使用远程主机向调度器提交命令,并且它使用sftp将作业和任务文件复制到集群文件系统的协议。

每个提交模式在安装文件夹中都有自己的子文件夹。该子文件夹包含自述文件,该文件提供关于如何使用脚本的具体说明。在使用脚本之前,请确定哪种提交模式描述您的网络设置。

要运行安装程序,请下载调度器的适当支持包,并在MATLAB客户端中打开它。金宝app安装程序包括一个向导,指导您为集群配置创建集群概要文件。

如果您想自定义插件脚本的行为,您可以设置额外的属性,例如AdditionalSubmitArgs.有关更多信息,请参见自定义示例插件脚本的行为(MATLAB并行服务器)

如果某个支持包不支持您的调度器或集群配置,建议您修改其中一个包的脚本。金宝app有关如何为通用调度器编写一组插件脚本的详细信息,请参见编写自定义插件脚本

包装器脚本

示例插件脚本使用包装器脚本来简化的实现independentSubmitFcn.m而且communicatingSubmitFcn.m.这些脚本不是必需的,但是,使用它们是一种很好的实践,可以使您的代码更具可读性。下表描述了这些脚本:

文件名称 描述
independentJobWrapper.sh 中使用的independentSubmitFcn.m用适当的参数嵌入对MATLAB可执行文件的调用。它使用环境变量来定位可执行文件及其参数。有关它的使用示例,请参见SLURM调度器的示例脚本
communicatingJobWrapper.sh 中使用的communicatingSubmitFcn.m在集群中分配通信作业。该脚本实现了中的步骤提交调度器作业以启动MPI进程.有关它的使用示例,请参见SLURM调度器的示例脚本

编写自定义插件脚本

请注意

在编写自己的插件脚本时,最好先修改一个与您的设置最匹配的示例插件脚本(参见插件脚本示例).

independentSubmitFcn

向通用集群提交独立作业时,independentSubmitFcn.m函数在MATLAB客户端会话中执行。

这个函数的声明行必须是:

函数independentSubmitFcn(集群、工作environmentProperties)

MATLAB独立作业中的每个任务对应于调度器上的单个作业。这个函数的目的是提交N作业到第三方调度器,其中N是独立作业中的任务数。这些工作必须:

  1. 设置工作程序MATLAB识别要运行的单个任务所需的五个环境变量。有关更多信息,请参见配置工作环境

  2. 调用适当的MATLAB可执行文件以启动MATLAB工作程序并运行任务。有关更多信息,请参见提交调度器作业以运行MATLAB工作者

配置工作环境。这个表确定了运行单独任务必须在工作MATLAB上设置的五个环境变量和值:

环境变量名称 环境变量值
PARALLEL_SERVER_DECODE_FUNCTION “parallel.cluster.generic.independentDecodeFcn”
PARALLEL_SERVER_STORAGE_CONSTRUCTOR environmentProperties。StorageConstructor
PARALLEL_SERVER_STORAGE_LOCATION
  • 如果客户端和集群节点之间有共享文件系统,请使用environmentProperties。StorageLocation

  • 如果客户端和集群节点之间没有共享文件系统,请选择对所有集群节点可见的文件夹。有关在客户机和集群节点之间复制作业和任务文件的说明,请参见没有共享文件系统提交

PARALLEL_SERVER_JOB_LOCATION environmentProperties。JobLocation
PARALLEL_SERVER_TASK_LOCATION environmentProperties。TaskLocations {n}n任务

许多调度器支持将复制客户端环境作金宝app为提交命令的一部分。如果是,您可以在客户机中设置前面的环境变量,这样调度程序就可以将它们复制到工作环境中。如果不是,则必须修改提交命令以转发这些变量。

提交调度器作业以运行MATLAB工人。在worker上定义了给定作业和任务所需的五个参数后,通过调用具有合适参数的MATLAB可执行文件来运行任务。要调用的MATLAB可执行文件定义在environmentProperties。MatlabExecutable.中定义要传递的参数environmentProperties。MatlabArguments

请注意

如果无法从客户端机器直接提交调度程序,请参见从远程主机提交有关如何提交使用的说明ssh

SLURM调度器的示例脚本。这个脚本展示了SLURM调度器与共享文件系统的基本提交功能。有关更完整的示例,请参见插件脚本示例

函数independentSubmitFcn(集群、工作environmentProperties)%指定所需的环境变量。setenv (“PARALLEL_SERVER_DECODE_FUNCTION”“parallel.cluster.generic.independentDecodeFcn”);setenv (“PARALLEL_SERVER_STORAGE_CONSTRUCTOR”, environmentProperties.StorageConstructor);setenv (“PARALLEL_SERVER_STORAGE_LOCATION”, environmentProperties.StorageLocation);setenv (“PARALLEL_SERVER_JOB_LOCATION”, environmentProperties.JobLocation);指定要在工作线程上运行的MATLAB可执行文件和参数。这些在independentJobWrapper.sh脚本中使用。setenv (“PARALLEL_SERVER_MATLAB_EXE”, environmentProperties.MatlabExecutable);setenv (“PARALLEL_SERVER_MATLAB_ARGS”, environmentProperties.MatlabArguments);ii = 1:environmentProperties。NumberOfTasks指定识别要运行的任务所需的环境变量。setenv (“PARALLEL_SERVER_TASK_LOCATION”, environmentProperties.TaskLocations{二});指定将作业提交给SLURM调度器的命令。SLURM将自动将环境变量复制到worker。commandToRun =' batch——ntasks=1 independentJobWrapper.sh';[cmdFailed, cmdOut] = system(commandToRun);结束结束

前面的例子提交了一个简单的bash脚本,independentJobWrapper.sh,发送给调度程序。的independentJobWrapper.sh脚本使用环境变量嵌入MATLAB可执行文件和参数:

/ bin / sh# PARALLEL_SERVER_MATLAB_EXE - MATLAB可执行的使用# PARALLEL_SERVER_MATLAB_ARGS - MATLABarg游戏使用执行" $ {PARALLEL_SERVER_MATLAB_EXE} "$ {PARALLEL_SERVER_MATLAB_ARGS}

communicatingSubmitFcn

向通用集群提交通信作业时,communicatingSubmitFcn.m函数在MATLAB客户端会话中执行。

这个函数的声明行必须是:

函数communicatingSubmitFcn(集群、工作environmentProperties)

此函数的目的是向调度程序提交单个作业。这项工作必须:

  1. 设置MATLAB工作程序识别要运行的作业所需的四个环境变量。有关更多信息,请参见配置工作环境

  2. 调用MPI将作业分配给NMATLAB的工人。N属性中指定的最大值NumWorkersRange属性的MATLAB作业。有关更多信息,请参见提交调度器作业以启动MPI进程

配置工作环境。这个表确定了必须在工作MATLAB上设置的四个环境变量和值,以运行通信作业的任务:

环境变量名称 环境变量值
PARALLEL_SERVER_DECODE_FUNCTION “parallel.cluster.generic.communicatingDecodeFcn”
PARALLEL_SERVER_STORAGE_CONSTRUCTOR environmentProperties。StorageConstructor
PARALLEL_SERVER_STORAGE_LOCATION
  • 如果客户端和集群节点之间有共享文件系统,请使用environmentProperties。StorageLocation

  • 如果客户端和集群节点之间没有共享文件系统,请选择所有集群节点上存在的文件夹。有关在客户机和集群节点之间复制作业和任务文件的说明,请参见没有共享文件系统提交

PARALLEL_SERVER_JOB_LOCATION environmentProperties。JobLocation

许多调度器支持将复制客户端环境作金宝app为提交命令的一部分。如果是,您可以在客户机中设置前面的环境变量,这样调度程序就可以将它们复制到工作环境中。如果不是,则必须修改提交命令以转发这些变量。

提交调度器作业以启动MPI进程。为给定作业定义了四个必需参数之后,通过启动运行作业N工作人员MATLAB过程使用mpiexecmpiexec是并行计算工具箱™附带的软件,它实现了消息传递接口(MPI)标准,以允许工作MATLAB进程之间的通信。欲了解更多有关mpiexec,请参阅MPICH主页

要运行作业,必须向调度程序提交作业,调度程序将执行以下步骤。请注意,matlabroot指向工作节点上的MATLAB安装位置。

  1. 请求N调度程序中的进程。N属性中指定的最大值NumWorkersRange属性的MATLAB作业。

  2. 调用mpiexec启动工作MATLAB进程。在每台主机上启动的工作MATLAB进程的数量应该与调度器分配的进程数量相匹配。的mpiexec可执行文件位于matlabroot / bin / mw_mpiexec

    mpiexec命令自动将环境变量转发给已启动的进程。请确保环境变量符合配置工作环境在运行前设置mpiexec

    以了解有关选项的更多信息mpiexec,请参阅使用Hydra进程管理器

请注意

有关前面步骤的完整示例,请参见communicatingJobWrapper.sh中的任何样例插件脚本提供的脚本插件脚本示例.如果需要编写自己的脚本,可以使用此脚本作为起点。

SLURM调度器的示例脚本。下面的脚本展示了具有共享文件系统的SLURM调度器的基本提交函数。

提交的作业包含在bash脚本中,communicatingJobWrapper.sh.该脚本实现了中的相关步骤提交调度器作业以启动MPI进程SLURM调度器。有关更完整的示例,请参见插件脚本示例

函数communicatingSubmitFcn(集群、工作environmentProperties)指定四个所需的环境变量。setenv (“PARALLEL_SERVER_DECODE_FUNCTION”“parallel.cluster.generic.communicatingDecodeFcn”);setenv (“PARALLEL_SERVER_STORAGE_CONSTRUCTOR”, environmentProperties.StorageConstructor);setenv (“PARALLEL_SERVER_STORAGE_LOCATION”, environmentProperties.StorageLocation);setenv (“PARALLEL_SERVER_JOB_LOCATION”, environmentProperties.JobLocation);指定要在工作线程上运行的MATLAB可执行文件和参数。指定MATLAB安装在集群节点上的位置。这些在communicatingJobWrapper.sh脚本中使用。setenv (“PARALLEL_SERVER_MATLAB_EXE”, environmentProperties.MatlabExecutable);setenv (“PARALLEL_SERVER_MATLAB_ARGS”, environmentProperties.MatlabArguments);setenv (“PARALLEL_SERVER_CMR”, cluster.ClusterMatlabRoot);numberOfTasks = environmentProperties.NumberOfTasks;指定向SLURM调度程序提交作业的命令%请求的进程与作业中的任务一样多。SLURM将自动将环境变量复制到worker。commandToRun = sprintf('sbatch——ntasks=%d communicatingJobWrapper.sh', numberOfTasks);[cmdFailed, cmdOut] = system(commandToRun);结束

getJobStateFcn

查询使用通用集群创建的作业的状态时,可以使用getJobStateFcn.m函数在MATLAB客户端会话中执行。这个函数的声明行必须是:

函数state = getJobStateFcn(cluster,job,state)

在使用第三方调度器时,调度器可能拥有有关作业的更多最新信息,而不是工具箱中从本地作业存储位置获得的信息。如果使用非共享文件系统,这种情况尤其如此,远程文件系统在将大数据文件传播回本地数据位置时可能会很慢。

要从调度程序检索该信息,请添加一个函数getJobStateFcn.mPluginScriptsLocation你所在集群的。

传递给此函数的状态是来自本地作业存储的状态。然后,此函数体可以查询调度器,以确定作业的更准确状态,并返回该状态以代替存储的状态。为此目的编写的函数必须返回作业对象状态的有效值。允许的值为“等待”“排队”“奔跑”“完成”,或“失败”

有关将MATLAB任务与其对应的调度器作业ID配对的说明,请参见使用通用调度器管理作业

cancelJobFcn

取消使用通用集群创建的作业时,cancelJobFcn.m函数在MATLAB客户端会话中执行。这个函数的声明行必须是:

函数OK = canceljobbfcn (cluster,job)

取消使用通用调度器接口创建的作业时,默认情况下,此操作仅影响存储中的作业数据。若要取消调度器上的相应作业,必须向调度器提供关于执行什么以及何时执行的指示。要实现这一点,添加一个名为cancelJobFcn.mPluginScriptsLocation你所在集群的。

然后,该函数体可以向调度器发送命令,例如,从队列中删除相应的作业。该函数必须返回一个逻辑标量,指示取消调度程序上的作业的成功或失败。

有关将MATLAB任务与其对应的调度器作业ID配对的说明,请参见使用通用调度器管理作业

cancelTaskFcn

取消使用通用集群创建的任务时,cancelTaskFcn.m函数在MATLAB客户端会话中执行。这个函数的声明行必须是:

函数OK = cancelTaskFcn(cluster,task)

在取消使用通用调度器接口创建的任务时,默认情况下,这仅影响存储中的任务数据。若要取消调度器上的相应作业,必须向调度器提供关于执行什么以及何时执行的指示。要实现这一点,添加一个名为cancelTaskFcn.mPluginScriptsLocation你所在集群的。

然后,此函数体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。该函数必须返回一个逻辑标量,指示在调度程序上取消作业的成功或失败。

有关将MATLAB任务与其对应的调度器作业ID配对的说明,请参见使用通用调度器管理作业

deleteJobFcn

删除使用通用集群创建的作业时,deleteJobFcn.m函数在MATLAB客户端会话中执行。这个函数的声明行必须是:

函数deleteTaskFcn(集群,任务)

在删除使用通用调度器接口创建的作业时,默认情况下,这只影响存储中的作业数据。若要删除调度器上的相应作业,必须向调度器提供关于执行什么以及何时执行的指示。要实现这一点,添加一个名为deleteJobFcn.mPluginScriptsLocation你所在集群的。

然后,该函数体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。

有关将MATLAB任务与其对应的调度器作业ID配对的说明,请参见使用通用调度器管理作业

deleteTaskFcn

删除使用通用集群创建的任务时,deleteTaskFcn.m函数在MATLAB客户端会话中执行。这个函数的声明行必须是:

函数deleteTaskFcn(集群,任务)

在删除使用通用调度器接口创建的任务时,默认情况下,这仅影响存储中的任务数据。若要删除调度器上的相应作业,必须向调度器提供关于执行什么以及何时执行的指示。要实现这一点,添加一个名为deleteTaskFcn.mPluginScriptsLocation你所在集群的。

然后,此函数体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。

有关将MATLAB任务与其对应的调度器作业ID配对的说明,请参见使用通用调度器管理作业

postConstructFcn

在MATLAB中创建集群实例后,将postConstructFcn.m函数在MATLAB客户端会话中执行。例如,下面的代码行创建集群的实例并运行postConstructFcn函数与“myProfile”群简介:

C = parcluster(“myProfile”);

的声明行postConstructFcn函数必须为:

函数postConstructFcn(集群)

如果您需要在使用集群之前执行自定义配置,请添加名为postConstructFcn.mPluginScriptsLocation你所在集群的。此函数体可以包含所需的任何额外设置步骤。

添加用户自定义

如果需要在运行时修改插件脚本的功能,请使用AdditionalProperties通用调度器接口的属性。

例如,考虑SLURM调度器。SLURM的提交命令接受一个——节点列表参数,该参数允许您指定要在其上运行的节点。你可以改变这个参数的值,而不需要修改你的插件脚本。要添加此功能,请在您的independentSubmitFcn.m而且communicatingSubmitFcn.m脚本:

SLURM基本提交命令submitCommand =“sbatch”检查是否定义了属性如果isprop(集群。添加itionalProperties,的节点列表添加适当的参数和值提交字符串submitCommand = [submitCommand .”——节点列表= 'cluster.AdditionalProperties.NodeList];结束

有关如何使用此编码模式的示例,请参阅中的脚本的非共享提交函数插件脚本示例

从集群概要管理器中设置附加属性

通过对前面示例中的脚本进行修改,您可以添加一个AdditionalProperties条目,以指定要使用的节点列表。这提供了一种方法,可以为与您共享集群概要文件的任何人记录添加到插件脚本中的自定义。

要添加节点列表属性设置为集群配置文件:

  1. 通过选择从MATLAB桌面启动集群配置文件管理器平行>管理集群配置文件

  2. 选择通用集群的概要文件,然后单击编辑

  3. 导航到AdditionalProperties表,并单击添加

  4. 输入节点列表随着的名字

  5. 字符串随着类型

  6. 设置价值到节点列表。

属性中的附加属性MATLAB命令行

用修改你的脚本添加用户自定义,在提交作业之前,通过设置集群对象的适当属性,可以从MATLAB命令行编辑节点列表:

C = parcluster;c.AdditionalProperties.NodeList =“gpuNodeName”;J = c.batch(“myScript”);

显示AdditionalProperties对象查看所有当前定义的属性及其值:

>> c.AdditionalProperties ans = AdditionalProperties with properties: ClusterHost: 'myClusterHost' NodeList: 'gpuNodeName' RemoteJobStorageLocation: '/tmp/jobs'

使用通用调度器管理作业

作业管理的第一个需求是识别调度程序上对应于MATLAB作业对象的作业。当向调度器提交作业时,submit函数中执行提交的命令可以从调度器返回关于作业的一些数据。该数据通常包括作业ID。通过将该调度器作业ID存储在MATLAB作业对象中,您可以在稍后向调度器发送管理命令时通过该作业ID引用调度器作业。类似地,您可以存储MATLAB任务id到调度器作业id的映射,以帮助管理单个任务。存储此集群数据的工具箱函数为setJobClusterData

保存作业调度程序数据

属性independentSubmitFcn.m函数来解析提交给SLURM调度器的每个命令的输出。可以使用正则表达式为每个任务提取调度器作业ID,然后使用将其存储setJobClusterData

模式从SLURM间歇输出中提取调度器作业IDsearchPattern =”。*提交批处理作业([0-9]+).*';jobIDs = cell(numberOfTasks, 1);ii = 1:numberOfTasks setenv(“PARALLEL_SERVER_TASK_LOCATION”, environmentProperties.TaskLocations{二});commandToRun =' batch——ntasks=1 independentJobWrapper.sh';[cmdFailed, cmdOut] = system(commandToRun);jobIDs{ii} = regexp(cmdOut, searchPattern,“令牌”“一次”);结束%在作业集群数据上设置作业id集群。setJobClusterData(工作、结构(“ClusterJobIDs”, {jobIDs}));

检索作业调度程序数据

此示例修改cancelJobFcn.m来取消SLURM调度程序上的相应作业。示例使用getJobClusterData检索作业调度程序数据。

函数OK = canceljobbfcn (cluster, job)获取此作业的调度程序信息。data = cluster.getJobClusterData(job);jobIDs = data.ClusterJobIDs;ii = 1:长度(jobIDs)告诉SLURM调度程序取消作业。commandToRun = sprintf(“scancel“% s”, jobIDs{二});[cmdFailed, cmdOut] = system(commandToRun);结束OK = true;

从远程主机提交

如果MATLAB客户端无法直接提交到调度器,请使用parallel.cluster.RemoteClusterAccess在远程主机上建立连接并运行命令。

该对象使用ssh协议,因此需要一个ssh远程主机上运行的守护进程服务。要建立连接,必须为远程主机提供用户名和密码,或者提供有效的身份文件。

下面的代码在远程主机上执行命令,remoteHostname,作为用户,用户

这将提示输入用户的密码access = parallel.cluster.RemoteClusterAccess.getConnectedAccess(“remoteHostname”“用户”);在remoteHostname上执行命令[cmdFailed, cmdOut] = access.runCommand(commandToRun);

有关使用远程主机提交的插件脚本示例,请参阅中的远程提交模式插件脚本示例

没有共享文件系统提交

如果MATLAB客户端没有与集群节点共享文件系统,请使用parallel.cluster.RemoteClusterAccess在客户端和集群节点之间建立连接并复制作业和任务文件。

该对象使用ssh协议,因此需要一个ssh远程主机上运行的守护进程服务。要建立连接,必须为远程主机提供用户名和密码,或者提供有效的身份文件。

使用非共享提交时,必须指定要在客户机上使用的本地作业存储位置和要在集群上使用的远程作业存储位置。远程作业存储位置必须对集群中的所有节点可用。

parallel.cluster.RemoteClusterAccess通过文件镜像,将本地作业和任务文件与集群上的作业和任务文件持续同步。文件镜像首次启动时,本地作业和任务文件被上传到远程作业存储位置。当作业执行时,文件镜像会不断检查远程作业存储位置以查找新文件和更新,并将文件复制到客户机上的本地存储。这个过程确保MATLAB客户端始终拥有调度程序上执行的作业和任务的最新视图。

本例连接到远程主机,remoteHostname,作为用户,用户,并建立/远程/存储作为要与之同步的远程集群存储位置。然后启动作业的文件镜像,将作业的本地文件复制到/远程/存储,然后将所有更改同步回本地机器。

这将提示输入用户的密码access = parallel.cluster.RemoteClusterAccess.getConnectedAccessWithMirror(“remoteHostname”/远程/存储的“用户”);为作业启动文件镜像access.startMirrorForJob(工作);

有关没有共享文件系统的插件脚本示例,请参阅中的非共享提交模式插件脚本示例

相关的话题