主要内容

基于并行和GPU计算的浅神经网络

请注意

对于深度学习,并行和GPU支持是自动的。金宝app您可以训练卷积神经网络(CNN, ConvNet)或长短期记忆网络(LSTM或BiLSTM网络)使用trainNetwork函数和选择执行环境(CPU、GPU、多GPU和并行)使用trainingOptions

并行训练,或在GPU上,需要并行计算工具箱™。有关gpu和并行深度学习的更多信息,请参见基于cpu、gpu、并行和云的大数据深度学习

模式的并行性

神经网络本质上是并行算法。多核cpu、图形处理单元(gpu)和具有多个cpu和gpu的计算机集群可以利用这种并行性。

并行计算工具箱,当与深度学习工具箱™一起使用时,可以使神经网络训练和模拟利用每一种并行模式。

例如,下面展示了一个标准的单线程训练和模拟会话:

[x, t] = bodyfat_dataset;net1 = feedforwardnet (10);Net2 = train(net1, x, t);y = net2 (x);

在此会话中可以并行执行的两个步骤是调用火车隐含的呼唤sim卡(网络net2作为函数调用)。

在深度学习工具箱中,你可以分割任何数据,例如xt在前面的示例代码中。如果xt每个只包含一个样本,没有并行性。但是,如果xt包含数百或数千个示例,并行性可以提供速度和问题大小的好处。

分布式计算

并行计算工具箱允许神经网络训练和模拟在单个PC上的多个CPU核上运行,或在使用网络的多个计算机上的多个CPU上运行MATLAB®并行服务器™

使用多核可以提高计算速度。使用多台计算机可以让您使用太大的数据集来解决问题,而这些数据集无法放入单台计算机的RAM中。问题大小的唯一限制是所有计算机可用RAM的总量。

要管理集群配置,请使用MATLAB中的集群配置文件管理器首页选项卡环境菜单平行>管理集群配置文件

要使用默认的集群配置文件(通常是本地CPU内核)打开MATLAB工作者池,请使用以下命令:

池= parpool
使用“local”配置文件启动并行池(parpool)…连接到4个工人。

parpool运行时,它显示池中可用的工作人员数量。确定工人数量的另一种方法是查询池:

池。NumWorkers
4

现在你可以训练和模拟神经网络,数据由样本分割到所有的工人。要做到这一点,设置火车sim卡参数“useParallel”“是的”

