banner

R与并行计算

作者: afenxi来源: afenxi时间:2017-04-07 14:12:34

摘要:本文首先介绍了并行计算的基本概念,然后简要阐述了R和并行计算的关系。

本文首先介绍了并行计算的基本概念,然后简要阐述了R和并行计算的关系。之后作者从R用户的使用角度讨论了隐式和显示两种并行计算模式,并给出了相应的案例。隐式并行计算模式不仅提供了简单清晰的使用方法,而且很好的隐藏了并行计算的实现细节。因此用户可以专注于问题本身。显示并行计算模式则更加灵活多样,用户可以按照自己的实际问题来选择数据分解,内存管理和计算任务分配的方式。最后,作者探讨了现阶段R并行化的挑战以及未来的发展。 R与并行计算 统计之都的小伙伴们对R,SAS,SPSS, MATLAB之类的统计软件的使用定是轻车熟路了,但是对并行计算(又名高性能计算,分布式计算)等概念可能多少会感到有点陌生。应太云兄之邀,在此给大家介绍一些关于并行计算的基本概念以及在R中的使用。 什么是并行计算? 并行计算,准确地说应该包括高性能计算机和并行软件两个方面。在很长一段时间里,中国的高性能计算机处于世界领先水平。在最近一期的世界TOP500超级计算机排名中,中国的神威太湖之光列居榜首。 但是高性能计算机的应用领域却比较有限,主要集中在军事,航天航空等国防军工以及科研领域。对于多数个人,中小型企业来说高性能计算机还是阳春白雪。 C" />C" /> R与并行计算-数据分析网 不过,近年来随着个人PC机,廉价机群,以及各种加速卡(NVIDIA GPU, Intel Xeon Phi, FPGA)的快速发展,现在个人电脑已经完全可以和过去的高性能计算机相媲美了。 相比于计算机硬件的迅速发展,并行软件的发展多少有些滞后,试想你现在使用的哪些软件是支持并行化运算的呢?  R与并行计算-数据分析网 C" /> 软件的并行化需要更多的研发支持,以及对大量串行算法和现有软件的并行化,这部分工作被称之为代码现代化(code modernization)。听起来相当高大上的工作,然而在实际中大量的错误修正(BUGFIX),底层数据结构重写,软件框架的更改,以及代码并行化之后带来的运行不确定性和跨平台等问题极大地增加了软件的开发维护成本和运行风险,这也使得这项工作在实际中并没有想象中的那么吸引人。 R为什么需要并行计算? 那么言归正传,让我们回到R本身。R作为当前最流行的统计软件之一,具有非常多的优点,比如丰富的统计模型与数据处理工具,以及强大的可视化能力。但随着数据量的日渐增大,R的内存使用方式和计算模式限制了R处理大规模数据的能力。从内存角度来看,R采用的是内存计算模式(In-Memory),被处理的数据需要预取到主存(RAM)中。其优点是计算效率高、速度快,但缺点是这样一来能处理的问题规模就非常有限(小于RAM的大小)。另一方面,R的核心(R core)是一个单线程的程序。因此,在现代的多核处理器上,R无法有效地利用所有的计算内核。脑补一下,如果把R跑到具有260个计算核心的太湖之光CPU上,单线程的R程序最多只能利用到1/260的计算能力,而浪费了其他259/260的计算核心。 怎么破?并行计算! 并行计算技术正是为了在实际应用中解决单机内存容量和单核计算能力无法满足计算需求的问题而提出的。因此,并行计算技术将非常有力地扩充R的使用范围和场景。最新版本的R已经将parallel包设为了默认安装包。可见R核心开发组也对并行计算非常重视了。 R与并行计算-数据分析网 C" /> R用户:如何使用并行计算? 从用户的使用方式来划分,R中的并行计算模式大致可以分为隐式和显示两种。下面我将用具体实例给大家做一个简单介绍。 隐式并行计算 隐式计算对用户隐藏了大部分细节,用户不需要知道具体数据分配方式 ,算法的实现或者底层的硬件资源分配。系统会根据当前的硬件资源来自动启动计算核心。显然,这种模式对于大多数用户来说是最喜闻乐见的。我们可以在完全不改变原有计算模式以及代码的情况下获得更高的性能。常见的隐式并行方式包括: 1、 使用并行计算库,如OpenBLAS,Intel MKL,NVIDIA cuBLAS 这类并行库通常是由硬件制造商提供并基于对应的硬件进行了深度优化,其性能远超R自带的BLAS库,所以建议在编译R的时候选择一个高性能库或者在运行时通过LD_PRELOAD来指定加载库。具体的编译和加载方法可以参见这篇博客的附录部分【1】。在下面左图中的矩阵计算比较实验中,并行库在16核的CPU上轻松超过R原有库百倍之多。在右图中,我们可以看到GPU的数学库对常见的一些分析算法也有相当显著的提速。 C" /> R与并行计算-数据分析网 2、使用R中的多线程函数 OpenMP是一种基于共享内存的多线程库,主要用于单节点上应用程序加速。最新的R在编译时就已经打开了OpenMP选项,这意味着一些计算可以在多线程的模式下运行。比如R中的dist函数就 是一个多线程实现的函数,通过设置线程数目来使用当前机器上的多个计算核心,下面我们用一个简单的例子来感受下并行计算的效率, GitHub上有完整代码【2】, 此代码需在Linux系统下运行。

