CRAN 任务视图:R 的高性能和并行计算
本 CRAN 任务视图包含一个按主题分组的包列表,这些包对于使用 R 进行高性能计算 (HPC) 很有用。在此背景下,我们将“高性能计算”定义得比较宽泛,几乎涵盖了与推动 R 更进一步相关的任何内容:使用编译代码、并行计算(显式和隐式模式)、处理大型对象以及分析。
除非另有说明,否则所有带有超链接的包均可从 综合 R 档案网络 (CRAN) 获取。
本任务视图中讨论的几个领域正在快速发展。请通过电子邮件向维护者发送有关添加和扩展本任务视图的建议,或在上面链接的 GitHub 存储库中提交问题或拉取请求。有关详细信息,请参阅 贡献页面,该页面位于 CRAN 任务视图 存储库中。
感谢 Achim Zeileis、Markus Schmidberger、Martin Morgan、Max Kuhn、Tomas Radivoyevitch、Jochen Knaus、Tobias Verbeke、Hao Yu、David Rosenberg、Marco Enea、Ivo Welch、Jay Emerson、Wei-Chen Chen、Bill Cleveland、Ross Boylan、Ramon Diaz-Uriarte、Mark Zeligman、Kevin Ushey、Graham Jeffries、Will Landau、Tim Flutre、Reza Mohammadi、Ralf Stubner、Bob Jansen、Matt Fidler、Brent Brewington 和 Ben Bolder(以及其他我可能忘记添加的人)的建议和更正。
ctv
包支持这些任务视图。它的函数 install.views
和 update.views
分别允许安装或更新来自给定任务视图的包;选项 coreOnly
可以将操作限制在下面标记为核心的包。
R 中的直接支持始于 2.14.0 版本,该版本包含一个新的包 parallel,该包包含(略微修改后的)multicore 和 snow 包的副本。某些类型的集群不受基本包“parallel”的直接处理。但是,正如包说明文档中所解释的那样,parallel 中提供 snow 类函数的部分将接受 snow 集群,包括 MPI 集群。使用 vignette("parallel")
查看包说明文档。parallel 包还包含对 L’Ecuyer 等人 (2002) 提出的多个 RNG 流的支持,支持 mclapply 和 snow 集群。为 R 2.14.0 发布的版本包含基本功能:更高层的便利函数计划在以后的 R 版本中发布。
并行计算:显式并行
- 几个包提供了并行计算所需的通信层。该领域中的第一个包是 Li 和 Rossini 的 rpvm,它使用 PVM(并行虚拟机)标准和库。rpvm 现在不再积极维护,但可从其 CRAN 存档目录获取。
- 近年来,替代 MPI(消息传递接口)标准已成为并行计算的实际标准。它在 R 中通过 Yu 的 Rmpi 获得支持。 Rmpi 包已经成熟,但仍在积极维护,并提供对 MPI API 中众多函数的访问,以及一些 R 特定的扩展。 Rmpi 可与 LAM/MPI、MPICH/MPICH2、Open MPI 和 Deino MPI 实现一起使用。需要注意的是,LAM/MPI 现在处于维护模式,新的开发重点是 Open MPI。
- pbdMPI 包提供 S4 类以直接与 MPI 接口,以支持单程序/多数据 (SPMD) 并行编程风格,这对于批处理并行执行特别有用。
- Tierney 等人开发的 snow(简单工作站网络)包可以使用 PVM、MPI、NWS 以及直接网络套接字。它通过隐藏通信细节提供了一个抽象层。 snowFT 包为 snow 提供容错扩展。
- Knaus 开发的 snowfall 包是 snow 的更新替代方案。函数可以在顺序或并行模式下使用。
- parallelly 包通过提供对并行工作程序启动和设置的额外控制来增强并行包。
- foreach 包允许对集合中的元素进行一般迭代,而无需使用显式循环计数器。使用没有副作用的 foreach 还可以促进并行执行循环,这可以通过 doMC(使用单个工作站上的并行/多核)、 doSNOW(使用 snow,见上文)、 doMPI(使用 Rmpi)包和 doFuture(使用 future)包来实现。
- The future 包允许通过对期货的抽象来进行同步(顺序)和异步(并行)评估,无论是通过函数调用还是通过承诺隐式进行。全局变量会自动识别。支持对集合中元素的迭代。通过未来框架进行的并行映射-归约调用由 future.apply 包(用于基本 R 应用函数的并行版本)和 furrr 包(用于 purrr 函数的并行版本)提供。并行化可通过 parallel 包、future.callr(通过 callr 包)和 future.batchtools(通过 batchtools 包)实现。
- The Rborist 包使用 OpenMP 指令在随机森林算法中利用预测器级别的并行性,这促进了在重新排列数据和确定分割标准时对多核硬件的有效使用,这两者都是该算法中的性能瓶颈。
- The h2o 包连接到 h2o 开源机器学习环境,该环境具有随机森林、GBM、GLM(具有弹性网络正则化)和深度学习的可扩展实现。
- The randomForestSRC 包可以使用 OpenMP 和 MPI 来进行随机森林扩展,适用于生存分析、竞争风险分析、分类以及回归。
- The parSim 包可以使用一个或多个核心在本地和 HPC 集群上执行模拟研究。
- The qsub 包可以提交命令以在 gridengine 集群上运行。
- The mirai 包是一个用于本地或分布式异步代码评估的极简框架,它实现了期货,这些期货在完成时会自动解析,构建在高性能的 nanonext NNG C 消息库绑定之上。The crew 包扩展了 mirai,具有自动缩放、中央管理器和插件系统,适用于各种平台和服务。
- The condor 包可以通过
ssh
与 Condor HPC 安装交互,以传输文件并访问远程计算作业。
并行计算:隐式并行
- Tierney 开发的 pnmath 包(链接)利用了最新编译器(例如 gcc 4.2 或更高版本)的 OpenMP 并行处理指令,通过用可以利用多个内核的替代函数替换一些内部 R 函数来实现隐式并行,而无需用户明确请求。备选的 pnmath0 包提供了相同的功能,使用 Pthreads 用于无法使用较新编译器的环境。类似的功能预计“最终”将集成到 R 中。
- Jamitzky 开发的 romp 包在 useR! 2008 上进行了展示(幻灯片),并提供了另一个使用 Fortran 的 OpenMP 接口。代码仍处于预 alpha 阶段,可从 Google Code 项目 romp 获取。一个 R-Forge 项目 romp 已启动,但尚未发布包。
- RhpcBLASctl 包检测可用 BLAS 内核的数量,并允许显式选择内核数量。
- targets 包及其前身 drake 是类似于 Make 的以 R 为中心的管道工具包。每个工具包都构建了工作流的有向无环图表示,并协调跨
future
工作器的分布式计算。 - flexiblas 包通过加载 BLAS/LAPACK 库并可能在使用 FlexiBLAS(链接)时切换它们来管理这些库。
并行计算:网格计算
- Grose 开发的 multiR 包在 useR! 2008 上进行了展示,但尚未发布。它可能提供了一个在网格计算平台上运行的 snow 风格框架。
- Chine 开发的 biocep-distrib 项目提供了一个基于 Java 的框架,用于本地、网格或云计算。该项目正在积极开发中。
并行计算:Hadoop
- Saptarshi Guha 启动的 RHIPE 包提供了 R 和 Hadoop 之间的接口,用于使用“分而治之”方法对大型复杂数据进行分析,完全在 R 中进行。
- Revolution Analytics 开发的 rmr 包也提供了 R 和 Hadoop 之间的接口,用于 Map/Reduce 编程框架。(链接)
- 一个相关的包,由 Long 开发的 segue 包,允许在亚马逊的 Elastic Map Reduce (EMR) 上轻松执行简单的并行任务。(链接)
- RProtoBuf 包提供了一个接口,用于访问 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制。此包可在 R 代码中用于读取来自其他系统的數據流,在分布式 MapReduce 设置中,数据被序列化并在任务之间来回传递。
- HistogramTools 包提供了一些例程,这些例程对于构建、聚合、操作和绘制大量直方图很有用,例如由 MapReduce 应用程序中的映射器创建的直方图。
并行计算:随机数
并行计算:资源管理器和批处理调度程序
- 作业调度工具包允许管理并行计算资源和任务。slurm(Simple Linux Utility for Resource Management)程序集与 MPI 协同工作良好,slurm 作业可以使用 rslurm 包从 R 提交。(链接)
- 来自威斯康星大学麦迪逊分校的 Condor 工具包(链接)已与 R 一起使用,如这篇文章所述 R 新闻文章。
- Knaus 开发的 sfCluster 包可与 snowfall 一起使用。(链接)但目前仅限于 LAM/MPI。
- Hoffmann 开发的 batch 包可以将并行计算请求启动到集群并收集结果。
- BatchJobs 包提供了 Map、Reduce 和 Filter 变体,用于管理 R 作业及其在 PBS/Torque、LSF 和 Sun Grid Engine 等批处理计算系统上的结果。还支持多核和 SSH 系统。 BatchExperiments 包通过一个抽象层扩展了它,用于运行统计实验。包 batchtools 是这两个包的继任者/扩展。
- The flowr 包提供了一种分散-收集方法,通过简单的 data.frames 作为输入,将作业列表(包括依赖项)提交到计算集群。它支持 LSF、SGE、Torque 和 SLURM。
- The clustermq 包通过一行代码将函数调用作为作业发送到 LSF、SGE 和 SLURM,无需使用网络挂载存储。它还支持通过 SSH 使用远程集群。
并行计算:应用
- The caret 包由 Kuhn 开发,可以使用各种框架(MPI、NWS 等)来并行化预测模型的交叉验证和引导特征化。
- The maanova 包由 Wu 在 Bioconductor 上开发,可以使用 snow 和 Rmpi 来分析微阵列实验。
- The pvclust 包由 Suzuki 和 Shimodaira 开发,可以使用 snow 和 Rmpi 来进行基于多尺度引导的层次聚类。
- The tm 包由 Feinerer 开发,可以使用 snow 和 Rmpi 来进行并行文本挖掘。
- The varSelRF 包由 Diaz-Uriarte 开发,可以使用 snow 和 Rmpi 来进行基于随机森林的变量选择并行化。
- The multtest 包由 Pollard 等人在 Bioconductor 上开发,可以使用 snow、Rmpi 或 rpvm 来进行基于重采样的多重假设检验。
- Sekhon 开发的 Matching 包用于多元和倾向得分匹配,Scutari 开发的 bnlearn 包用于贝叶斯网络结构学习,Krivitsky 和 Handcock 开发的 latentnet 包用于潜在位置和聚类模型,Porzelius 和 Binder 开发的 peperr 包用于并行估计预测误差,Fernandez-Palacin 和 Munoz-Marquez 开发的 orloca 包用于运筹学选址分析,Mebane 和 Sekhon 开发的 rgenoud 包用于使用导数的遗传优化,Schmidberger、Vicedo 和 Mansmann 开发的 affyPara 包用于并行归一化 Affymetrix 微阵列,以及 Pearson 等人开发的 puma 包,它将不确定性传播到标准微阵列分析中,例如差异表达,所有这些都可以使用 snow 进行并行操作,使用 snow 支持的 MPI、PVM、NWS 或套接字协议之一。
- bugsparallel 包使用 Rmpi 进行使用 WinBUGS 的多个 MCMC 链的分布式计算。
- Chen 等人开发的 xgboost 包是一个经过优化的分布式梯度提升库,旨在高效、灵活和可移植。相同的代码可以在主要的分布式环境中运行,例如 Hadoop、SGE 和 MPI。
- dclone 包提供了一种全局优化方法和模拟退火的变体,它利用贝叶斯 MCMC 工具来获得 MLE 点估计和标准误差,使用低级函数来实现使用数据克隆和贝叶斯马尔可夫链蒙特卡罗方法的复杂模型的最大似然估计过程,并支持 JAGS、WinBUGS 和 OpenBUGS;并行计算通过 snow 包支持。
- 如今,许多包可以使用 **parallel** 包提供的功能。一个例子是 pls。
- The pbapply package 提供了用于
\*apply
系列中向量化 R 函数的进度条,并支持多个后端。 - The Sim.DiffProc package 模拟并估计多维 Itô 和 Stratonovich 随机微分方程,并行执行。
- The keras package 由 Allaire 等人开发,提供了一个高级神经网络 API。它专注于为卷积网络、循环网络、两者任意组合以及自定义神经网络架构提供快速实验功能。
- The mvnfast 使用 sumo 随机数生成器并行生成多元正态分布。
- The rxode2random 使用 sitmo package 并行生成截断或非截断多元正态分布。该包还并行生成许多其他常见分布(如二项式分布、t 分布等)。
- The rxode2 使用并行处理(通过
OpenMP
)来更快地解决多个单元(按 ID
分组)上的常微分方程 (ODE),并可以为每个 ODE 模拟问题生成随机数(通过支持包 rxode2random 自动完成)。 - The nlmixr2 使用
rxode2
中的并行 ODE 求解来并行求解非线性混合效应模型(对于算法 "saem"
)。
并行计算:GPU
- rgpu 包(见下文链接)旨在通过使用 GPU 加速生物信息学分析。
- The gcbd package 实现了一个用于 BLAS 和 GPU 的基准测试框架。
- The OpenCL package 提供了从 R 到 OpenCL 的接口,允许对 GPU 编程进行硬件和供应商无关的接口。
- The tensorflow package 由 Allaire 等人开发,提供了从 R 内部访问完整的 TensorFlow API 的功能,使您可以使用数据流图进行数值计算。灵活的架构允许用户使用单个 API 将计算部署到台式机、服务器或移动设备中的一个或多个 CPU 或 GPU。
- The tfestimators package 由 Tang 等人开发,提供了一个高级 API,该 API 提供了许多不同模型类型的实现,包括线性模型和深度神经网络。它还提供了一个灵活的框架,用于定义任意新的模型类型作为自定义估计器,并免费使用 TensorFlow 的分布式功能。
- 该 BDgraph 包提供了用于多元连续、离散和混合数据的无向图模型中贝叶斯结构学习的统计工具,使用 OpenMP 和 C++ 实现的并行采样算法。
- 该 ssgraph 包使用尖峰和板式先验对多元连续、离散和混合数据进行无向图模型的贝叶斯推断。该包的计算密集型任务通过 C++ 使用 OpenMP。
- 该 GPUmatrix 包可以在提供
Matrix
包的 API 的同时将计算卸载到 GPU。
大内存和内存外数据
- 该 biglm 包由 Lumley 使用增量计算为存储在 R 主内存之外的数据集提供
lm()
和 glm()
功能。 - 该 ff 包由 Adler 等人提供,提供对太大而无法加载到内存中的数据集的文件访问权限,以及许多更高级别的函数。
- 该 bigmemory 包由 Kane 和 Emerson 提供,允许将大型对象(如矩阵)存储在内存中(以及通过文件),并使用外部指针对象来引用它们。这允许从 R 透明访问,而不会遇到 R 的内部内存限制。同一台计算机上的多个 R 进程也可以共享大内存对象。
- 许多数据库包和类似数据库的包(例如 sqldf 由 Grothendieck 和 data.table 由 Dowle 提供)也具有潜在的兴趣,但此处未进行审查。
- 该 MonetDB.R 包允许 R 将 MonetDB 列式开源数据库系统作为后端访问。
- 该 LaF 包提供了用于快速访问 csv 或固定宽度格式的大型 ASCII 文件的方法。
- 该 bigstatsr 包也通过内存映射访问对文件支持的大型矩阵进行操作,并提供多个矩阵操作、PCA、稀疏方法等。
- The disk.frame package leverages several other packages to provide efficient access and manipulation operations for data sets that are larger than RAM.
- The arrow package offers the portable Apache Arrow in-memory format as well as readers for different file formats which can include support for out-of-memory processing and streaming.
Easier interfaces for Compiled code
- The inline package by Sklyar et al eases adding code in C, C++ or Fortran to R. It takes care of the compilation, linking and loading of embedded code segments that are stored as R strings.
- The Rcpp package by Eddelbuettel and Francois offers a number of C++ classes that makes transferring R objects to C++ functions (and back) easier, and the RInside package by the same authors allows easy embedding of R itself into C++ applications for faster and more direct data transfer.
- The RcppParallel package by Allaire et al. bundles the Intel Threading Building Blocks and TinyThread libraries. Together with Rcpp, RcppParallel makes it easy to write safe, performant, concurrently-executing C++ code, and use that code within R and R packages.
- The rJava package by Urbanek provides a low-level interface to Java similar to the
.Call()
interface for C and C++. - The reticulate package by Allaire provides interface to Python modules, classes, and functions. It allows R users to access many high-performance Python packages such as tensorflow and tfestimators within R.
Packages profvis, proffer, profmem, GUIProfiler, proftools, and aprof summarize and visualize output from the Rprof
interface for profiling. The profile package reads and writes profiling data and converts among file formats such as pprof
by Google and Rprof
. The xrprof
command-line tool implements profile sampling for a given R process on Linux or Windows, and it can profile R code alongside compiled code.
CRAN packages
核心 | Rmpi,snow. |
常规 | aprof, arrow, batch, BatchExperiments, BatchJobs, batchtools, BDgraph, biglm, bigmemory, bigstatsr, bnlearn, caret, clustermq, condor, crew, data.table, dclone, disk.frame, doFuture, doMC, doMPI, doRNG, doSNOW, dqrng, drake, ff, flexiblas, flowr, foreach, furrr, future, future.apply, future.batchtools, future.callr, gcbd, GPUmatrix, GUIProfiler, h2o, HistogramTools, inline, keras, LaF, latentnet, Matching, mirai, MonetDB.R, mvnfast, nanonext, nlmixr2, OpenCL, orloca, parallelly, parSim, pbapply, pbdMPI, peperr, pls, proffer, profile, profmem, proftools, profvis, pvclust, qsub, randomForestSRC, Rborist, Rcpp, RcppParallel, reticulate, rgenoud, RhpcBLASctl, RInside, rJava, rlecuyer, RProtoBuf, rslurm, rstream, rxode2, rxode2random, Sim.DiffProc, sitmo, snowfall, snowFT, sqldf, ssgraph, targets, tensorflow, tfestimators, tm, varSelRF, xgboost. |
相关链接
其他资源