net2 =火车(net1 x, t,“useParallel”“是的”y = net2(x,“useParallel”“是的”

使用“showResources”参数来验证计算是否在多个工作人员之间运行。

net2 =火车(net1 x, t,“useParallel”“是的”“showResources”“是的”);y = net2 (x,“useParallel”“是的”“showResources”“是的”);

MATLAB显示所使用的资源。例如:

计算资源:Parallel Workers Worker 1 on MyComputer, MEX on PCWIN64 Worker 2 on MyComputer, MEX on PCWIN64 Worker 3 on MyComputer, MEX on PCWIN64 Worker 4 on MyComputer, MEX on PCWIN64

火车sim卡,在训练和仿真之前,将输入矩阵或单元阵列数据划分为分布式的Composite值。当sim卡已经计算了一个Composite,该输出在返回之前被转换回相同的矩阵或单元阵列形式。

但是,您可能希望手动执行此数据划分,如果:

  • 问题大小对主机来说太大了。手动定义Composite值的元素可以定义更大的问题。

  • 众所周知,一些工作人员使用的计算机比其他人更快或内存更大。您可以使用每个工作人员不同数量的样本来分发数据。这称为负载均衡。

下面的代码依次创建一系列随机数据集,并将它们保存到单独的文件中:

池=质量;i = 1:池。NumWorkers x = rand(2,1000);保存([“输入”num2str (i)),“x”);T = x(1,:) . x(2,:) + 2 * (x(1,:) + x(2,:));保存([“目标”num2str (i)),“t”);清晰的xt结束

因为数据是顺序定义的,所以可以定义一个大于主机PC内存容量的总数据集。PC内存每次只能容纳一个子数据集。

现在,您可以跨并行工作人员顺序加载数据集,并在Composite数据上训练和模拟网络。当火车sim卡调用Composite数据时,“useParallel”参数自动设置为“是的”.使用Composite数据时,配置网络的输入和输出以匹配其中一个数据集配置函数前培训。

xc =复合;tc =复合;i = 1:池。NumWorkers数据= load([“输入”num2str (i)),“x”);xc{我}= data.x;data =负载([“目标”num2str (i)),“t”);tc{我}= data.t;清晰的数据结束net2 =配置(tc net1 xc {1}, {1});net2 =火车(xc net2, tc);yc = net2 (xc);

转换返回的Composite输出sim卡,您可以分别访问它的每个元素,如果考虑到内存限制的话。

i = 1:池。yi = yc{i}结束

如果不考虑内存限制,则将Composite值组合为一个本地值。

y = {yc {:}};

当负载平衡时,同样的过程发生,但是,不是每个数据集有相同的样本数量(在前面的例子中是1000),样本数量可以调整,以最好地利用工作主机的内存和速度差异。

不是要求每个worker都有数据。如果元素未定义,worker将不会在计算中使用。

单一的GPU计算

每一代GPU卡的核心数量、内存大小和速度效率都在快速增长。视频游戏长期以来受益于GPU性能的提升,而这些卡现在已经足够灵活,可以执行一般的数值计算任务,比如训练神经网络。

最新的GPU要求请参见“并行计算工具箱”网页;或查询MATLAB来确定您的PC是否有支持的GPU。金宝app这个函数返回系统中gpu的数量:

数= gpuDeviceCount
数= 1

当查询结果为一个或多个时,可以通过索引查询每个GPU的特征。这包括它的名字,多处理器的数量,SIMDWidth每个多处理器的总内存。

gpu1 = gpuDevice (1)
gpu1 = CUDADevice属性:名称:“GeForce 470 GTX公司”指数:1 ComputeCapability:“2.0”SupportsDouble: 1 Drive金宝apprVersion: 4.1000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [65535 65535 1] SIMDWidth: 32 TotalMemory: 1.3422 e + 09 AvailableMemory: 1.1056 e + 09 MultiprocessorCount: 14 ClockRateKHz:1215000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout: 1 CanMapHostMemory: 1 Device金宝appSupported: 1 DeviceSelected: 1

利用GPU最简单的方法是指定调用火车sim卡使用参数参数“useGPU”设置为“是的”“不”是默认的)。

net2 =火车(net1 x, t,“useGPU”“是的”y = net2(x,“useGPU”“是的”

如果net1是否有默认的培训功能trainlm,你会看到一个警告,GPU计算不支持雅可比矩阵训练,只支持梯度训练。金宝app于是训练函数就自动变成了梯度训练函数trainscg.为避免通知,可在培训前指定功能:

net1。trainFcn =“trainscg”

为了验证训练和模拟发生在GPU设备上,请求显示计算机资源:

net2 =火车(net1 x, t,“useGPU”“是的”“showResources”“是的”y = net2(x,“useGPU”“是的”“showResources”“是的”

上面的每一行代码都输出以下资源摘要:

计算资源:GPU设备#1,GeForce GTX 470

当输入参数是gpuArray时,许多MATLAB函数会自动在GPU上执行。通常情况下,你可以使用这些函数在GPU之间移动数组gpuArray收集.然而,为了使GPU上的神经网络计算有效,需要对矩阵进行置换,并填充列,以使每列中的第一个元素在GPU内存中正确对齐。深度学习工具箱提供了一个叫做nndata2gpu将阵列移动到GPU并正确组织它:

xg = nndata2gpu (x);tg = nndata2gpu (t);

现在你可以使用GPU上已经转换的数据来训练和模拟网络,而无需指定“useGPU”论点。然后利用互补函数将得到的图形处理器阵列转换并返回到MATLABgpu2nndata

在使用gpuArray数据进行训练之前,网络的输入和输出必须使用正则MATLAB矩阵手动配置配置功能:

net2 =配置(net1 x, t);使用MATLAB数组配置net2 =火车(net2 xg, tg);%使用NNET格式的gpuArrays在GPU上执行yg = net2 (xg);%在GPU上执行y = gpu2nndata (yg);将数组转移到本地工作区

在gpu和其他硬件上,你可能想要部署你的神经网络,通常情况下,指数函数经验值不是用硬件实现的,而是用软件库实现的。这会减慢神经网络使用tansig乙状结肠传递函数。另一个替代函数是Elliot s型函数,其表达式不包括对任何高阶函数的调用:

a = n / (1 + abs(n))

训练前,网络tansig层可以转换为elliotsig层如下:

我= 1:net.numLayers如果比较字符串(net.layers{我}.transferFcn,“tansig”) net.layers{}。transferFcn =“elliotsig”结束结束

现在,在GPU上进行训练和模拟可能会更快,部署硬件也更简单。

分布式GPU计算

分布式计算和GPU计算可以结合在一起,在一台计算机或集群上运行多个cpu和/或GPU的计算MATLAB并行服务器

最简单的方法是指定火车sim卡为此,请使用由您使用的集群概要文件确定的并行池。的“showResources”在这种情况下特别推荐使用此选项,以验证正在使用预期的硬件:

net2 =火车(net1 x, t,“useParallel”“是的”“useGPU”“是的”“showResources”“是的”y = net2(x,“useParallel”“是的”“useGPU”“是的”“showResources”“是的”

这些代码行使用了并行池中所有可用的工作程序。每个独特的GPU使用一个worker,而其他worker作为cpu运行。在某些情况下,只使用gpu可能更快。例如,如果一台计算机有3个gpu和4个worker,由3个gpu加速的3个worker的速度可能会受到第4个CPU worker的限制。在这些情况下,您可以指定它火车sim卡只使用具有唯一gpu的工人。

net2 =火车(net1 x, t,“useParallel”“是的”“useGPU”“只”“showResources”“是的”y = net2(x,“useParallel”“是的”“useGPU”“只”“showResources”“是的”

与简单的分布式计算一样,分布式GPU计算可以从手工创建的Composite值中受益。自己定义Composite值可以指示要使用哪些worker、要给每个worker分配多少样例以及哪些worker使用gpu。

例如,如果你有4个工作器而只有3个GPU,你可以为这些GPU工作器定义更大的数据集。在这里,一个随机数据集被创建,每个Composite元素有不同的样本负载:

numSamples = [1000 1000 1000 300];xc =复合;tc =复合;i=1:4 xi = rand(2,numSamples(i));: ti = xi(1)。^ 2 + 3 * xi (2:);xc{我}= xi;tc{我}=钛;结束

您现在可以指定它火车sim卡使用三种可用图形处理器:

net2 =配置(tc net1 xc {1}, {1});net2 =火车(xc net2, tc,“useGPU”“是的”“showResources”“是的”);yc = net2 (xc、“showResources”“是的”);

为了确保前三个worker使用gpu,手动将每个worker的Composite元素转换为gpuArrays。每个worker在并行执行中执行这个转换spmd块。

spmd如果Labindex <= 3 xc = nndata2gpu(xc);tc = nndata2gpu (tc);结束结束

现在数据指定了何时使用gpu,所以您不需要告诉它火车sim卡这样做。

net2 =配置(tc net1 xc {1}, {1});net2 =火车(xc net2, tc,“showResources”“是的”);yc = net2 (xc、“showResources”“是的”);

确保每个GPU只被一个worker使用,这样计算效率最高。如果多个worker在同一个GPU上分配gpuArray数据,计算仍然可以工作,但速度会变慢,因为GPU将对多个workers的数据进行顺序操作。

并行时间序列

对于时间序列网络,只需使用单元格数组值xt,并可选地包括初始输入延迟状态西和初始层延迟状态人工智能,如需要。

net2 =火车(net1 x, t, xi,人工智能,“useGPU”“是的”y = net2(x,xi,ai,“useParallel”“是的”“useGPU”“是的”) net2 = train(net1,x,t,xi,ai,“useParallel”“是的”y = net2(x,xi,ai,“useParallel”“是的”“useGPU”“只”) net2 = train(net1,x,t,xi,ai,“useParallel”“是的”“useGPU”“只”y = net2(x,xi,ai,“useParallel”“是的”“useGPU”“只”

请注意,并行性发生在样本之间,或者在时间序列跨不同序列的情况下。但是,如果网络只有输入延迟,没有层延迟,则可以预先计算延迟的输入,以便计算时,时间步长变成不同的样本,并可以并行化。这就是网络的情况timedelaynet开环版本narxnetnarnet.如果网络有层延迟,那么时间就不能为了计算的目的而“平坦”,因此单个序列数据就不能并行化。这就是网络的情况layrecnet和闭环版本narxnetnarnet.但是,如果数据包含多个序列,则可以跨单独的序列并行化。

并行可用性、回退和反馈

如前所述,您可以查询MATLAB以发现当前可用的并行资源。

要查看主机上有哪些gpu可用:

gpuCount = gpuDeviceCounti = 1: gpuCount gpuDevice(我)结束

要查看当前并行池中有多少工作程序正在运行:

poolSize =池。NumWorkers

使用。查看在PC集群上运行的并行池中可用的gpuMATLAB并行服务器

spmd工人。我ndex = labindex; worker.name = system(的主机名);工人。gpuCount = gpuDeviceCount;试一试工人。gpuInfo = gpuDevice;工人。gpuInfo = [];结束工人结束

“useParallel”“useGPU”“是的”,但并行或GPU工作者不可用,惯例是当资源被请求时,如果可用就使用它们。即使没有错误,计算也不会出错。从请求资源退回到实际资源的过程如下:

  • 如果“useParallel”“是的”但并行计算工具箱不可用,或并行池未打开,则计算恢复到单线程MATLAB。

  • 如果“useGPU”“是的”但是当前MATLAB会话的gpuDevice是未分配或不支持的,然后计算返回到CPU。金宝app

  • 如果“useParallel”“useGPU”“是的”,则每个具有唯一GPU的worker使用该GPU,其他worker返回到CPU。

  • 如果“useParallel”“是的”“useGPU”“只”,则使用具有唯一图形处理器的工作人员。不使用其他worker,除非没有worker有gpu。在没有gpu的情况下,所有工作人员都使用cpu。

当不确定实际使用什么硬件时,请检查gpuDeviceCountgpuDevice,池。NumWorkers为了确保所需的硬件可用,调用火车sim卡“showResources”设置为“是的”以核实实际使用了哪些资源。