Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Chapel处理大量矩阵_Python_Scipy_Distributed Computing_Chapel - Fatal编程技术网

Python 使用Chapel处理大量矩阵

Python 使用Chapel处理大量矩阵,python,scipy,distributed-computing,chapel,Python,Scipy,Distributed Computing,Chapel,我最近遇到了Chapel,我非常想尝试一下。我有一个双重问题,我希望它能解决 我通常使用Python或C++来工作。当Java倒退到一个角落时 我有两个矩阵I和V。两者都是稀疏的,尺寸约为600K x 600K,密度约为1% 首先,使用SciPy,我现在可以从SQL数据库将两者加载到内存中。然而,我希望我们的下一次迭代对于我们的机器来说太大了。大约150万平方米。在这种情况下,Spark的RDD可能适用于负载。我无法让PyTables实现这一点。我理解这被描述为“核心外”问题 即使他们真的上膛了

我最近遇到了Chapel,我非常想尝试一下。我有一个双重问题,我希望它能解决

我通常使用Python或C++来工作。当Java倒退到一个角落时

我有两个矩阵
I
V
。两者都是稀疏的,尺寸约为600K x 600K,密度约为1%

首先,使用SciPy,我现在可以从SQL数据库将两者加载到内存中。然而,我希望我们的下一次迭代对于我们的机器来说太大了。大约150万平方米。在这种情况下,Spark的RDD可能适用于负载。我无法让PyTables实现这一点。我理解这被描述为“核心外”问题

即使他们真的上膛了,在几分钟内完成
I'IV
。(这里
I'
是转置),所以我正在研究将乘法分布在多个核(SciPy可以做到)和多台机器(据我所知,它不能做到)上。在这里,火花落下,但可以说,小教堂似乎回应了我的祈祷


一个严重的限制是机器的预算。例如,我买不起克雷。礼拜堂社区有这样的模式吗?

从几个高层次的要点开始:

  • Chapel语言的核心是数组(数据结构),而不是 关于矩阵(数学对象),尽管人们显然可以使用数组 表示矩阵。将区别视为一组受支持的 操作(例如,阵列的迭代、访问和基本操作与。 矩阵的转置、叉积和因式分解)
  • Chapel支持稀疏和关联数组以及密集数组
  • Chapel阵列可以存储在单个内存的本地,也可以分布在多个内存中 多个内存/计算节点
  • 在教堂里,你应该期待 通过库支持矩阵/线性代数运算 而不是语言。而Chapel正是从这一点开始的 图书馆,他们仍在扩大-- 具体来说,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程序需要将其配置为使用。除了Cray之外,这些程序还可以在集群或联网工作站上运行

下面是一个声明分布式稀疏数组的程序:

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开始,分布式稀疏阵列支持仍处于初级阶段,因为到目前为止,该项目对分布式内存的关注主要集中在任务并行性和分布式密集阵列上。伯克利在今年的“迈向教堂的GraphBLAS库”中发表了一篇论文+演讲,强调了几个性能和可伸缩性问题,其中一些问题已经在master branch上解决,其他问题仍然需要关注。用户对这些功能的反馈和兴趣是加速这些领域改进的最佳方式

  • 正如一开始提到的,线性代数库是Chapel正在进行的工作。过去的版本为和添加了Chapel模块。教堂1.15包括一个更高层次的图书馆的开始。但目前这些都不支持分布式阵列(BLAS和LAPACK的设计,LinearAlgebra,因为它还处于早期阶段)

  • Chapel还没有SQL接口,尽管一些社区成员已经就添加这种支持发出了隆隆声。也可以使用Chapel的I/O功能以某种文本或二进制格式读取数据。或者,您可以潜在地使用Chapel的互操作性特性与能够读取SQL的C库进行接口


@Brad没有提到两大优势,这两大优势在您的方向上发挥作用——Chapel项目是开源的,因此您的项目可以并且将受益于Chapel社区的巨大努力,跨越HPC领域十年以上的顶级经验。如果PyTables HDF5文件不在您的控制范围内,仍然可以使用ZeroMQ将远程节点的分布式稀疏数据加载程序与您选择的任何数据表示形式集成。Chapel针对HDF5(WIP)的新模块将直接与
HDF5
文件接口祝您好运,为HPC发现Chapel的美丽。Chapel似乎只是缺少我所需要的,尽管我希望它是答案。有人能提供一个使用LAPACK模块处理稀疏矩阵的例子吗?或者是一种从PyTables/disk小批量加载矩阵的好方法?如果还需要满足您庞大的数据规模,请给我一个提示,如果需要,您可以获得一个可扩展(即用即付)的私有解决方案,最多可使用数千个CPU加载数PB(SciPy和Chapel都会非常乐意)(如果不利用所有的内存空间,则会根据需要增加规模,如果不利用所有的内存空间,则会减少规模,因此投资回报率非常高(零资金浪费在云错误上)&想象一下,Python和Chapel代码从第一天起就可以在那里工作,计算速度非常快,没有任何障碍(尚未实现)分布式计算问题。我用
scipy.sparse
工具做了几次实验。布莱恩,你介意谈谈你体内设置的更多细节吗?你能用
repr(I)
repr(V)
以及
psutil.virtual_memory()的输出更新你的帖子吗
或来自任何更高级的(me)