MATLAB®金宝app支持使用多个gpu并行训练单个深度神经网络。这可以在您的本地机器上使用多个gpu,或者在集群或云上使用gpu的并行工作器来实现。使用多个gpu可以显著加快训练速度。要决定你是否期望多gpu训练带来性能提升,考虑以下因素:
每个GPU的迭代时间有多长?如果每次GPU迭代都很短,那么GPU之间的通信开销就会占主导地位。尝试通过使用更大的批大小来增加每次迭代的计算量。
所有的gpu都在一台机器上吗?不同机器上的gpu之间的通信引入了一个显著的通信延迟。如果你有合适的硬件,你可以减轻这个问题。有关更多信息,请参见高级支持快速多节点金宝appGPU通信.
提示
要使用本地机器上的多个gpu来训练单个网络,只需指定ExecutionEnvironment
选择“multi-gpu”
不需要更改代码的其余部分。trainNetwork
自动使用您可用的图形处理器进行训练计算。
在远程集群上进行培训时,指定ExecutionEnvironment
选择“平行”
.如果集群可以访问一个或多个gpu,则trainNetwork
gpu仅用于培训。没有独特GPU的工人永远不会被用于训练计算。
如果您想使用更多资源,可以将深度学习培训扩展到集群或云。要了解更多关于并行选项的信息,请参见在gpu和云上并行扩展深度学习.举个例子,请看使用自动并行支持在云中训练网络金宝app.
使用GPU或并行选项需要并行计算工具箱™。使用GPU也需要支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).使用远程集群还需要MATLAB并行服务器™.
请注意
如果您在云中通过ssh或远程桌面协议(RDP)连接的单个机器上运行MATLAB,那么网络执行和培训使用的代码与您在本地机器上运行的代码相同。
如果您可以访问具有多个gpu的机器,则可以简单地指定ExecutionEnvironment
选择“multi-gpu”
:
培训使用trainNetwork
,可以使用trainingOptions
函数设置ExecutionEnvironment
名称选择“multi-gpu”
.
的“multi-gpu”
选项允许您在本地并行池中使用多个gpu。如果当前没有并行池,trainNetwork
,预测
,分类
使用默认集群配置文件设置自动启动本地并行池。池的worker数量与可用gpu的数量相同。
有关如何在本地计算机中使用多个gpu执行自定义培训的信息,请参见在GPU上并行运行自定义训练循环.
对于使用远程集群中的多个gpu进行训练和推理,请使用“平行”
选择:
培训使用trainNetwork
,可以使用trainingOptions
函数设置ExecutionEnvironment
名称选择“平行”
.
如果当前没有并行池,trainNetwork
,预测
,分类
使用默认集群配置文件设置自动启动并行池。如果池可以访问GPU,那么只有拥有唯一GPU的工作者才能进行训练计算。如果池没有gpu,则在所有可用的CPU worker上进行培训。
有关如何在远程集群中使用多个gpu执行自定义培训的信息,请参见在GPU上并行运行自定义训练循环.
卷积神经网络通常使用小批量图像进行迭代训练。这是因为整个数据集通常太大,无法装入GPU内存。为了获得最佳性能,您可以通过更改MiniBatchSize
名称-值选项trainingOptions
函数。
最佳的迷你批处理大小取决于确切的网络、数据集和GPU硬件。当使用多个gpu进行训练时,每个图像批处理分布在多个gpu之间。这有效地增加了GPU可用的总内存,允许更大的批大小。推荐的做法是随着GPU的数量线性地扩大迷你批处理的大小,以保持每个GPU的工作负载不变。例如,如果您正在使用64个迷你批处理大小的单个GPU进行训练,并且您希望扩展到使用4个相同类型的GPU进行训练,那么您可以将迷你批处理大小增加到256,以便每个GPU在每次迭代中处理64个观察结果。
因为增加小批大小可以提高每次迭代的重要性,所以可以提高学习率。一个好的一般指导方针是,学习率与小批量大小的增加成比例地增加。根据您的应用程序,较大的小批量大小和学习率可以在不降低精确度的情况下加快训练,达到一定的限制。
如果您不想使用所有的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 (labindex));结束
trainNetwork
,预测
,分类
设置时自动使用当前并行池ExecutionEnvironment
选项“multi-gpu”
(或“平行”
同样的结果)。
另一种选择是选择使用WorkerLoad
名称-值参数在trainingOptions
.例如:
parpool (“本地”5);选择= trainingOptions (“个”,“WorkerLoad”, [1 1 1 0 1],...)
gpuDevice
.
如果你想用一个GPU同时训练多个模型,那就启动一个并行池,每个可用的GPU都有一个worker,然后在不同的worker上训练每个网络。使用parfor
或parfeval
在每个工作人员上同时执行一个网络。使用trainingOptions
函数设置ExecutionEnvironment
名称选择“图形”
在每一个工人。
例如,使用以下形式的代码,在所有可用的gpu上并行训练多个网络:
选择= trainingOptions (“个”,“ExecutionEnvironment”,“图形”);parfori = 1: gpuDeviceCount (“可用”) trainNetwork(…,选项);结束
要在后台运行而不阻塞您的本地MATLAB,请使用parfeval
.举例说明如何使用parfor
和parfeval
,请参阅
MATLAB中的一些多gpu特性,包括trainNetwork
,通过快速互连进行直接通信,以提高性能。
如果有适当的硬件连接,那么多个gpu之间的数据传输将使用快速的点对点通信,如果可用,还包括NVLink。
如果您使用的Linux计算集群具有机器之间的快速互连(如Infiniband),或者不同机器上的gpu之间的快速互连(如GPUDirect RDMA),那么您可能能够利用MATLAB中的快速多节点支持。金宝app通过设置环境变量,在池中金宝app的所有工作人员上启用这种支持PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION
来1
.在集群概要文件管理器中设置此环境变量。
这个特性是NVIDIA NCCL库用于GPU通信的一部分。要配置它,您必须设置额外的环境变量来定义网络接口协议,尤其是NCCL_SOCKET_IFNAME
.有关更多信息,请参见NCCL文档特别是关于NCCL环境变量.
trainNetwork
|trainingOptions
|gpuDevice
(并行计算工具箱)|spmd
(并行计算工具箱)|imageDatastore