主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

将深度学习批处理作业发送到集群

自 R2025a 起

此示例说明如何一边继续在 MATLAB® 中工作或将其关闭,一边在集群中训练深度神经网络。

训练深度学习网络通常需要几个小时或几天的时间。但是,可以通过在集群中使用一个或多个高性能 GPU 或 CPU 来加快深度学习应用的速度。为了高效利用时间,您可以以批处理作业的形式训练网络,并在得出结果后从集群中获取结果。您可以在计算进行的同时继续在 MATLAB 中工作,也可以关闭 MATLAB,稍后获取结果。

此示例使用不同的计算资源在集群中训练网络,并比较训练速度。使用此示例了解如何充分利用集群,并确定您的集群是否适合深度学习工作流。您可以在本地集群或云集群中运行此示例。

开发训练代码

首先在本地计算机上构建训练代码的原型。良好的做法是在将代码部署到集群之前,确保代码能正常运行且训练收敛。

此示例使用 CIFAR-10 数据集训练卷积神经网络对图像进行分类。作为支持文件包含在此示例中的 clusterBench 函数执行以下步骤:

  • 创建增强的图像数据存储以增强训练图像。集群工作单元如何访问训练数据将在后面的部分讨论。

  • 定义网络架构。网络包括三个卷积块,每个卷积块包含八个卷积层。

  • 指定训练选项。使用在经过指定时间后停止训练的输出函数。

  • 遍历不同的 ExecutionEnvironment 选项,使用每个选项对网络进行短时间训练。

  • 对于每个执行环境,记录训练的轮数、经过的时间以及基于测试数据集的网络准确度。

  • 返回包含这些指标和准确度最高的网络的 struct 作为输出。

clusterBench 函数接受两个输入。第一个输入是必需的,指定在每个执行环境中训练网络的分钟数。第二个输入是可选的,指定用于训练的小批量大小。如果未指定小批量大小,则该函数使用默认值 256。

当该函数并行训练网络时,它会根据工作单元数按比例增加小批量大小和学习率。例如,如果您使用八个工作单元进行训练,则该函数会将小批量大小和学习率乘以八。

访问集群

如果您有权访问集群,请通过在主页选项卡的环境部分中选择并行 > 发现集群,在网络上发现该集群。如果您无权访问集群,可以直接通过 MATLAB 桌面在云中创建集群。有关详细信息,请参阅创建和发现集群

Parallel menu showing the discover clusters option.

此选项将打开“发现集群”对话框,您可以在其中搜索 MATLAB Parallel Server™ 集群。

Discover clusters dialog box, asking "Where do you want to look for MATLAB Parallel Server Clusters", with the options of "On you network" and "On Mathworks Cloud Center".

如果您的集群使用 MATLAB 作业调度器、Microsoft® Windows® HPC Server 或其他第三方调度器集群,请选择在您的网络上。此选项将打开一个新窗口,其中列出了所发现的集群。其中还会列出任何已经有配置文件的集群。有关发现集群和使用集群配置文件的详细信息,请参阅发现集群并使用集群配置文件 (Parallel Computing Toolbox)

使用 parcluster 函数访问集群。此示例使用名为 myGPUCluster 的集群,该集群有八个工作单元,每个工作单元都有一个 AMD EPYC 7R32 CPU 和一个 NVIDIA® A10G GPU。请改用您自己的集群配置文件的名称。

cluster = parcluster("myGPUCluster");

您可以查询集群上可用的工作单元数量。

cluster.NumWorkers
ans = 
8

向集群工作单元提供数据

根据您的集群,可能有多个选项可用于为集群工作单元提供训练数据。如果数据集较大,应咨询集群管理员以获取建议。

  • 如果集群具有共享网络文件系统,那么这是最简单的数据共享方法,因为工作单元可以直接访问数据。

  • 您可以使用云存储,它在使用云集群进行训练时特别有用。虽然云存储可能很方便,但从远程存储访问训练数据会减慢网络训练的速度。

  • 可以将训练数据复制到每个工作单元。这可确保集群工作单元能够从本地访问训练数据,从而加快训练速度,但如果数据集较大,则创建多个数据副本可能并不合适。

在此示例中,使用 batch 函数的 AttachedFiles 选项指定要发送给每个工作单元的数据。有关在集群中使用云存储网络文件系统的详细信息,请参阅与工作单元共享代码 (Parallel Computing Toolbox)在云中使用深度学习数据

使用 AttachedFiles 选项时,软件会将文件复制到集群工作单元中的临时位置,并在代码运行后将其删除。

在软件将数据复制到工作单元后,每个工作单元中这些数据的路径可能会有所不同。要允许在集群中跨多个工作单元并行处理数据,请执行以下操作:

  • 通过在每个工作单元中调用 getAttachedFilesFolder 函数,确定每个工作单元中的数据路径。

  • 创建数据存储,并使用 AlternateFileSystemRoots 参量指定路径。

