主要内容

具有平行和GPU计算的浅神经网络

笔记

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

并行训练,或在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”'是的'

使用'展览会'验证计算是否跨多个工人遇到的参数。

net2 =火车(net1 x, t,“useParallel”'是的''展览会''是的');y = net2 (x,“useParallel”'是的''展览会''是的');

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

计算资源:PCWIN64工作人员在我的PCWIN64工作人员中的PCWIN64工作人员2上的PCWIN64工作人员3在MEX上,MEX在PCWIN64工人4上MEX,MEX在PCWIN64上

什么时候火车SIM被调用,它们在训练和仿真之前将输入矩阵或小区阵列数据分成分布式复合值。什么时候SIM已经计算了一个复合材料,在返回之前,将该输出转换回相同的矩阵或单元格阵列形式。

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

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

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

以下代码顺序地创建了一系列随机数据集,并将它们保存到单独的文件:

池= GCP;为了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:pool.numworkers data = load([“输入”num2str(i)],'X');xc{我}= data.x;data =负载(['目标'num2str(i)],'T');tc {i} = data.t;清除数据结尾net2 = configure(net1,xc {1},tc {1});Net2 =火车(Net2,XC,TC);YC = Net2(XC);

转换返回的复合输出SIM,如果关注内存限制,则可以单独访问其每个元素。

为了i = 1:pool.numworkers yi = yc {i}结尾

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

Y = {YC {:}};

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

不要求每个工人都有数据。如果是元素一世综合价值是未定义的,工人一世将不在计算中使用。

单个GPU计算

每个新一代,GPU卡的内核数量,内存大小和速度效率都会迅速增长。如果视频游戏长期受益于改进的GPU性能,这些卡现在足够灵活,以执行培训神经网络等通用数值计算任务。

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

数= gpuDeviceCount
count = 1

如果结果是一个或多个,则可以通过索引查询每个GPU的特性。这包括其名称,多处理器数量,SimdWidth.每个多处理器的总内存。

gpu1 = gpudevice(1)
GPU1 =具有属性的Cudadevice:名称:'GeForce GTX 470'索引:1 Computapapity:'2.0'SupportsDouble:1驱动程序:4.1000金宝app MaxShreadsperock:49152 MaxThreadblocksize:[1024 1024 64] MAXGRIDSIZE:[65535 65535 1] SIMDWIDTH:32TotalMemory:1.3422E + 09可用性:1.1056E + 09 MultiProcessorCount:14 ClockRatekHz:1215000计算机:'默认'GPUoverLapStransfers:1 KernelexecutionTimeout:1 CanmaphostMemory:1 DemablePOSTED:1金宝app

利用GPU的最简单方法是指定呼叫火车SIM使用参数参数“useGPU”设置'是的''不'是默认值)。

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

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

net1。T.rainFcn ='trainscg';

要验证GPU设备上是否发生培训和仿真,请求显示计算机资源:

