浅神经网络并行计算和GPU计算
请注意
深入学习、并行和GPU的支持是自动的。万博1manbetx你可以训练一个卷积神经网络(CNN,事先)或长期短期记忆网络(LSTM或BiLSTM网络)使用trainNetwork
函数的执行环境(CPU、GPU multi-GPU和并行)trainingOptions
。
在GPU并行训练,或者,需要并行计算工具箱™。更多信息在深度学习gpu并行,明白了深度学习与大数据在cpu、gpu并行,在云上。
模式的并行性
神经网络固有的并行算法。多核cpu,图形处理单元(gpu)和集群的计算机有多个cpu和gpu可以利用并行性。
并行计算工具箱,使用时结合深度学习工具箱™,使神经网络训练和仿真利用每个模式的并行度。
例如,下面显示了一个标准的单线程的训练和模拟会话:
[x, t] = bodyfat_dataset;net1 = feedforwardnet (10);net2 =火车(net1 x, t);y = net2 (x);
两个步骤可以并行化在这个会话是调用火车
和隐含的调用sim卡
(网络net2
称为函数)。
在深入学习工具箱可以将任何数据,如x
和t
在前面的示例代码中,在样本。如果x
和t
只包含一个样品,没有并行性。但是,如果x
和t
包含成百上千的样本,并行性可以提供速度和规模效益问题。
分布式计算
并行计算工具箱允许神经网络训练和仿真运行在多个CPU核在单个电脑,或者在多个CPU在多个计算机网络上使用MATLAB®并行服务器™。
使用多核计算速度。使用多台计算机可以让你解决问题中使用数据集太大,以适应单个计算机的RAM。唯一限制问题大小可用内存的总量在所有电脑。
管理集群配置,使用MATLAB的集群配置文件管理器家选项卡环境菜单平行>管理集群配置文件。
打开一个池的MATLAB工人使用默认集群配置文件,这通常是本地CPU核心,使用这个命令:
池= parpool
开始平行池(parpool)使用过程的概要文件…连接到4工人。
当parpool
运行时,它显示了池中可用的工人数量。另一种方法来确定工人的数量查询池:
pool.NumWorkers
4
现在你可以训练和模拟神经网络分割的数据样本在所有的工人。为此,设置火车
和sim卡
参数“useParallel”
来“是的”
。
net2 =火车(net1 x, t,“useParallel”,“是的”)(x, y = net2“useParallel”,“是的”)
使用“showResources”
参数验证计算了跨多个工人。
net2 =火车(net1 x, t,“useParallel”,“是的”,“showResources”,“是的”);y = net2 (x,“useParallel”,“是的”,“showResources”,“是的”);
MATLAB表明哪些资源。例如:
计算资源:并行工人工人1 MyComputer,墨西哥人PCWIN64工人2 MyComputer,墨西哥人PCWIN64工人3 MyComputer,墨西哥人PCWIN64工人4 MyComputer, PCWIN64墨西哥人
当火车
和sim卡
被称为,他们输入矩阵或单元阵列数据划分为分布式综合值之前训练和仿真。当sim卡
计算复合,该输出转换回相同的矩阵或单元阵列形式之前返回。
然而,您可能想要手动执行这些数据部门如果:
主机的问题规模太大。手动定义元素复合值顺序定义允许更大的问题。
众所周知,一些工人在电脑上比其他人更快或者更大的内存。您可以分发数据与不同数量的样品每个工人。这就是所谓的负载平衡。
下面的代码顺序创建一系列的随机数据集和保存他们单独的文件:
池=质量;为i = 1:池。NumWorkers x =兰德(1000);保存([“输入”num2str (i)),“x”);t = x (1:)。* x (2:) + 2 * (x (1:) + x (2:));保存([“目标”num2str (i)),“t”);清晰的xt结束
因为数据定义的顺序,你可以定义一个数据集总比可以在主机电脑内存。电脑内存必须适应只有一次sub-dataset。
现在你可以加载顺序数据集在平行的工人,并培训和模拟网络的综合数据。当火车
或sim卡
被称为复合数据,“useParallel”
参数是自动设置“是的”
。当使用复合数据,配置网络的输入和输出匹配的一个数据集手动使用配置
函数前培训。
xc =复合;tc =复合;为i = 1:池。NumWorkers data =负载([“输入”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);
将复合输出返回sim卡
,您可以访问它的每个元素,另外如果担心内存的限制。
为i = 1:池。NumWorkers易= yc{我}结束
结合复合值到一个本地值如果你不关心内存限制。
y = {yc {:}};
负载平衡时,相同的过程,但是,不是每个数据集都有相同数量的样品(1000前一个例子),样品的数量可以调整到最佳利用的内存和速度差异工人主机电脑。
它不是必需的,每个工人数据。如果元素我
复合值是未定义的,工人我
不会被用于计算。
单一的GPU计算
核的数量,大小的内存,速度和效率的GPU卡与每个新一代快速增长。在视频游戏一直受益于GPU的性能改善,这些卡片现在足够灵活执行通用数值计算任务训练神经网络。
最新的GPU需求,看到并行计算工具箱的网页;或查询MATLAB来确定你的电脑是否支持GPU。万博1manbetx这个函数返回gpu的数量在你的系统:
数= gpuDeviceCount
数= 1
如果结果是一个或者更多的,你可以通过索引查询每个GPU为其特征。这包括其名称、数量的多处理器,SIMDWidth
每个多处理器和内存总量。
gpu1 = gpuDevice (1)
gpu1 = CUDADevice属性:名称:“英伟达RTX A5000”指数:1 ComputeCapability:“8.6”SupportsDouble: 1 DriverVersi万博1manbetxon: 11.6000 ToolkitVersion: 11.2000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 (49.15 KB) MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475 e + 09年65535 65535]SIMDWidth: 32 TotalMemory: 25553076224 (25.55 GB) AvailableMemory: 25153765376 (25.15 GB) MultiprocessorCount: 64 ClockRateKHz: 1695000 ComputeMode:“违约”GPUOverlapsTransfers: 1 KernelExecutionTimeout: 0 CanMapHostMemory: 1 DeviceSupported: 1 DeviceAvailable: 1 DeviceSelected: 1
利用GPU的最简单方法是指定电话火车
和sim卡
参数与参数“useGPU”
设置为“是的”
(“不”
是默认的)。
net2 =火车(net1 x, t,“useGPU”,“是的”)(x, y = net2“useGPU”,“是的”)
如果net1
有默认的训练函数trainlm
,你会看到一个警告,不支持GPU计算雅可比矩阵训练,只有梯度训练。万博1manbetx所以训练函数自动改为梯度训练功能trainscg
。为了避免通知,您可以指定函数之前培训:
net1。火车Fcn =“trainscg”;
验证培训和模拟发生在GPU设备,要求计算机资源显示:
net2 =火车(net1 x, t,“useGPU”,“是的”,“showResources”,“是的”)(x, y = net2“useGPU”,“是的”,“showResources”,“是的”)
上面的代码输出以下资源简介:
计算资源:GPU设备# 1,GeForce 470 GTX公司
许多MATLAB函数时自动执行GPU的任何输入参数是一个gpuArray。通常你移动数组的GPU的功能gpuArray
和收集
。然而,对于神经网络在GPU的计算效率,需要转置矩阵和列填充,这样每一列的第一个元素正确对齐的GPU内存。深度学习工具箱提供了一个特殊的函数nndata2gpu
将一个数组GPU,妥善组织:
xg = nndata2gpu (x);tg = nndata2gpu (t);
现在你可以使用转换后的数据训练和模拟网络已经在GPU上,而不必指定“useGPU”
论点。然后转换和返回结果GPU数组与互补的MATLAB函数gpu2nndata
。
培训与gpuArray数据之前,必须手动配置网络的输入和输出与普通MATLAB矩阵使用配置
功能:
net2 =配置(net1 x, t);%与MATLAB阵列配置net2 =火车(net2 xg, tg);%与NNET格式化gpuArrays GPU执行yg = net2 (xg);%在GPU执行y = gpu2nndata (yg);%阵列转移到本地工作区
在gpu和其他硬件,您可能想要部署你的神经网络,通常情况下,指数函数经验值
不是用硬件实现,而是软件库。这可以减缓神经网络使用tansig
乙状结肠传递函数。另一个功能是艾略特乙状结肠函数的表达式不包括调用任何高阶函数:
(方程)= 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”,“是的”)(x, y = net2“useParallel”,“是的”,“useGPU”,“是的”,“showResources”,“是的”)
这些行代码使用所有可用的工人在并行池。为每一个独特的GPU雇佣一个工人的GPU,而其他工人操作的cpu。在某些情况下,它可能只使用gpu更快。例如,如果一台计算机有三个gpu和四名工人,由三个gpu加速的三个工人可能被第四CPU速度有限的工人。在这些情况下,您可以指定火车
和sim卡
只使用工人具有独特的gpu。
net2 =火车(net1 x, t,“useParallel”,“是的”,“useGPU”,“只”,“showResources”,“是的”)(x, y = net2“useParallel”,“是的”,“useGPU”,“只”,“showResources”,“是的”)
与简单的分布式计算、分布式GPU计算可以受益于手动创建的组合值。自己定义复合值可以表示使用哪个工人,多少样品分配给每个工人,工人使用gpu。
例如,如果您有四个工人,只有三个GPU,您可以定义为GPU工人更大的数据集。在这里,一个随机数据集创建不同的样本加载/复合元素:
numSamples = (1000 1000 1000 300);xc =复合;tc =复合;为我= 1:4ξ=兰特(2,numSamples(我));:ti = xi (1)。^ 2 + 3 * xi (2:);xc{我}= xi;tc{我}=钛;结束
现在可以指定火车
和sim卡
使用三个gpu可用:
net2 =配置(tc net1 xc {1}, {1});net2 =火车(xc net2, tc,“useGPU”,“是的”,“showResources”,“是的”);yc = net2 (xc、“showResources”,“是的”);
确保使用的gpu得到前三个工人,每个工人的复合元素gpuArrays手动转换。每个工人执行这种转换在一个并行执行spmd
块。
spmd如果spmdIndex < = 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只有一个工人,所以计算是最有效的。如果多个工人分配gpuArray数据在同一GPU计算仍将工作,但将会更慢,因为GPU将按顺序操作多个工人的数据。
并行时间序列
时间序列网络,简单地使用细胞数组值x
和t
,可选地包括初始输入延迟的状态习
和初始层延迟的状态人工智能
,如需要。
net2 =火车(net1 x, t, xi,人工智能,“useGPU”,“是的”)y = net2 (x, xi,人工智能,“useParallel”,“是的”,“useGPU”,“是的”)net2 =火车(net1 x, t, xi,人工智能,“useParallel”,“是的”)y = net2 (x, xi,人工智能,“useParallel”,“是的”,“useGPU”,“只”)net2 =火车(net1 x, t, xi,人工智能,“useParallel”,“是的”,“useGPU”,“只”)y = net2 (x, xi,人工智能,“useParallel”,“是的”,“useGPU”,“只”)
注意,并行遇到样本,或在时间序列在不同的系列。但是,如果网络只有输入延迟,没有层延迟,延迟输入可以预先计算的,这样计算的目的,步骤成为不同的样本,可以并行。这是网络等timedelaynet
和开环版本的narxnet
和narnet
。如果一个网络层延迟,那么时间不能“夷为平地”计算的目的,所以单序列数据不能并行。这是网络等layrecnet
和闭环版本的narxnet
和narnet
。然而,如果数据包含多个序列,它可以单独序列并行。
平行的可用性、回退和反馈
如前所述,您可以查询MATLAB来发现当前并行资源可用。
看到什么gpu可用主机:
gpuCount = gpuDeviceCount为i = 1: gpuCount gpuDevice(我)结束
看到许多工人正在运行在当前并行池:
poolSize = pool.NumWorkers
看到可用在gpu并行池运行在PC集群使用MATLAB并行服务器:
spmd工人。我ndex = spmdIndex; worker.name = system(的主机名);工人。gpuCount = gpuDeviceCount;试一试工人。gpuInfo = gpuDevice;抓工人。gpuInfo = [];结束工人结束
当“useParallel”
或“useGPU”
将“是的”
,但平行或GPU工人用时,该公约是当资源请求,使用它们,如果可用。执行计算,即使他们不是没有错误。回落的过程从请求资源实际资源情况如下:
如果
“useParallel”
是“是的”
但并行计算工具箱不可用,或者一个平行的游泳池不开放,然后计算恢复线程MATLAB。如果
“useGPU”
是“是的”
但当前MATLAB gpuDevice会话是否未赋值的支持,然后计算回归正常CPU。万博1manbetx如果
“useParallel”
和“useGPU”
是“是的”
,然后用一个独特的GPU每个工人使用GPU,和其他工人回到CPU。如果
“useParallel”
是“是的”
和“useGPU”
是“只”
,然后用独特的工人使用gpu。其他工人不习惯,除非没有工人的gpu。没有gpu,所有工人使用cpu。
当不确定什么硬件实际上是被雇佣,检查gpuDeviceCount
,gpuDevice
,pool.NumWorkers
确保所需的硬件是可用的,和电话火车
和sim卡
与“showResources”
设置为“是的”
验证资源实际使用。