#comparison of single thread and multiple threads run for(i in 6:11) ) stopImplicitCluster() stopCluster(cl) 最后,我们在Linux平台下使用4个线程进行测试,以上几个版本的并行实现均可达到3倍以上的加速比。 R与并行计算-数据分析网 C" /> R并行化的挑战与展望 挑战: 在实际中,并行计算的问题并没有这么简单。要并行化R以及整个生态环境的挑战仍然巨大。  1、R是一个分散的,非商业化的软件 R并不是由一个紧凑的组织或者公司开发的,其大部分包是由用户自己开发的。这就意味着很难在软件架构和设计上来统一调整和部署。一些商业软件,比如Matlab,它的管理维护开发就很统一,架构的调整和局部重构相对要容易一些。通过几个版本的迭代,软件整体并行化的程度就要高很多。 2、R的底层设计仍是单线程,上层应用包依赖性很强 R最初是以单线程模式来设计的,意味着许多基础数据结构并不是线程安全的。所以,在上层并行算法实现时,很多数据结构需要重写或者调整,这也将破坏R本来的一些设计模式。另一方面,在R中,包的依赖性很强,我们假设使用B包,B包调用了A包。如果B包首先实现了多线程,但是在一段时间之后A包也做了并行化。那么这时候就很有可能出现混合并行的情况,程序就非常有可能出现各种奇怪的错误(BUG),性能也会大幅度降低。 展望: 未来 R并行化的主要模式是什么样的?以下纯属虚构,如果有雷同完全是巧合。 1、R将会更多的依赖于商业化以及研究机构提供的高性能组件 比如H2O,MXNet,Intel DAAL,这些包都很大程度的利用了并行性带来的效率提升,而且有相关人员长期更新和调优。从本质上来说,软件的发展是离不开人力和资金的投入的。 2、云计算平台 随着云计算的兴起,数据分析即服务(DAAS:Data Analyst as a Services)以及机器学习即服务(MLAS: machine learning as a services)的浪潮将会到来。 各大服务商从底层的硬件部署,数据库优化到上次的算法优化都提供了相应的并行化措施,比如微软近期推出了一系列R在云上的产品,更多信息请参见这篇文章。因此,未来更多的并行化工作将会对用户透明,R用户看到的还是原来的R,然而真正的计算已经分布到云端了。 本文转自 统计之都,原文链接:http://cos.name/2016/09/r-and-parallel-computing/ 作者简介 赵鹏,世界知名IT企业性能分析师。在包括多核、分布式以及GPU通用计算方面具有丰富的研究和实践经验,善于帮助客户解决性能问题以及提供并行化方案。 R语言爱好者,业余时间创建了ParallelR网站,www.parallelr.com,以此来分享R和并行计算相关内容。 参考资料 【1】http://www.parallelr.com/r-hpac-benchmark-analysis/ 【2】https://github.com/PatricZhao/ParallelR/blob/master/PP_for_COS/ImplicitParallel_MT.R 【3】https://cran.r-project.org/web/views/HighPerformanceComputing.html 【4】http://www.h2o.ai/ 【5】http://docs.h2o.ai/h2o/latest-stable/h2o-docs/booklets/RBooklet.pdf 【6】https://github.com/PatricZhao/ParallelR/blob/master/PP_for_COS/ExplicitParallel.R

banner
看过还想看
可能还想看
最新文章
Yonghong Z-Suite一站式大数据分析平台 —— 以卓越的数据技术为客户创造价值,实现客户成功。