戏说R语言系列6

作者: eryesanye | 来源:发表于2018-05-25 01:40 被阅读135次

    讲一点R语言的高性能计算。

    R语言有自己的官网,https://cran.r-project.org/,页面很“简陋”,十几年如一日,这事儿谢益辉抱怨过。“简陋”有一点不好,就是没有吸引力,不过谢益辉也说,再漂亮的网页,看久了也会烦,关键是要有内容。这句话很中肯。

    在R语言官网里可以找到高性能计算部分,全称是“CRAN Task View: High-Performance and Parallel Computing with R”,所以严格说应该叫“高性能和并行计算”。这部分的主编或维护者是Dirk Eddelbuettel,这个人很厉害,用主编或维护者都不足以形容其在R语言的江湖地位,有人称他为Dirk Eddelbuettel大人,这个称谓比较贴切。

    “高性能和并行计算”页面中的内容比较多,也比较难,找到一个可以讲得清楚的入口,其实不太容易,直到翻到页面的最下面,才发现有两篇文章是可以讲的。如果再找不到,估计就没什么可讲了。

    一个是HPC computing notes by Luke Tierney for HPC class at University of Iowa,另一个是Schmidberger, Morgan, Eddelbuettel, Yu, Tierney and Mansmann (2009) paper on 'State of the Art in Parallel Computing with R'

    先讲“HPC computing notes by Luke Tierney for HPC class at University of Iowa”。这是一些关于高性能计算的课程笔记。我从其中的介绍摘录一些内容。

    关于32位和64位的讨论

    简单点说,32位机器只能支撑4G的内存,如果导入的数据超过4G,或者计算过程产生的数据超过4G的话,那么无论如何,这个计算任务都是执行不下去的,所以要想扩大计算的容量,只能在集群上做。而64位机器可以支撑10EB的内容,10EB以现在的条件看,可以看做是无限大,理论上,机器上能装多少内存条,就能用上多少内存。换句话说,64位机器扩大了单机计算的能力。

    虽然市面上大多数电脑是64位机器,但实际上很多人还在装32位的操作系统(使用Mac的同学可以不用考虑),所以,各位同学还是查一下自己装的是不是32位操作系统,不要把自己的电脑送回10年前。

    使用R语言的同学,检查起来比较容易。只要输入一条命令即可。

    我用的是64位的Linux系统

    统计之都对陈天奇的访谈里,讲到了一段用32位机器的事情:

    。。。比如我们实验室的 Hadoop 机器是 32 位的(笑),每台机器是 4 核 8G 的内存,我们如果想用机器去做分布式调参,那么每个模型只能用 2G 的内存。在这样的环境下,我们必须在 SVDFeature 中增加外存计算(编者:将数据储存在硬盘上,每次读入适量数据进入内存的方法)的功能,这也是我真正意义上的第一个外存计算的项目。

    这是八年前的事情,本是一件很困难的事情,结果让大神做成了另外一件很有意思的事情。

    摩尔定律、限制、GPU

    这页讲的是摩尔定律,摩尔定律讲的就是芯片更新速度很快,每隔18个月,性能提升一倍。但无限增长是不可能的,有两个因素会限制增长速度,一个是散热,另一个是能耗。各位同学如果有机会去一下阿里云的千岛湖基地,可以看到是直接抽水给机器水冷的。另一个是多核CPU,再就是GPU。

    如果放在现在,大家会不以为然,多核CPU、GPU计算很普遍啊,但这份PPT是10年前写的,这里面涉及了对nVIDIA的判断。如果有眼光10年前入手nVIDIA的股票,估计可以追上国内房价的增长速度。我看很多做量化交易的只看股价,其实科学也很重要,有些公司抓住的就是未来的趋势,那些鄙视价值判断的,太低估人类创造力了。

    最近陈天奇又发了一篇文章 AutoTVM:让AI来编译优化AI系统底层算子,里面提到了10年前他用GPU的事儿。

    Alexnet 横空出世的两年之前,我选择了深度学习作为本科毕设方向。当时的深度学习并没有现在那么火热,也没有现有的GPU卷积实现,我在实验室的 GTX 470上面第一次手写GPU卷积用以支持卷积RBM,当时针对CPU十多倍的加速比让我兴奋不已。虽然最终那段研究经历并没有结果,但是计算本身对于机器学习的推动作用却深深地印在了我的脑海里。

    这点大多数人(包括我)估计就汗颜了。很多时候群里经常有人PK各种GPU的性能,或者讨论买GTX 1060好还是买GTX 1080好,人家大神当年只用GTX 470就已经手写卷积实现了。

    再就是陈天奇在很多场合都提到他的很多研究经历并没有结果,或者是结果不是特别好。这得有一个比较开放宽松的环境才行。最近在看木心的《文学回忆录》,讲到国人太过现实,遂了愿,大家其乐融融,不遂愿,立刻翻脸。所以,创造力这东西,得看环境。

    MPI、OpenMP

    这页讲的是写并行计算程序其实挺难的,得用点工具。一些中等的工具是PVM、MPI、OpenMP,前两个是用在集群上的,其中MPI就是Dirk Eddelbuettel大人一直所坚守的对抗hadoop和spark的工具。OpenMP是用在单机上的,统计之都对陈天奇访谈中,他也提到过OpenMP:

    做 XGBoost 的原因是做实验的时候发现效率太低了,因为原来 SVDFeature 里面的模型是单线程的。我在快从交大毕业时做的一个项目里接触到了 OpenMP,发现非常好用。所以我发现目前为止最适合写多线程的语言不是 Python 不是 Java,反而是有了 OpenMP 的 C++。至少机器学习里的很多算法直接用它就可以解决了。

    可能很多同学都经历过用随机森林算法算了半天也算不出结果,然后把数据丢到XGBoost就焕然一新了,并惊诧于XGBoost的速度。要提升单机的计算性能,确实要做一些工作。R语言目前大量使用C++(通过Rcpp),计算性能提升了很多。

    陈天奇在访谈中提到另外一个单机性能做得比较好的项目,就是GraphLab:

    Graphlab 有很多很独到的东西,比如它的 data.frame 是目前为止唯一一个利用外存计算把单机性能推到极致的 dataframe 产品,还有他们的机器学习流水线和很不错。我们的重点应该是把我们擅长的工具做到极限,完成各个核心组件,然后让它们和已有的其他工具和平台更好地整合。

    在这个访谈的第二年,Graphlab 被苹果公司收购。 看来一个企业还是得打磨产品和技术,光靠忽悠人不行。

    另外一篇是是 'State of the Art in Parallel Computing with R',这篇和第一篇重合度比较大,只摘录其中一段。

    把底层线性代数计算包替换成掉也是个办法

    BLAS是一个比较底层的线性代数和矩阵操作的工具包。R语言作为一门计算语言,有大量的矩阵操作,所以文章建议使用性能更好的BLAS,例如ATLAS和Intel MKL。

    这篇文章写于2009年,目前,国内中科院也贡献了一个高性能BLAS,就是OpenBlas,这应该算是国内为数不多的、很厉害的一个开源项目。

    摘自http://arma.sourceforge.net/

    从这张图可以看到,ATLAS已经没有了,还剩下Intel MKL和OpenBlas,能和Intel在这个细分的底层领域放在一起,确实很厉害的!

    OpenBlas前年也成立公司了,澎峰科技 http://perfxlab.com/cn/#home,公司网站做得比较粗糙。看他们正在招聘金融高频交易系统者开发人员,可能是不差钱吧。

    关于OpenBlas在R语言里的安装和使用,可以参考张丹老师的http://blog.fens.me/r-martix-openblas/。Linux系统非常好安装,就一条命令。安装之后可以在R里看到效果(还是用sessionInfo()命令)。

    一定要装OpenBLAS啊

    相关文章

      网友评论

        本文标题:戏说R语言系列6

        本文链接:https://www.haomeiwen.com/subject/slpdjftx.html