Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

为受支持的调度器编写独立作业

创建并运行作业

本节详细介绍了使用集群上支持的作业调度器与 Parallel Computing Toolbox™ 软件进行典型编程会话的步骤。支持的调度器包括 MATLAB® 作业调度器、Spectrum LSF®(负载共享工具)、Microsoft® Windows HPC Server(包括 CCS)、PBS Pro® 或 TORQUE 调度器。

本节假设您已在网络上安装并运行 MATLAB 作业调度器、LSF®、PBS Pro、TORQUE 或 Windows HPC Server(包括 CCS 和 HPC Server 2008)调度器。对于所有这些集群类型,基本作业编程顺序都是相同的:

请注意,客户端会话用来与 MATLAB 作业调度器交互的对象仅引用实际包含在 MATLAB 作业调度器中的数据,而不是客户端会话中的数据。在创建作业和任务后,您可以关闭客户端会话并重新启动它,并且您的作业仍然存储在 MATLAB 作业调度器中。您可以使用 findJob 函数或 MATLAB 作业调度器集群对象的 Jobs 属性来查找现有作业。

定义并选择配置文件

集群配置文件标识了要使用的集群类型及其特定属性。在配置文件中,您可以定义一个作业可以访问多少个工作进程,作业数据的存储位置,MATLAB 的访问位置以及许多其他集群属性。确切的属性由集群的类型决定。

本节中的步骤均假定名称为 MyProfile 的配置文件标识您要使用的集群,并具有所有必要的属性设置。只要正确使用配置文件,其余的编程都是相同的,无论集群类型如何。定义或导入配置文件后,您可以在配置文件管理器 GUI 中将其设置为默认配置文件,或者使用以下命令:

parallel.defaultClusterProfile('MyProfile')

关于不同集群类型及其属性的一些注释:

说明

在共享文件系统中,所有节点都需要访问集群对象的 JobStorageLocation 属性中指定的文件夹。

由于 Windows HPC Server 需要共享文件系统,因此所有节点都需要访问集群对象的 JobStorageLocation 属性中指定的文件夹。

在共享文件系统中,许多计算机上的 MATLAB 客户端可以通过网络访问相同的作业数据。每次只能从一台客户端计算机设置特定作业或任务的属性。

当您在非共享文件系统中使用 LSF 调度器时,即使 LSF 调度器可能尚未完成作业的文件传输,该调度器也可能会报告作业处于完成状态。

查找集群

您使用 parcluster 函数来识别一个集群并在本地 MATLAB 会话中创建一个代表该集群的对象。

要查找特定集群,请使用集群配置文件来匹配要使用的集群的属性。在此示例中,MyProfile 是定义特定集群的配置文件的名称。

c = parcluster('MyProfile');

创建作业

您使用 createJob 函数创建一个作业。虽然此命令在客户端会话中执行,但它实际上在集群上创建了作业 c,并在客户端会话中创建了作业对象 job1

job1 = createJob(c)
 Job

    Properties: 

                   ID: 1
                 Type: independent
             Username: mylogin
                State: pending
       SubmitDateTime: 
        StartDateTime: 
     RunningDuration: 0 days 0h 0m 0s
           NumThreads: 1

      AutoAttachFiles: true
  Auto Attached Files: List files
        AttachedFiles: {}
    AutoAddClientPath: false
      AdditionalPaths: {}

    Associated Tasks: 

       Number Pending: 0
       Number Running: 0
      Number Finished: 0
    Task ID of Errors: []
  Task ID of Warnings: []

请注意,该作业的 State 属性是 pending。这意味着该作业尚未排队运行,因此您现在可以向其中添加任务。

集群的显示现在包含一个待处理的作业:

c
 MJS Cluster

    Properties: 

                      Name: my_mjs
                   Profile: MyProfile
                  Modified: false
                      Host: myhost.mydomain.com
                  Username: myuser

                NumWorkers: 1
                NumThreads: 1
            NumBusyWorkers: 0
            NumIdleWorkers: 1

        JobStorageLocation: Database on myhost.mydomain.com
         ClusterMatlabRoot: C:\apps\matlab
         SupportedReleases: R2021b
           OperatingSystem: windows
          AllHostAddresses: 0:0:0:0
             SecurityLevel: 0 (No security)
    HasSecureCommunication: false
 RequiresClientCertificate: false
   RequiresOnlineLicensing: false

    Associated Jobs: 

            Number Pending: 1
             Number Queued: 0
            Number Running: 0
           Number Finished: 0

您可以使用作业对象的 AttachedFiles 属性将文件传输给工作进程。有关详细信息,请参阅与员工共享代码

创建任务

创建作业后,您可以使用 createTask 函数为该作业创建任务。任务定义了作业运行期间工作进程要评估的函数。通常,一份作业的任务都是相同的。在这个例子中,每个任务将生成一个 3×3 的随机数矩阵。

createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});

job1Tasks 属性现在是一个 5×1 的任务对象矩阵。

job1.Tasks
 5x1 Task array:
 
         ID        State      FinishDateTime  Function  Errors  Warnings
       -----------------------------------------------------------------
    1     1      pending                          rand       0         0
    2     2      pending                          rand       0         0
    3     3      pending                          rand       0         0
    4     4      pending                          rand       0         0
    5     5      pending                          rand       0         0

或者,您可以通过一次调用 createTask 来创建五个任务,通过提供一个由五个单元格数组组成的单元格数组来定义每个任务的输入参量。

T = createTask(job1, @rand, 1, {{3,3} {3,3} {3,3} {3,3} {3,3}});

