对Ax = b并行化Solve()?

Rob*_*ert 9 parallel-processing r sparse-matrix

与STATS.se交叉,因为这个问题可以跨越两个STAT.se/SO https://stats.stackexchange.com/questions/17712/parallelize-solve-for-ax-b


我有一些非常大的稀疏矩阵,使用矩阵包中的spMatrix函数创建.

使用solve()函数适用于我的Ax = b问题,但需要很长时间.几天.

我注意到http://cran.r-project.org/web/packages/RScaLAPACK/RScaLAPACK.pdf 似乎有一个可以并行化解决方案功能的功能,但是,可能需要几周的时间来安装新的软件包特定服务器.

服务器已经安装了雪包.

所以

  1. 有没有办法使用雪来并行化此操作?
  2. 如果没有,还有其他方法可以加快这种类型的操作吗?
  3. 还有像RScaLAPACK这样的其他软件包吗?我对RScaLAPACK的搜索似乎表明人们对它有很多问题.

谢谢.

[编辑] - 其他细节

矩阵约为370,000 x 370,000.我用它来解决alpha中心问题,http://en.wikipedia.org/wiki/Alpha_centrality.我最初在igraph包中使用alpha中心函数,但它会崩溃R.

更多细节

  • 这是在一台机器上,有12个核心和96个内存(我相信)
  • 它是沿着引文关系线的有向图.
  • 计算条件数和密度需要一段时间.将发布,因为它可用.
  • 将对stat.SE进行crosspost并将链接添加回此处

Ite*_*tor 8

[更新1:对于刚刚调整的人:原始问题涉及并行计算以解决回归问题; 鉴于潜在问题与阿尔法中心性有关,一些问题,例如套袋和正则化回归可能不会立即适用,尽管这会导致进一步的统计讨论.

从基础设施到统计,这里有一系列问题需要解决.

基础设施 [已更新 - 另请参阅下面的更新#2.]

关于并行线性求解器,您可以将R的BLAS/LAPACK库替换为支持多线程计算的库,例如ATLAS,Goto BLAS,Intel的MKL或AMD的ACML.就个人而言,我使用AMD的版本.ATLAS很烦人,因为在编译时修复了内核的数量,而不是在运行时.MKL是商业广告.Goto不再受到很好的支持,但通常是最快的,但只是略有差距.它是在BSD许可下.您还可以查看Revolution Analytics的R,其中包括我认为的英特尔库.

因此,您可以立即开始使用所有核心,并进行简单的后端更改.这可以为您提供12倍的加速(核心数量的b/c)或可能更多(b/c更好的实现).如果将时间缩短到可接受的范围,那么你就完成了.:)但是,改变统计方法可能会更好.

您没有提到可用RAM的数量(或每个核心或机器的分布),但稀疏求解器应该非常聪明地管理RAM访问而不是试图同时咀嚼太多数据.尽管如此,如果它在一台机器上并且如果天真地完成,那么你可能会遇到很多交换.在这种情况下,看看喜欢的包biglm,bigmemory,ff,等.前者解决了在有限内存中求解线性方程(或GLM)的问题,后两者解决了共享内存(即内存映射和基于文件的存储),这对于非常大的对象非常方便.speedglm可以在CRC任务视图中找到更多软件包(例如和其他软件包).

半统计,半计算问题是解决矩阵的可视化问题.尝试按行和列的支持进行排序(如果图形是无向的,则相同,否则执行另一个,或尝试重新排序方法,如反向Cuthill-McKee),然后使用image()绘制矩阵.看看它是如何形成的,这将会很有趣,这会影响人们可以尝试的计算和统计方法.

另一个建议:您可以迁移到亚马逊的EC2吗?它价格低廉,您可以管理自己的安装.如果没有别的,你可以在测试加速后对原型进行原型设计并在内部进行迁移.JD Long有一个叫做的软件包segue,显然可以让生活更容易在亚马逊的Elastic MapReduce基础架构上分配作业. 如果你有96GB的RAM和12个核心,则无需迁移到EC2 - 分发它可以加快速度,但这不是问题.只需在这台机器上获得100%的利用率就是一个很好的改进.

统计

接下来是多个简单的统计问题:

  1. 包装您可以考虑对数据的子集进行采样,以适应模型,然后包装模型.这可以给你加速.这可以让您在尽可能多的机器和核心上分配计算.你可以使用SNOW foreach.

  2. 正则化glmnet支持稀疏矩阵,是非常快的.你应该明智地测试它.关注病态矩阵和非常小的lambda值.

  3. RANK你的矩阵很稀疏:他们是满级吗?如果不是,那可能是您面临的问题的一部分.当矩阵是单数或非常接近时(检查你的估计条件数,或者至少看看你的第一和第N个特征值如何比较 - 如果有一个急剧的下降,你就有麻烦 - 你可以检查eval1与ev2 ,. ..,EV10,......).同样,如果你有几乎奇异的矩阵,那么你需要回到类似glmnet缩小变量的行是共线或支持非常低.

  4. BOUNDING 可以减少矩阵的带宽吗?如果你可以阻止它的对角化,这很好,但你可能会有派系和多个派系的成员.如果你可以修剪最不连通的成员,那么你可以估计他们的α中心性是由同一集团中的最低值限制的上限.R中有一些包对这类东西很有用(请查看Reverse Cuthill-McKee;或者只是看看你如何将它转换成矩形,通常与派系或更小的群体相关).如果您有多个断开连接的组件,那么,无论如何,将数据分成单独的矩阵.

  5. 替代方案你是否坚持Alpha Centrality?可能存在具有相同值的单调相关(即具有高秩相关性)的其他度量,其可以更便宜地计算或者至少非常有效地实施.如果这些可行,那么您的分析可以用更少的努力进行.我有一些想法,但SO并不是真正讨论这个问题的地方.

要获得更多统计视角,应在stats.stackexchange.com上进行相应的问答,交叉验证.


更新2:我回答的速度有点太快,并没有从长远角度解决这个问题.如果您计划长期研究此类系统,您应该查看可能更适用于您的数据类型和计算基础架构的其他解算器.这是解算器和预处理器选项的一个非常好的目录.这似乎不包括IBM的"Watson"求解器套件.虽然安装软件可能需要数周时间,但如果您有一位优秀的HPC管理员,很可能已经安装了其中一个软件包.

另外,请记住R包可以安装到用户目录 - 您不需要在通用目录中安装包.如果您需要以非自己的用户身份执行某些操作,您还可以将软件包下载到临时或临时空间(如果您只在1 R实例中运行,但使用多个内核,请检查tempdir).