将深度学习批处理作业发送到集群
此示例说明如何一边继续在 MATLAB® 中工作或将其关闭,一边在集群中训练深度神经网络。
训练深度学习网络通常需要几个小时或几天的时间。但是,可以通过在集群中使用一个或多个高性能 GPU 或 CPU 来加快深度学习应用的速度。为了高效利用时间,您可以以批处理作业的形式训练网络,并在得出结果后从集群中获取结果。您可以在计算进行的同时继续在 MATLAB 中工作,也可以关闭 MATLAB,稍后获取结果。
此示例使用不同的计算资源在集群中训练网络,并比较训练速度。使用此示例了解如何充分利用集群,并确定您的集群是否适合深度学习工作流。您可以在本地集群或云集群中运行此示例。
开发训练代码
首先在本地计算机上构建训练代码的原型。良好的做法是在将代码部署到集群之前,确保代码能正常运行且训练收敛。
此示例使用 CIFAR-10 数据集训练卷积神经网络对图像进行分类。作为支持文件包含在此示例中的 clusterBench
函数执行以下步骤:
创建增强的图像数据存储以增强训练图像。集群工作单元如何访问训练数据将在后面的部分讨论。
定义网络架构。网络包括三个卷积块,每个卷积块包含八个卷积层。
指定训练选项。使用在经过指定时间后停止训练的输出函数。
遍历不同的
ExecutionEnvironment
选项,使用每个选项对网络进行短时间训练。对于每个执行环境,记录训练的轮数、经过的时间以及基于测试数据集的网络准确度。
返回包含这些指标和准确度最高的网络的
struct
作为输出。
clusterBench
函数接受两个输入。第一个输入是必需的,指定在每个执行环境中训练网络的分钟数。第二个输入是可选的,指定用于训练的小批量大小。如果未指定小批量大小,则该函数使用默认值 256。
当该函数并行训练网络时,它会根据工作单元数按比例增加小批量大小和学习率。例如,如果您使用八个工作单元进行训练,则该函数会将小批量大小和学习率乘以八。
访问集群
如果您有权访问集群,请通过在主页选项卡的环境部分中选择并行 > 发现集群,在网络上发现该集群。如果您无权访问集群,可以直接通过 MATLAB 桌面在云中创建集群。有关详细信息,请参阅创建和发现集群。
此选项将打开“发现集群”对话框,您可以在其中搜索 MATLAB Parallel Server™ 集群。
如果您的集群使用 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 中工作。
监控训练进度
您可以通过检查作业监控程序来查看集群中作业的当前状态。在主页选项卡的环境部分中,选择并行 > 监控作业以打开作业监控程序。
您可以选择通过将运行批处理作业的工作单元中的数据发送到 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);
另请参阅
batch
(Parallel Computing Toolbox) | parcluster
(Parallel Computing Toolbox) | trainnet