net2 =火车(net1 x, t,“useGPU”'是的''展览会''是的')y = net2(x,“useGPU”'是的''展览会''是的'

上述每个代码行中的每一行都会输出以下资源摘要:

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

当任何输入参数是GPUARRAY时,许多MATLAB函数在GPU上自动执行。通常,您可以使用功能移动阵列和从GPUgpuArray收集.然而,对于GPU上的神经网络计算是有效的,需要转换矩阵,并且列填充列,使得每列中的第一元件在GPU存储器中适当地对准。深度学习工具箱提供了一个调用的特殊功能nndata2gpu.要将数组移动到GPU并正确组织它:

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

现在你可以使用GPU上已经转换的数据来训练和模拟网络,而无需指定“useGPU”争论。然后使用互补函数转换并将结果的GPU数组返回到MATLABgpu2nndata.

在使用GPUARRAY数据训练之前,必须使用常规MATLAB矩阵手动配置网络的输入和输出配置功能:

net2 = configure(net1,x,t);%使用MATLAB阵列进行配置Net2 =火车(Net2,XG,TG);用NNET格式化GPUARRAYS上的GPU执行%yg = net2 (xg);%在GPU上执行Y = GPU2NNDATA(YG);%转移数组到本地工作空间

在gpu和其他硬件上,你可能想要部署你的神经网络,通常情况下,指数函数exp.不是用硬件实现的,而是用软件库实现的。这会减慢神经网络使用tansig符切传递函数。替代函数是Elliot Sigmoid函数,其表达式不包括对任何更高阶函数的调用:

(方程式)a = n /(1 + abs(n))

在培训之前,网络的tansig层可以转换为elliotsig层如下:

为了i = 1:net.numlayers如果strcmp(net.layers {i} .transferfcn,'tansig') net.layers{}。transferFcn =“elliotsig”;结尾结尾

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

分布式GPU计算

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

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

net2 =火车(net1 x, t,“useParallel”'是的'“useGPU”'是的''展览会''是的')y = net2(x,“useParallel”'是的'“useGPU”'是的''展览会''是的'

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

net2 =火车(net1 x, t,“useParallel”'是的'“useGPU”“只”'展览会''是的')y = net2(x,“useParallel”'是的'“useGPU”“只”'展览会''是的'

与简单的分布式计算一样,分布式GPU计算可以从手动创建的复合值中受益。定义综合值为自己允许您指出要使用的工人,可以分配给每个工作人员的样本,以及哪些工人使用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 {i} = xi;tc {i} = ti;结尾

您现在可以指定火车SIM使用三个GPU可用:

net2 = configure(net1,xc {1},tc {1});Net2 =火车(Net2,XC,TC,“useGPU”'是的''展览会''是的');YC = Net2(XC,'展览会''是的');

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

SPMD.如果Labindex <= 3 xc = nndata2gpu(xc);tc = nndata2gpu (tc);结尾结尾

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

net2 = configure(net1,xc {1},tc {1});Net2 =火车(Net2,XC,TC,'展览会''是的');YC = Net2(XC,'展览会''是的');

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

并行时间系列

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

net2 =火车(Net1,x,t,xi,ai,“useGPU”'是的'y = net2(x,xi,ai,“useParallel”'是的'“useGPU”'是的')Net2 =火车(Net1,X,T,XI,AI,“useParallel”'是的'y = net2(x,xi,ai,“useParallel”'是的'“useGPU”“只”)Net2 =火车(Net1,X,T,XI,AI,“useParallel”'是的'“useGPU”“只”y = net2(x,xi,ai,“useParallel”'是的'“useGPU”“只”

请注意,并行性遍及样本,或者在不同系列的时间序列的情况下发生。然而,如果网络仅具有输入延迟,则没有层延迟,可以预先计算延迟输入,以便为计算目的,时间步长变为不同的样本,并且可以是并行的。这是网络之类的情况timedelaynet.和开环版本NARXNET.Narnet..如果网络具有层延迟,则出于计算目的,时间不能“扁平化”,因此单个串联数据不能并行化。这是网络之类的情况layrecnet和闭环版本NARXNET.Narnet..但是,如果数据包含多个序列,则可以跨单独的序列并行化。

并行可用性,后退和反馈

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

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

gpuCount = gpuDeviceCount为了我= 1:gpucound gpudevice(i)结尾

要查看当前并行池中运行了多少工人:

poolsize = pool.numworkers.

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

SPMD.worker.index = labindex;Worker.Name = System(的主机名);worker.gpucount = gpudevicecount;尝试工人.gpuinfo = gpudevice;工人.gpuinfo = [];结尾工人结尾

什么时候“useParallel”或者“useGPU”'是的'但是,并行或GPU工人不可用,“公约”是在请求资源时,如果可用,则使用它们。即使它们不是,即使它们也没有错误地执行计算。从请求的资源退回到实际资源的过程发生如下:

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

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

  • 如果“useParallel”“useGPU”'是的'然后,每个具有唯一GPU的工作人员都使用该GPU,而其他工人还原为CPU。

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

当不确定实际使用哪些硬件时,检查gpuDeviceCountgpuDevice, 和池。NumWorkers确保可用所需的硬件,并致电火车SIM'展览会'设置'是的'验证实际使用的资源。