MATLAB博客

给处于领先地位的人的实用建议

MATLAB的高性能计算(HPC)和“大数据”数据类型

我现在正在为 SC22 这是我作为MathWorker参加的第一次超级计算会议。当与来自其他高性能计算组织的老朋友制定计划时,他们对MATLAB不太了解,我经常被问到“MATLAB中的高性能计算....”除此之外还有什么 parfor ?'
parfor 它非常棒,允许用户只添加3个字母就可以从串行循环转换为并行循环,但这只是MATLAB中并行和可扩展编程的可能性的开始。
今天,我想简要介绍一下MATLAB的HPC数据类型,它允许用户使用gpu、分布式内存和处理核外数据。

GPU数组- GPU编程变得简单

gpu 图形处理单元(Graphics Processing Units)可以极大地加速某些类型的计算。MATLAB目前只支持NVIDIA图形处理器金宝app,传统上使用一种名为 CUDA .你可以在CUDA编码,如果你想,并接口到MATLAB使用 CUDA mex函数 ....但有一个更简单的方法。
假设你有一个数组, X
X = [1,2,3];
将此传输到GPU with
G = gpuArray(X);
你接下来做的任何计算 gpuarray G 将自动在GPU上执行。
Gsq = g ^2;% GPU执行
Gsin = sin(G);% GPU执行
与其他“HPC数据类型”一样,您使用 收集 将结果转换回“正常”MATLAB矩阵
Xsq = gather(Gsq);
Xsin = gather(Gsin);
gpuArrays要求 并行计算工具箱

dlarray -专门用于深度学习训练的对象

dlarray 是用于进行深度学习的数组类型。它支持金宝app 自动分化 并且可以包含由CPU计算的“正常”数组 gpuArrays .如何使用 dlarrays 这超出了本文的范围,所以我只展示如何创建它们并链接到文档。
X = randn(3,5);
dlX = dlarray(X)使用dlX所做的任何事情都将使用CPU进行计算
dlX =
3×5 dlarray -0.1472 -0.5046 - 0.6487 -0.4711 0.3018 1.0078 -1.2706 0.8257 0.1370 0.3999 -2.1237 -0.3826 -1.0149 -0.2919 -0.9300
如果我们想要 dlarray 在GPU上创建
gX = randn(3,5,“gpuArray”);
dlgX = dlarray(gX)你用dlgX做的任何事情都将使用GPU进行计算
dlgX =
3×5 gpuArray dlarray -0.7891 1.2915 0.8958 -1.6692 1.1301 -1.0132 0.2066 -0.3653 0.8798 2.0214 1.2300 -1.1879 -1.2931 -0.8332 0.5199
你需要 深度学习工具箱 利用,利用 dlarray。

高数组——当行数多于内存时使用

高大的数组 对于具有数百万甚至数十亿行的表格数据非常有用。事实上,如此多的行,您永远无法将它们全部加载到内存中。
假设您的所有数据都存储在一个名为。csv文件的文件夹中 mydata .我们首先创建一个 数据存储 指向所有这些文件。
数据存储(“mydata \ * . csv”);
注意,我们并没有将所有的数据加载到内存中,我们只是创建了一个对象, ds, 它表示并指向数据。我们可以看到它的类型
类(ds)
ans =“matlab.io.datastore.TabularTextDatastore”
在此基础上进行操作 数据存储 现在我们从它创建一个高数组。因为我已经安装了并行计算工具箱,所以我还将启动一个本地池 数组操作是并行执行的。如果没有并行计算工具箱,所有的安装都将按顺序执行。
删除(gcp (“nocreate”))%确保当前没有并行池
parpool (“进程”);
启动并行池(parpool)使用'processes'配置文件…连接到并行池(工人数:8)。
Tt =高(ds)
tt = M×4高桌的事情 其它事情 BigThings SmallThings _________ ___________ _____ ___________0.85071 0.61257 7.3864 0.076903 0.56056 0.98995 5.8599 0.058145 0.92961 0.52768 2.4673 0.092831 0.69667 0.6642 0.058009 0.58279 0.80135 0.83483 0.0016983 0.8154 0.22784 6.2596 0.012086 0.87901 0.49809 6.6094 0.086271 0.98891 0.90085 7.2975 0.04843::::::::
这显示了数据的预览。注意,tall数组的高度是未知的(MATLAB只是告诉我们有“M”行),因为我们还没有解析所有的文件。我们可以对这个高数组进行操作,就像它是MATLAB中的任何其他表一样。
我们求均值 BigThings
卑鄙的(卑鄙的)
BigThingsMean =高双份?预览延期。学习更多的知识。
这演示了高数组和普通内存中的MATLAB数组之间的另一个区别 Deffered评价 .在显式请求执行计算之前,所有内容都不计算。当对高数组进行多次操作时,这种行为允许MATLAB在被要求评估最终结果时最小化通过数据的次数。
我们要求使用 收集 命令。因为我有并行计算工具箱,所以使用本地进程池自动并行完成。
收集(BigThingsMean)
使用并行池“进程”评估tall表达式:-通过1 / 1:在4.3秒内完成评估在5.2秒内完成
Ans = 4.6679
高阵列的工作原理是一次只在内存中存储合理大小的数据块,还可以利用并行基础设施,例如本地计算机上的并行工作线程、传统的HPC集群或 甚至Spark集群
高数组在基础MATLAB中可用,但可以使用它来加速和缩放 并行计算工具箱 并进一步扩大 MATLAB并行服务器

