本書(shū)是一本構(gòu)建大規(guī)模高效算法的綜合性實(shí)用書(shū)籍,介紹各種并行技術(shù),從R語(yǔ)言的并行版本lapply()的簡(jiǎn)單應(yīng)用到基于Hadoop和ApacheSpark框架的高級(jí)AWS云。在本書(shū)的后,你將了解到影響并行效率的因素,包括:評(píng)估代碼性能和實(shí)現(xiàn)負(fù)載平衡;要避免的陷阱,包括死鎖和數(shù)值不穩(wěn)定問(wèn)題;對(duì)于你的項(xiàng)目,如何為適合的并行類型構(gòu)建代碼和數(shù)據(jù);如何在各種計(jì)算機(jī)系統(tǒng)中運(yùn)行R代碼獲取佳性能。本書(shū)針對(duì)那些想要超越單線程和內(nèi)存限制的R程序員,使其從中學(xué)習(xí)如何實(shí)現(xiàn)高效大規(guī)模算法,這是對(duì)大數(shù)據(jù)高性能處理的必要條件。
并行計(jì)算是一種通過(guò)執(zhí)行多條指令來(lái)解決大型復(fù)雜計(jì)算問(wèn)題的有效算法,可以顯著提高計(jì)算機(jī)系統(tǒng)的計(jì)算速度和處理能力。R語(yǔ)言是目前非常流行的一種開(kāi)源程序語(yǔ)言,在統(tǒng)計(jì)學(xué)和生物學(xué)等學(xué)科中得到了廣泛應(yīng)用。本書(shū)成功地借助于R語(yǔ)言實(shí)現(xiàn)了并行計(jì)算的多種有效算法,并且通過(guò)案例分析了如何運(yùn)用R語(yǔ)言執(zhí)行并行計(jì)算。同時(shí)詳細(xì)介紹了并行計(jì)算中的R程序包的使用,如SPRINT包提供了一套從R中調(diào)用并行計(jì)算的MPI函數(shù)。全書(shū)案例簡(jiǎn)單易懂,程序翔實(shí),敘述清晰。本書(shū)4位作者都是計(jì)算機(jī)專業(yè)的資深專家和學(xué)者,從事并行計(jì)算多年,發(fā)表了眾多成果。本書(shū)的引進(jìn)有益于讀者運(yùn)用R語(yǔ)言進(jìn)行并行計(jì)算的研究,讀者可以結(jié)合實(shí)際應(yīng)用來(lái)學(xué)習(xí)本書(shū)中討論的算法和模型。
本書(shū)的翻譯得到了國(guó)家自然科學(xué)基金(項(xiàng)目編號(hào)71461005)和廣西高校數(shù)據(jù)分析與計(jì)算重點(diǎn)實(shí)驗(yàn)室的資助。特別感謝桂林電子科技大學(xué)研究生姚家進(jìn)、郭夢(mèng)菲、秦文哲在翻譯本書(shū)中所做的出色工作。
由于時(shí)間和水平所限,難免會(huì)有不當(dāng)之處,希望同行和讀者多加指正和批評(píng)。
前言
我們正處于信息爆炸時(shí)代。從個(gè)人到全世界,生活中的一切都變得越來(lái)越與物聯(lián)網(wǎng)實(shí)時(shí)關(guān)聯(lián)。據(jù)預(yù)測(cè),到2020年,世界上的數(shù)據(jù)將超過(guò)現(xiàn)在的10倍,達(dá)到驚人的44澤字節(jié)(1澤字節(jié)相當(dāng)于2500億張DVD)。為了解決大數(shù)據(jù)的規(guī)模和速度問(wèn)題,我們需要巨大的計(jì)算、內(nèi)存和磁盤(pán)資源,而為此就需要并行計(jì)算。
盡管使用的時(shí)間不長(zhǎng),但R作為一種開(kāi)源統(tǒng)計(jì)編程語(yǔ)言,逐漸成為人們分析數(shù)據(jù)的關(guān)鍵基礎(chǔ)技術(shù)之一。我敢說(shuō)R現(xiàn)在是“數(shù)據(jù)科學(xué)家”的主流編程語(yǔ)言之一。
當(dāng)然,數(shù)據(jù)科學(xué)家可能會(huì)部署許多其他工具來(lái)處理大數(shù)據(jù)的一些困難問(wèn)題,如Python、SAS、SPSS或MATLAB。然而,自從1997年以來(lái),隨著開(kāi)源語(yǔ)言的深入發(fā)展,R語(yǔ)言非常流行,在20年中開(kāi)發(fā)了許多存放于CRAN鏡像站點(diǎn)的R添加包,這些添加包適用于幾乎所有形式的數(shù)據(jù)分析,從小型數(shù)值矩陣到龐大的符號(hào)數(shù)據(jù)集,如生物分子DNA。事實(shí)上,我認(rèn)為R語(yǔ)言正成為“事實(shí)上”的數(shù)據(jù)科學(xué)腳本語(yǔ)言,它可以融合許多不同類型的高度復(fù)雜數(shù)據(jù)的分析方法。
R語(yǔ)言自身總是按照單線程來(lái)實(shí)現(xiàn)的,而且其原有的程序設(shè)計(jì)并沒(méi)有應(yīng)用并行機(jī)制。然而,為了達(dá)到某些功能的并行目的以及使用并行處理框架,R語(yǔ)言需要借助于某些特別開(kāi)發(fā)的外部添加包。我們將重點(diǎn)關(guān)注一些目前技術(shù)范圍內(nèi)可用的好的并行算法。
在本書(shū)中,我們將介紹并行計(jì)算的各個(gè)方面,從單程序多數(shù)據(jù)(SPMD)到單指令多數(shù)據(jù)(SIMD)向量處理,包括用R添加包parallel來(lái)利用R內(nèi)置的多核功能、用消息傳遞接口(MPI)進(jìn)行消息傳遞、用OpenCL處理通用GPU(GPGPU)的并行性。我們還將探討并行性的不同框架方法,從利用任務(wù)分配的負(fù)載均衡到網(wǎng)格空間處理。我們將通過(guò)Hadoop了解云計(jì)算中更通用的批量數(shù)據(jù)處理,以及集群計(jì)算中的熱門新技術(shù)Apache Spark,它更適合大規(guī)模的實(shí)時(shí)數(shù)據(jù)處理。
我們甚至?xí)剿魅绾问褂谜嬲臄?shù)百萬(wàn)英鎊的超級(jí)計(jì)算機(jī)。是的,我知道你可能沒(méi)有這樣的計(jì)算機(jī),但是在本書(shū)中,我們會(huì)告訴你如何使用它,以及并行計(jì)算的效果。說(shuō)不定,隨著知識(shí)的更新,你可以來(lái)到當(dāng)?shù)氐某?jí)計(jì)算機(jī)中心,并說(shuō)服他們讓你進(jìn)行一些大規(guī)模的并行計(jì)算!
本書(shū)中展示的所有編碼示例都具有原創(chuàng)性,選擇這些示例的原因是為了不復(fù)制其他書(shū)中可能遇到的例子。親愛(ài)的讀者,選擇這些代碼的原因是希望能讓你與普通讀者有一點(diǎn)不同。作為作者,我們非常希望你享受這個(gè)過(guò)程。
西蒙R. 查普爾(Simon R. Chapple)是一位經(jīng)驗(yàn)豐富的解決方案架構(gòu)師和**軟件工程師,從事數(shù)據(jù)分析和醫(yī)療信息系統(tǒng)解決方案和應(yīng)用的開(kāi)發(fā)超過(guò)25年。他也是超級(jí)計(jì)算機(jī)HPC和大數(shù)據(jù)處理方面的專家。
Simon是Datalytics科技有限公司的**技術(shù)官和管理合伙人,帶領(lǐng)一個(gè)團(tuán)隊(duì)建設(shè)下一代大規(guī)模數(shù)據(jù)分析平臺(tái),該平臺(tái)建立在一組由高性能工具、框架和系統(tǒng)所構(gòu)成的可定制的工具集合基礎(chǔ)上,可以使從數(shù)據(jù)采集、分析到呈現(xiàn)的整個(gè)實(shí)時(shí)處理周期,輕松地部署到任何已有的IT操作環(huán)境中。
此前,他在Aridhia信息公司擔(dān)任產(chǎn)品創(chuàng)新總監(jiān),為蘇格蘭的醫(yī)療服務(wù)供應(yīng)商建立了多個(gè)新系統(tǒng),包括為蘇格蘭18周轉(zhuǎn)診治療和癌癥患者的管理而提供的一體化病人路徑跟蹤系統(tǒng),該系統(tǒng)應(yīng)用了10個(gè)單獨(dú)數(shù)據(jù)系統(tǒng)的集成(減少病人等待時(shí)間,從而提供**的服務(wù))。他還利用公共云托管監(jiān)測(cè)系統(tǒng),為實(shí)時(shí)化療患者建立了專門的移動(dòng)系統(tǒng),該系統(tǒng)在澳大利亞進(jìn)行了臨床試驗(yàn),受到護(hù)士和病人的高度贊揚(yáng),“**像在你的起居室里有一位護(hù)士……希望所有的化療病人每天都有天使般的安全舒適的護(hù)理環(huán)境。”
Simon也是ROpenCL開(kāi)源軟件包的作者之一,該添加包使得用R編寫(xiě)的統(tǒng)計(jì)程序可以應(yīng)用圖形加速器芯片中的并行計(jì)算能力。
對(duì)于SPRINT這一章,我特別要感謝愛(ài)丁堡并行計(jì)算中心的同事以及本書(shū)審閱者Willem Ligtenberg、Joe McKavanagh和Steven Sanderson,謝謝他們的積極反饋。我還要感謝Packt出版社的編輯團(tuán)隊(duì)為本書(shū)的**終出版付出的辛勤勞動(dòng)。感謝我的妻子和兒子的理解,他們給我珍貴的時(shí)間使我成為一名作者,謹(jǐn)以此書(shū)獻(xiàn)給我愛(ài)的Heather和Adam。
伊麗·特魯普(Eilidh Troup)是愛(ài)丁堡大學(xué)EPCC的應(yīng)用顧問(wèn)。她擁有Glasgow大學(xué)的遺傳學(xué)學(xué)位,現(xiàn)在專注于為廣大用戶尤其是生物學(xué)家提供高性能計(jì)算。Eilidh致力于各種軟件項(xiàng)目,包括為基于網(wǎng)絡(luò)的科學(xué)數(shù)據(jù)存儲(chǔ)庫(kù)提供簡(jiǎn)單的并行R接口(SPRINT)和SEEK。
托斯頓·福斯特(Thorsten Forster)是愛(ài)丁堡大學(xué)的數(shù)據(jù)科學(xué)研究員。他具有統(tǒng)計(jì)學(xué)和計(jì)算機(jī)科學(xué)背景,并獲得了生物醫(yī)學(xué)科學(xué)博士學(xué)位,在這些交叉學(xué)科研究方面擁有超過(guò)10年的經(jīng)驗(yàn)。
Thorsten利用統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí)(如微陣列和下一代測(cè)序)研究生物醫(yī)學(xué)的大數(shù)據(jù)分析方法,他曾經(jīng)是SPRINT項(xiàng)目的項(xiàng)目經(jīng)理,該項(xiàng)目的目標(biāo)是允許潛在用戶使用R統(tǒng)計(jì)編程語(yǔ)言對(duì)大型生物數(shù)據(jù)集應(yīng)用并行分析解決方案。他還是Fios Genomics公司的聯(lián)合創(chuàng)始人,該公司是一家大學(xué)孵化的提供生物醫(yī)學(xué)大數(shù)據(jù)研究的數(shù)據(jù)分析服務(wù)公司。
目前,Thorsten的工作是設(shè)計(jì)用于診斷新生兒細(xì)菌感染的基因轉(zhuǎn)移分類器、分析巨噬細(xì)胞干擾素激活的轉(zhuǎn)移譜、調(diào)查膽固醇對(duì)感染免疫的作用,以及研究導(dǎo)致兒童氣喘的基因因素。
Thorsten的完整資料可以在http://tinyurl.com/ThorstenForsterUEDIN上獲得。
特倫斯·斯隆(Terence Sloan)是愛(ài)丁堡大學(xué)高性能計(jì)算中心EPCC的軟件開(kāi)發(fā)小組經(jīng)理。他在蘇格蘭中小企業(yè)、英國(guó)公司以及歐洲和全球合作方面擁有超過(guò)25年的管理和參與數(shù)據(jù)科學(xué)和高性能計(jì)算項(xiàng)目的經(jīng)驗(yàn)。
Terry獲得過(guò)Wellcome Trust(基金號(hào)086696/Z/08/Z)、BBSRC(基金號(hào)BB/J019283/1)研究基金,以及幫助開(kāi)發(fā)R語(yǔ)言SPRINT添加包的3個(gè)EPSRC分布式計(jì)算科學(xué)基金。他在使用行為大數(shù)據(jù)進(jìn)行客戶行為分析方面獲得過(guò)ESRC獎(jiǎng)(獲獎(jiǎng)號(hào)RES-189-25-0066、RES-149-25-0005)。
Terry是愛(ài)丁堡大學(xué)HPC數(shù)據(jù)科學(xué)碩士項(xiàng)目的HPC數(shù)據(jù)分析、項(xiàng)目準(zhǔn)備和論文課程的責(zé)任人。
我要感謝Alan Simpson博士,他是EPCC的技術(shù)總監(jiān)、ARCHER超級(jí)計(jì)算機(jī)的計(jì)算科學(xué)和工程總監(jiān),感謝他支持SPRINT的開(kāi)發(fā)及其在英國(guó)國(guó)家超級(jí)計(jì)算機(jī)上的應(yīng)用。
目錄 Contents
譯者序
前言
關(guān)于作者
第1章 簡(jiǎn)單的R并行性1
1.1 亞里士多德數(shù)謎2
1.1.1 求解程序的實(shí)現(xiàn)2
1.1.2 改進(jìn)求解程序6
1.1.3 將問(wèn)題分解為多個(gè)任務(wù)10
1.2 R的并行包14
1.2.1 使用mclapply()15
1.2.2 使用parLapply()19
1.2.3 并行負(fù)載均衡21
1.3 segue包23
1.3.1 安裝segue24
1.3.2 設(shè)置AWS賬戶25
1.3.3 運(yùn)行segue27
1.3.4 求解亞里士多德數(shù)謎32
1.4 總結(jié)34
第2章 消息傳遞入門36
2.1 為MPI設(shè)置系統(tǒng)環(huán)境36
2.1.1 為MPI選擇R包37
2.1.2 選擇MPI子系統(tǒng)37
2.1.3 安裝OpenMPI38
2.2 MPI標(biāo)準(zhǔn)39
2.2.1 MPI的世界39
2.2.2 安裝Rmpi40
2.2.3 安裝pbdMPI41
2.3 MPI API43
2.3.1 點(diǎn)對(duì)點(diǎn)阻塞通信44
2.3.2 點(diǎn)對(duì)點(diǎn)非阻塞通信56
2.3.3 集體通信60
2.4 總結(jié)65
第3章 高級(jí)消息傳遞66
3.1 網(wǎng)格并行性66
3.1.1 創(chuàng)建網(wǎng)格集群68
3.1.2 邊界數(shù)據(jù)交換70
3.1.3 中值濾波73
3.1.4 平鋪分配圖像74
3.1.5 中值濾波網(wǎng)格程序76
3.2 檢查和管理通信84
3.3 lapply()的函數(shù)變體87
3.4 總結(jié)89
第4章 開(kāi)發(fā)SPRINT—超級(jí)計(jì)算機(jī)的基于MPI的R包90
4.1 關(guān)于ARCHER91
4.2 從R中調(diào)用MPI代碼92
4.2.1 MPI Hello World92
4.2.2 從R中調(diào)用C94
4.3 建立一個(gè)MPI R包—SPRINT97
4.3.1 簡(jiǎn)單的并行R接口(SPRINT)包97
4.3.2 SPRINT包的體系結(jié)構(gòu)99
4.4 將一個(gè)新函數(shù)添加到SPRINT包中100
4.4.1 下載SPRINT源代碼101
4.4.2 在R中創(chuàng)建一個(gè)存根—phello.R102
4.4.3 添加接口函數(shù)—phello.c103
4.4.4 添加實(shí)現(xiàn)函數(shù)—hello.c105
4.4.5 連接存根、接口和實(shí)現(xiàn)106
4.4.6 編譯并運(yùn)行SPRINT代碼110
4.5 基因組學(xué)分析案例研究112
4.5.1 基因組學(xué)113
4.5.2 基因組數(shù)據(jù)115
4.6 基因組學(xué)與超級(jí)計(jì)算機(jī)116
4.6.1 目標(biāo)116
4.6.2 ARCHER超級(jí)計(jì)算機(jī)116
4.6.3 隨機(jī)森林120
4.6.4 基因組分析案例研究的數(shù)據(jù)122
4.6.5 ARCHER中的隨機(jī)森林性能122
4.6.6 排名產(chǎn)品127
4.6.7 ARCHER中的排名產(chǎn)品性能128
4.6.8 結(jié)論131
4.7 總結(jié)132
第5章 筆記本中的超級(jí)計(jì)算機(jī)133
5.1 OpenCL133
5.2 ROpenCL包142
5.2.1 ROpenCL編程模型142
5.2.2 距離矩陣示例153
5.3 總結(jié)161
第6章 并行程序設(shè)計(jì)的藝術(shù)162
6.1 理解并行效率163
6.1.1 加速比163
6.1.2 阿姆達(dá)爾定律164
6.1.3 并行或者不并行165
6.2 數(shù)值逼近167
6.3 隨機(jī)數(shù)170
6.4 死鎖172
6.5 減少并行開(kāi)銷175
6.6 自適應(yīng)負(fù)載均衡178
6.6.1 任務(wù)場(chǎng)178
6.6.2 有效的網(wǎng)格處理179
6.6.3 成功并行化的3個(gè)步驟180
6.6.4 未來(lái)將會(huì)怎樣181
6.6.5 混合并行性184
6.7 總結(jié)185