主要内容

深度学习与MATLAB在多个gpu

MATLAB®金宝app支持使用多个gpu并行训练单个深度神经网络。这可以在您的本地机器上使用多个gpu,或者在集群或云上使用gpu的并行工作器来实现。使用多个gpu可以显著加快训练速度。要决定你是否期望多gpu训练带来性能提升,考虑以下因素:

  • 每个GPU的迭代时间有多长?如果每次GPU迭代都很短,那么GPU之间的通信开销就会占主导地位。尝试通过使用更大的批大小来增加每次迭代的计算量。

  • 所有的gpu都在一台机器上吗?不同机器上的gpu之间的通信引入了一个显著的通信延迟。如果你有合适的硬件,你可以减轻这个问题。有关更多信息,请参见高级支持快速多节点金宝appGPU通信

提示

要使用本地机器上的多个gpu来训练单个网络,只需指定执行环境选择“multi-gpu”不需要更改代码的其余部分。trainNetwork自动使用您可用的图形处理器进行训练计算。

在远程集群上进行培训时,指定执行环境选择“平行”.如果集群可以访问一个或多个gpu,则trainNetworkgpu仅用于培训。没有独特GPU的工人永远不会被用于训练计算。

如果您想使用更多资源,可以将深度学习培训扩展到集群或云。要了解更多关于并行选项的信息,请参见在gpu和云上并行扩展深度学习.举个例子,请看使用自动并行支持在云中训练网络金宝app

使用GPU或并行选项需要并行计算工具箱™。使用GPU也需要支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).使用远程集群还需要MATLAB并行服务器™

在本地机中使用多个gpu

请注意

如果您在云中通过ssh或远程桌面协议(RDP)连接的单个机器上运行MATLAB,那么网络执行和培训使用的代码与您在本地机器上运行的代码相同。

如果您可以访问具有多个GPU的机器,只需指定执行环境选择“multi-gpu”

“multi-gpu”选项允许您在本地并行池中使用多个gpu。如果当前没有并行池,trainNetwork预测,分类使用默认集群配置文件设置自动启动本地并行池。池的worker数量与可用gpu的数量相同。

有关如何在本地计算机中使用多个gpu执行自定义培训的信息,请参见在GPU上并行运行自定义训练循环

在集群中使用多个gpu

对于使用远程集群中的多个gpu进行训练和推理,请使用“平行”选项:

如果当前没有并行池,trainNetwork预测,分类使用默认集群配置文件设置自动启动并行池。如果池可以访问GPU,那么只有拥有唯一GPU的工作者才能进行训练计算。如果池没有gpu,则在所有可用的CPU worker上进行培训。

有关如何在远程集群中使用多个gpu执行自定义培训的信息,请参见在GPU上并行运行自定义训练循环

优化小批量大小和学习率

卷积神经网络通常使用小批量图像进行迭代训练。这是因为整个数据集通常太大,无法装入GPU内存。为了获得最佳性能,您可以通过更改MiniBatchSize使用培训选项函数。

最佳的小批量大小取决于您的确切网络、数据集和GPU硬件。当使用多个GPU进行训练时,每个图像批在GPU之间分布。这有效地增加了可用的GPU内存总量,允许更大的批处理大小。推荐的做法是随着GPU的数量线性增加最小批量大小,以保持每个GPU上的工作负载不变。例如,如果您使用64的小批量大小在单个GPU上进行培训,并且希望扩大到使用四个相同类型的GPU进行培训,则可以将小批量大小增加到256,以便每个GPU在每次迭代中处理64个观察值。

因为增加小批大小可以提高每次迭代的重要性,所以可以提高学习率。一个好的一般指导方针是,学习率与小批量大小的增加成比例地增加。根据您的应用程序,较大的小批量大小和学习率可以在不降低精确度的情况下加快训练,达到一定的限制。

选择用于培训的特定图形处理器

如果您不想使用所有的gpu,可以直接选择要用于训练和推断的gpu。这样做有助于避免在性能较差的GPU(例如显示GPU)上进行训练。

如果你的gpu在你的本地机器上,你可以使用gpuDeviceTable(并行计算工具箱)gpuDeviceCount(并行计算工具箱)函数来检查GPU资源并确定要使用的GPU的索引。

用于单个GPU的训练“汽车”“图形”选项,默认情况下,MATLAB使用带有索引的GPU设备1.你可以在开始训练之前通过选择设备来使用不同的GPU。使用gpuDevice(并行计算工具箱)使用索引选择所需的GPU:

gpuDevice(索引)
trainNetwork预测,分类设置时,自动使用所选择的图形处理器执行环境选择“汽车”“图形”

用于多个GPU的训练“multi-gpu”选项,默认情况下,MATLAB使用本地机器中所有可用的gpu。如果需要排除gpu,可以提前启动并行池,手动选择设备。

例如,假设您有三个gpu,但您只想使用带有索引的设备13..你可以使用下面的代码来启动一个有两个worker的并行池,并在每个worker上选择一个GPU。

useGPUs = [1 3];parpool (“本地”元素个数(useGPUs));spmdgpuDevice (useGPUs (labindex));结束

trainNetwork预测,分类设置时自动使用当前并行池执行环境选择“multi-gpu”(或“平行”同样的结果)。

另一种选择是选择使用WorkerLoad名称-值参数在培训选项.例如:

parpool (“本地”5);选择= trainingOptions (“个”“WorkerLoad”, [1 1 1 0 1],...
在这种情况下,第4个worker是池的一部分,但空闲,这不是对并行资源的理想使用。选择手工使用的gpu进行培训更有效gpuDevice

在多个gpu上训练多个网络

如果你想用一个GPU同时训练多个模型,那就启动一个并行池,每个可用的GPU都有一个worker,然后在不同的worker上训练每个网络。使用parforparfeval在每个工作人员上同时执行一个网络。使用培训选项函数设置执行环境名称选择“图形”在每一个工人。

例如,使用以下形式的代码在所有可用GPU上并行训练多个网络:

选择= trainingOptions (“个”“ExecutionEnvironment”“图形”);parfori=1:gpuDeviceCount(“可用”) trainNetwork(…,选项);结束

要在后台运行而不阻塞您的本地MATLAB,请使用parfeval.举例说明如何使用parforparfeval,请参阅

高级支持快速多节点金宝appGPU通信

MATLAB中的一些多GPU功能,包括trainNetwork,通过快速互连进行直接通信,以提高性能。

如果有适当的硬件连接,那么多个gpu之间的数据传输将使用快速的点对点通信,如果可用,还包括NVLink。

如果您使用的Linux计算集群具有机器之间的快速互连(如Infiniband),或者不同机器上的gpu之间的快速互连(如GPUDirect RDMA),那么您可能能够利用MATLAB中的快速多节点支持。金宝app通过设置环境变量,在池中金宝app的所有工作人员上启用这种支持PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION1.在集群概要文件管理器中设置此环境变量。

这个特性是NVIDIA NCCL库用于GPU通信的一部分。要配置它,您必须设置额外的环境变量来定义网络接口协议,尤其是NCCL_SOCKET_IFNAME.有关更多信息,请参见NCCL文档特别是关于NCCL环境变量

另请参阅

||(并行计算工具箱)|(并行计算工具箱)|

相关话题