分布式阵列——将您的阵列分布在HPC集群的多个节点上

如果您的矩阵太大,无法容纳到HPC集群的一个节点上,请使用 分布式阵列 将其分散到多个节点。
正如你可以使用的 高(foo) 要创建高数组,可以使用 分布式(foo) 创建分布式数组。使用分布式数组,结果是 在内存中,但是这个内存是在多个worker之间共享的。确保这些worker位于HPC集群的多个节点上,并且完全分布式、并行计算是属于您的。
第一个例子创建了一个 分布式 数组 一个 从一个普通数组 X 这并不是特别有用,因为如果数组适合单个机器的内存,那么使用分布式数组就没有多大意义了。我们将看到更复杂、更有用的创建方法 分布式 数组。
从普通数组X创建分布式数组
X = rand(4);
A =分布(X);
你可以使用这个变量 一个 作为一个单一的实体,而不必担心它的分布式性质。例如,计算奇异值分解的代码与我们处理普通数组的代码是相同的。
distres = svd(A);计算分布式阵列的svd, A
结果仍然是一个分布式数组
类(分配)
ans =“分布式”
当您准备将结果返回到客户机内存中时,请使用 收集 函数,就像处理一个高数组一样。但是,在这里必须小心确保我们只请求适合客户端机器内存的结果。
%从集群返回
Res =收集(distres)
res = 4×1
1.8891 0.7206 0.6445 0.2742
这是一个普通的MATLAB数组。
类(mysvd)
ans =“双”
在这里,我展示了如何从一个普通的MATLAB数组创建分布式数组,当您仔细考虑它时,除了用于原型设计之外,它有点毫无意义。 如果您可以将X放入内存中,那么使用分布式数组而不是普通数组没有任何好处。
我们还可以使用函数,直接在worker上创建分布式数组 兰德,randn 而且 0 .这样,整个矩阵就不必放入客户机的内存中。例如,
random = rand(5,“分布式”);
类(distRandom)
ans =“分布式”
通常, 创建 是分布式计算工作流中最困难的部分!其他创建方法包括使用 spmd, codistributed 数组(请参阅下一节) 而且 数据存储。 参考文档 欲知详情。
分布式阵列支持超过500个函数金宝app 包括绝大多数线性代数运算(HPC专家注意:我们使用 scalapack图书馆 其中一些是在幕后)。
分布式数组需要 并行计算工具箱 作为一个最低限度,但你还需要MATLAB并行服务器来使用多节点操作。

共分布数组-分布式数组用户的高级动作

分布式 数组实际上是一种方便的底层数据类型的用户界面 codistributed 数组。我们可以这样想:A 分布式 数组是指整个分布式矩阵的抽象,您可以使用它而不用担心它的分布式性质。存在于每个worker上的数组的部分是a codistributed 数组中。
明确使用 codistributed 数组是一个相当高级的动作,因为它们几乎总是在内部使用 spmd 块本身是比许多用户使用的更高级的并行结构。
删除(gcp (“nocreate”))%确保当前没有并行池
parpool (“进程”2);创建一个有2个工人的池
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:2)。
现在我们有游泳池了,我们可以 spmd
spmd每个worker运行spmd块的内容
格式紧凑的
A = 0 (80,1000);
D =共分布(A)
流("这个worker的D类是%s"类(D))
结束
Worker 1:这个Worker存储D(:,1:500)。LocalPart: [80x500 double] Codistributor: [1x1 codistributor1d] Worker 2:这个Worker存储D(:,501:1000)。LocalPart: [80x500 double] Codistributor: [1x1 codistributor1d] Worker 1:这个Worker上的D类是共分布的Worker 2:这个Worker上的D类是共分布的
流("在spmd块外的D的类是%s"类(D))
在spmd块之外的类D是分布的
上面的例子有点傻,因为每个worker都会创建 整个 数组 一个 在使用 codistributed 函数将其传播到各个工作人员。然而,它的目的是展示幕后发生的事情。 spmd block在我们的客户端MATLAB中, D 是一个 分布式 引用整个矩阵的数组。 内部 spmd 块,因此在每个工人上,D是a codistributed 数组中。我们可以得到 D 对象存储在每个工作者上 getLocalPart () 函数在 spmd 块。
关于共分布数组的进一步讨论超出了本文的范围,但实际上您可以使用它们来更好地控制分布式数组。例如,您可以对存储在每个工作人员或更改上的部分执行一些独特的操作 如何 分布式数组分布在使用 codistributor
这就是MATLAB中一些数据类型的快速概览,这些数据类型有助于高性能计算。
|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。