在这种情况下,T 是一个 5×1 的任务对象矩阵。

向作业队列提交作业

要运行您的作业并评估其任务,您可以使用 submit 函数将作业提交到作业队列。

submit(job1)

作业管理器将 job1 的任务分配给其注册的工作进程进行评估。

每个工作进程执行以下步骤进行任务评估:

  1. 从作业中接收 AttachedFilesAdditionalPaths。放置文件并相应修改路径。

  2. 第一次评估该作业的任务时,运行 jobStartup 函数。您可以在 AttachedFilesAdditionalPaths 中指定此函数。当使用 MATLAB 作业调度器时,如果同一个工作进程评估该作业的后续任务,则 jobStartup 不会在任务之间运行。

  3. 运行 taskStartup 函数。您可以在 AttachedFilesAdditionalPaths 中指定此函数。这会在工作进程执行的每个任务评估之前运行,因此它可能会在每项作业中在工作进程身上发生多次。

  4. 如果该工作进程是形成新并行池的一部分,则运行 poolStartup 函数。(执行 parpool 或运行形成并使用并行池的其他类型作业(例如 batch)时会发生这种情况。)

  5. 接收任务函数和参量以供评估。

  6. 评估任务函数,将结果放置在任务的 OutputArguments 属性中。任何错误信息都会进入任务的 Error 属性。

  7. 运行 taskFinish 函数。

检索作业结果

每个任务的评估结果都作为单元格数组存储在该任务对象的 OutputArguments 属性中。使用函数 fetchOutputs 来检索作业中所有任务的结果。

wait(job1)
results = fetchOutputs(job1);

显示每个任务的结果。

results{1:5}
    0.9501    0.4860    0.4565
    0.2311    0.8913    0.0185
    0.6068    0.7621    0.8214

    0.4447    0.9218    0.4057
    0.6154    0.7382    0.9355
    0.7919    0.1763    0.9169

    0.4103    0.3529    0.1389
    0.8936    0.8132    0.2028
    0.0579    0.0099    0.1987

    0.6038    0.0153    0.9318
    0.2722    0.7468    0.4660
    0.1988    0.4451    0.4186

    0.8462    0.6721    0.6813
    0.5252    0.8381    0.3795
    0.2026    0.0196    0.8318

管理调度器中的对象

由于作业和任务的所有数据都驻留在集群作业存储位置,即使创建它们的客户端会话已结束,这些对象仍会继续存在。以下部分介绍如何访问这些对象以及如何永久删除它们:

客户端会话结束时会发生什么

当您关闭 Parallel Computing Toolbox 软件的客户端会话时,工作区中的所有对象都将被清除。但是,MATLAB Parallel Server™ 软件或其他集群资源中的对象仍然保留在原处。当客户端会话结束时,只有本地引用对象会丢失,而不会丢失集群中的实际作业和任务数据。

因此,如果您已经将您的作业提交到集群作业队列等待执行,那么您可以退出您的 MATLAB 客户端会话,该作业将由集群执行。您可以稍后在另一个客户端会话中检索作业结果。

恢复对象

Parallel Computing Toolbox 软件的客户端会话可以访问 MATLAB Parallel Server 软件中的任何对象,无论是当前客户端会话还是另一个客户端会话创建了这些对象。

您可以使用 parcluster 函数在客户端会话中创建集群对象。

c = parcluster('MyProfile');

当您通过对象 c 访问集群时,您可以创建引用该集群中包含的所有作业的对象。可以通过集群对象的 Jobs 属性访问作业,该属性是作业对象的数组:

all_jobs = c.Jobs

您可以通过数组 all_jobs 进行索引来定位特定的作业。

或者,您可以使用 findJob 函数在集群中搜索任何作业或由其任何属性(例如其 State)标识的特定作业。

all_jobs = findJob(c);
finished_jobs = findJob(c,'State','finished')

此命令返回引用集群 c 上所有已完成作业的作业对象数组。

重置回调属性(仅限 MATLAB 作业调度器)

重新启动客户端会话时,您将丢失作业或任务上的任何回调属性(例如,FinishedFcn 属性)的设置。这些属性通常用于在客户端会话中获取其对象状态变化的通知。当您在新的客户端会话中创建引用现有作业或任务的对象时,如果您打算使用这些回调属性,则必须重置它们。

永久删除对象

集群中的作业即使在完成后以及 MATLAB 作业调度器停止并重新启动后仍会继续存在。以下部分解释了从集群中永久删除作业的方法:

删除选定对象.  从 MATLAB 客户端会话中的命令行,您可以为任何作业或任务对象调用 delete 函数。如果删除一项作业,则也会删除该作业中包含的所有任务。

例如,查找并删除集群中属于用户 joep 的所有已完成的作业。

c = parcluster('MyProfile')
finished_jobs = findJob(c,'State','finished','Username','joep')
delete(finished_jobs)
clear finished_jobs

delete 函数将从集群中永久删除这些作业。clear 函数从本地 MATLAB 工作区中删除对象引用。

从干净状态启动 MATLAB 作业调度器.  当 MATLAB 作业调度器启动时,它会默认启动,以便恢复其前一个会话并保持所有作业完好无损。或者,MATLAB 作业调度器可以从干净状态开始,并删除其所有以前的历史记录。从干净状态开始永久删除特定主机上指定名称的 MATLAB 作业调度器中的所有作业和任务数据。

作为网络管理功能,startjobmanager 脚本的 -clean 标志在 MATLAB Parallel Server 系统管理员指南中的 从干净状态开始 (MATLAB Parallel Server) 中进行了描述。