使用 Chapel 处理海量矩阵
Use Chapel to handle massive matrix
我最近遇到了 Chapel,我非常想尝试一下。我有两个问题,希望它能解决。
我通常使用 Python 或 C++ 工作。 Java 后退到角落时。
我有两个矩阵 I
和 V
。两者都是稀疏的,尺寸约为 600K x 600K,人口密度约为 1%。
首先,使用 SciPy,我现在可以将两者从 SQL 数据库加载到内存中。但是,我预计我们的下一次迭代对于我们的机器来说太大了。也许 1.5M^2。在这种情况下,来自 Spark 的 RDD 可能会为负载工作。我无法让 PyTables 实现这一目标。我知道这被描述为 "Out-of-core" 问题。
即使它们确实加载了,I'IV
也会在几分钟内出现 OOM。 (这里 I'
是转置),所以我正在研究将此乘法分布到多个内核(SciPy 可以做到)和多台机器(据我所知,它不能做到)。在这里,Spark 倒下了,但可以这么说,Chapel 似乎回应了我的祈祷。
一个严重的限制是机器的预算。例如,我买不起 Cray。 Chapel 社区有这方面的模式吗?
从几个高级点开始:
- Chapel 语言的核心更多是关于数组(数据结构)而不是
关于矩阵(数学对象),尽管显然可以使用数组
来表示一个矩阵。将区别视为支持的集合
操作(例如,数组与数组的迭代、访问和元素操作)
矩阵的转置、叉积和因式分解)。
- Chapel 支持稀疏和关联数组以及密集数组。
- Chapel 数组可以存储在单个内存的本地或分布在
多个内存/计算节点。
- 在礼拜堂,你应该期待
matrices/linear 通过库支持代数运算
而不是语言。虽然 Chapel 已经开始了这样的
图书馆,它们仍在扩建中——
具体来说,Chapel 没有库支持 distributed
Chapel 1.15 的线性代数运算意味着用户将拥有
手动编写此类操作。
更详细:
以下程序创建了一个块分布式密集数组:
use BlockDist;
config const n = 10;
const D = {1..n, 1..n} dmapped Block({1..n, 1..n}); // distributed dense index set
var A: [D] real; // distributed dense array
// assign the array elements in parallel based on the owning locale's (compute node's) ID
forall a in A do
a = here.id;
// print out the array
writeln(A);
例如在6个节点(./myProgram -nl 6
)上运行时,输出为:
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
请注意,运行在多个节点上运行 Chapel 程序需要将其配置为使用 multiple locales。除了 Crays 之外,此类程序还可以 运行 在集群或网络工作站上。
这是一个声明分布式稀疏数组的程序:
use BlockDist;
config const n = 10;
const D = {1..n, 1..n} dmapped Block({1..n, 1..n}); // distributed dense index set
var SD: sparse subdomain(D); // distributed sparse subset
var A: [SD] real; // distributed sparse array
// populate the sparse index set
SD += (1,1);
SD += (n/2, n/4);
SD += (3*n/4, 3*n/4);
SD += (n, n);
// assign the sparse array elements in parallel
forall a in A do
a = here.id + 1;
// print a dense view of the array
for i in 1..n {
for j in 1..n do
write(A[i,j], " ");
writeln();
}
运行 在六个语言环境中给出:
1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0
在上面的两个示例中,forall 循环将以所有者计算的方式使用多个节点在分布式数组/索引上进行计算,并使用每个节点的多个核心来完成本地工作。
现在有一些注意事项:
从 Chapel 1.15.0 开始,分布式稀疏数组支持仍处于起步阶段,因为迄今为止该项目对分布式内存的大部分关注都集中在任务并行性和分布式密集数组上。伯克利在今年的 annual Chapel workshop、"Towards a GraphBLAS Library in Chapel" 上发表的一篇论文+演讲强调了几个性能和可扩展性问题,其中一些问题已经在 master 分支上得到修复,其他问题仍然需要引起注意。用户对此类功能的反馈和兴趣是加速改进这些领域的最佳方式。
正如一开始提到的,线性代数库是 Chapel 的一个半成品。过去的版本为 BLAS and LAPACK. Chapel 1.15 included the start of a higher-level LinearAlgebra 库添加了 Chapel 模块。但是 none 目前支持分布式数组(设计为 BLAS 和 LAPACK,LinearAlgebra 因为它还处于早期阶段)。
Chapel 还没有 SQL 界面,尽管一些社区成员已经提出要添加此类支持。也可以使用 Chapel 的 I/O 功能来读取某些文本或二进制格式的数据。或者,您可以潜在地使用 Chapel 的互操作性功能来与可以读取 SQL 的 C 库交互。
我最近遇到了 Chapel,我非常想尝试一下。我有两个问题,希望它能解决。
我通常使用 Python 或 C++ 工作。 Java 后退到角落时。
我有两个矩阵 I
和 V
。两者都是稀疏的,尺寸约为 600K x 600K,人口密度约为 1%。
首先,使用 SciPy,我现在可以将两者从 SQL 数据库加载到内存中。但是,我预计我们的下一次迭代对于我们的机器来说太大了。也许 1.5M^2。在这种情况下,来自 Spark 的 RDD 可能会为负载工作。我无法让 PyTables 实现这一目标。我知道这被描述为 "Out-of-core" 问题。
即使它们确实加载了,I'IV
也会在几分钟内出现 OOM。 (这里 I'
是转置),所以我正在研究将此乘法分布到多个内核(SciPy 可以做到)和多台机器(据我所知,它不能做到)。在这里,Spark 倒下了,但可以这么说,Chapel 似乎回应了我的祈祷。
一个严重的限制是机器的预算。例如,我买不起 Cray。 Chapel 社区有这方面的模式吗?
从几个高级点开始:
- Chapel 语言的核心更多是关于数组(数据结构)而不是 关于矩阵(数学对象),尽管显然可以使用数组 来表示一个矩阵。将区别视为支持的集合 操作(例如,数组与数组的迭代、访问和元素操作) 矩阵的转置、叉积和因式分解)。
- Chapel 支持稀疏和关联数组以及密集数组。
- Chapel 数组可以存储在单个内存的本地或分布在 多个内存/计算节点。
- 在礼拜堂,你应该期待 matrices/linear 通过库支持代数运算 而不是语言。虽然 Chapel 已经开始了这样的 图书馆,它们仍在扩建中—— 具体来说,Chapel 没有库支持 distributed Chapel 1.15 的线性代数运算意味着用户将拥有 手动编写此类操作。
更详细:
以下程序创建了一个块分布式密集数组:
use BlockDist;
config const n = 10;
const D = {1..n, 1..n} dmapped Block({1..n, 1..n}); // distributed dense index set
var A: [D] real; // distributed dense array
// assign the array elements in parallel based on the owning locale's (compute node's) ID
forall a in A do
a = here.id;
// print out the array
writeln(A);
例如在6个节点(./myProgram -nl 6
)上运行时,输出为:
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
请注意,运行在多个节点上运行 Chapel 程序需要将其配置为使用 multiple locales。除了 Crays 之外,此类程序还可以 运行 在集群或网络工作站上。
这是一个声明分布式稀疏数组的程序:
use BlockDist;
config const n = 10;
const D = {1..n, 1..n} dmapped Block({1..n, 1..n}); // distributed dense index set
var SD: sparse subdomain(D); // distributed sparse subset
var A: [SD] real; // distributed sparse array
// populate the sparse index set
SD += (1,1);
SD += (n/2, n/4);
SD += (3*n/4, 3*n/4);
SD += (n, n);
// assign the sparse array elements in parallel
forall a in A do
a = here.id + 1;
// print a dense view of the array
for i in 1..n {
for j in 1..n do
write(A[i,j], " ");
writeln();
}
运行 在六个语言环境中给出:
1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0
在上面的两个示例中,forall 循环将以所有者计算的方式使用多个节点在分布式数组/索引上进行计算,并使用每个节点的多个核心来完成本地工作。
现在有一些注意事项:
从 Chapel 1.15.0 开始,分布式稀疏数组支持仍处于起步阶段,因为迄今为止该项目对分布式内存的大部分关注都集中在任务并行性和分布式密集数组上。伯克利在今年的 annual Chapel workshop、"Towards a GraphBLAS Library in Chapel" 上发表的一篇论文+演讲强调了几个性能和可扩展性问题,其中一些问题已经在 master 分支上得到修复,其他问题仍然需要引起注意。用户对此类功能的反馈和兴趣是加速改进这些领域的最佳方式。
正如一开始提到的,线性代数库是 Chapel 的一个半成品。过去的版本为 BLAS and LAPACK. Chapel 1.15 included the start of a higher-level LinearAlgebra 库添加了 Chapel 模块。但是 none 目前支持分布式数组(设计为 BLAS 和 LAPACK,LinearAlgebra 因为它还处于早期阶段)。
Chapel 还没有 SQL 界面,尽管一些社区成员已经提出要添加此类支持。也可以使用 Chapel 的 I/O 功能来读取某些文本或二进制格式的数据。或者,您可以潜在地使用 Chapel 的互操作性功能来与可以读取 SQL 的 C 库交互。