要查看函数如何确定路径和创建数据存储,请以实时脚本形式打开此示例。然后,打开作为支持文件包含在此示例中的 clusterBench 函数。

在将作业发送到集群之前,首先将 CIFAR-10 数据集下载到本地计算机。要下载 CIFAR-10 数据集,请使用 downloadCIFARToFolders 函数,此函数作为支持文件包含在此示例中。使用以下代码将该数据集下载到您的当前目录。如果您已有 CIFAR-10 的本地副本,则可以略过本节。

directory = pwd;
[locationCifar10Train,locationCifar10Test] = downloadCIFARToFolders(directory);
The folder cifar10 already exists in the given directory.

将作业发送到集群

要在集群中运行函数,请使用 batch 函数并指定以下选项:

  • 选择集群和要在集群中运行的函数。

  • 指定函数的预期输出数目。在此示例中,函数返回单个包含结果的结构体。

  • 指定用于运行并行训练的集群工作单元数量。由于除了运行作业的工作单元之外,池还需要 N 个工作单元,因此集群必须至少有 N+1 个工作单元可用。

  • 关联 cifar10 文件夹以将其传输给工作单元。

作业运行时间将略微超过 5*maxTimeMinutes。如果您的集群无法使用某些执行环境,函数会跳过这些执行环境,并且作业将更快地完成。例如,如果主节点只有一个 GPU,则作业会跳过 "multi-gpu" 执行环境。

numOutputs = 1;
numWorkers = 7;
maxTimeMinutes = 15;
minibatchsize = 256;

job = batch(cluster,@clusterBench,numOutputs,{maxTimeMinutes,minibatchsize},Pool=numWorkers,AttachedFiles="cifar10");

您可以在进行计算时继续在 MATLAB 中工作。

监控训练进度

您可以通过检查作业监控程序来查看集群中作业的当前状态。在主页选项卡的环境部分中,选择并行 > 监控作业以打开作业监控程序。

The Job Monitor showing a job with ID 11 currently running

您可以选择通过将运行批处理作业的工作单元中的数据发送到 MATLAB 客户端来详细监控训练的进度。有关在批处理作业中训练网络时如何绘制训练进度的示例,请参阅Use batch to Train Multiple Deep Learning Networks

获取结果

将作业提交到集群后,您可以在进行计算时继续在 MATLAB 中工作。如果代码的其余部分依赖于作业的完成,请使用 wait 命令阻止 MATLAB。在本例中,我们等待作业完成。

wait(job)

作业完成后,在作业对象上使用 fetchOutputs。或者,您可以从作业监控程序中检索结果。在主页选项卡的环境部分中,选择并行 > 监控作业以打开作业监控程序。然后右键点击一个作业以显示上下文菜单,并选择获取输出

results = fetchOutputs(job);
results = results{1};

如果关闭 MATLAB,您仍可以在进行计算时或计算完成后恢复集群中的作业以获取结果。在关闭 MATLAB 之前,请记下作业 ID,稍后使用 findJob (Parallel Computing Toolbox) 函数检索该作业。

绘制结果

如果集群无法访问 GPU,则作业会跳过使用 "gpu"、"multi-gpu""parallel-gpu" 执行环境的训练。如果集群的每个节点只能访问一个 GPU,则作业会跳过使用 "multi-gpu" 执行环境的训练。查询哪些执行环境没有计时。

skipped = results.skipped;
if isempty(skipped)
    disp("Skipped execution environments: none")
else
    disp("Skipped execution environments: ")
    disp(skipped)
end
Skipped execution environments: 
multi-gpu

绘制每个执行环境的训练时间,并根据轮数进行归一化。

accuracy = results.accuracy;
trainingTime = results.trainingTime;
trainingEpochs = results.trainingEpochs;
executionEnvironments = results.executionEnvironments;
executionEnvironments = "\fontname{monospace}" + executionEnvironments;

figure
b = bar(executionEnvironments,trainingTime./trainingEpochs);
b(1).Labels = round(b(1).YData,1);
xlabel("Execution Environment")
ylabel("Training Time Per Epoch (seconds)")
yscale("log")

检索准确度最高的网络。

net = results.net
net = 
  dlnetwork with properties:

         Layers: [78×1 nnet.cnn.layer.Layer]
    Connections: [77×2 table]
     Learnables: [98×3 table]
          State: [48×3 table]
     InputNames: {'imageinput'}
    OutputNames: {'softmax'}
    Initialized: 1

  View summary with summary.

检索所有必需的输出后,删除作业。删除作业会将其从 MATLAB 会话和集群的 JobStorageLocation 中去除。

delete(job)

运行基准测试并导出结果

要运行此代码并将结果导出为 PDF,请在命令行窗口中调用 export 函数。

export("clusterBench.mlx","benchmarkResults.pdf",Run=true);

另请参阅

(Parallel Computing Toolbox) | (Parallel Computing Toolbox) |

主题