主要内容

深度学习MATLAB多gpu

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

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

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

提示

要使用本地机器上的多个gpu训练单个网络,只需指定ExecutionEnvironment选择“multi-gpu”无需更改其余代码。trainNetwork自动使用可用的gpu进行训练计算。

在远程集群上进行训练时,请指定ExecutionEnvironment选择“平行”.如果集群可以访问一个或多个gpu,则trainNetwork只使用gpu进行训练。没有唯一GPU的工作器永远不会用于训练计算。

如果你想使用更多的资源,你可以将深度学习训练扩展到集群或云。要了解有关并行选项的更多信息,请参见并行、gpu和云中扩展深度学习.要尝试一个示例,请参见使用自动并行支持的云中列车网络金宝app

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

本机使用多个图形处理器

请注意

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

如果您可以访问具有多个gpu的计算机,则可以简单地指定ExecutionEnvironment选择“multi-gpu”

  • 用于培训使用trainNetwork,使用trainingOptions函数设置ExecutionEnvironment名称-值选项“multi-gpu”

  • 用于推理使用分类而且预测,设置ExecutionEnvironment名称-值选项“multi-gpu”

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

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

集群使用多gpu

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

  • 用于培训使用trainNetwork,使用trainingOptions函数设置ExecutionEnvironment名称-值选项“平行”

  • 用于推理使用分类而且预测,设置ExecutionEnvironment名称-值选项“平行”

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

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

优化小批量大小和学习率

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

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

因为增加小批大小可以提高每次迭代的重要性,所以可以提高学习率。一个好的一般准则是根据小批大小的增加按比例增加学习率。根据您的应用程序,更大的迷你批处理大小和学习率可以在不降低准确性的情况下加快训练,但限制很大。

选择特定gpu用于培训

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

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

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

gpuDevice(索引)
trainNetwork预测,分类设置图形处理器时,自动使用所选图形处理器ExecutionEnvironment选项“汽车”“图形”

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

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

useGPUs = [1 3];parpool (“进程”元素个数(useGPUs));spmdgpuDevice (useGPUs (spmdIndex));结束

trainNetwork预测,分类属性时自动使用当前的并行池ExecutionEnvironment选项“multi-gpu”(或“平行”同样的结果)。

另一种选择是使用WorkerLoad中的名称-值参数trainingOptions.例如:

parpool (“进程”5);opts = trainingOptions(“个”“WorkerLoad”, [1 1 1 10 0 1],...
在这种情况下,第四个worker是池的一部分,但空闲,这并不是对并行资源的理想使用。手动选择图形处理器进行训练使用效率更高gpuDevice

在多个gpu上训练多个网络

如果你想用一个GPU并行地训练多个模型,启动一个并行池,每个可用的GPU有一个worker,然后在不同的worker上训练每个网络。使用parforparfeval在每个worker上同时执行一个网络。使用trainingOptions函数设置ExecutionEnvironment名称-值选项“图形”每个工人身上。

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

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

要在不阻塞本地MATLAB的情况下在后台运行,请使用parfeval.例如,展示如何训练多个网络使用parfor而且parfeval,请参阅

高级支持快速多节点金宝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环境变量

另请参阅

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

相关的话题