版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-科學(xué)計(jì)算框架

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

科學(xué)計(jì)算框架是對(duì)科學(xué)研究領(lǐng)域(如空氣動(dòng)力學(xué))中的理論計(jì)算過程進(jìn)行文件管理、圖形處理、數(shù)據(jù)庫(kù)構(gòu)建等可視化開發(fā)和集成的軟件平臺(tái)具有強(qiáng)大的實(shí)用功能 。

簡(jiǎn)介在軟件工程領(lǐng)域,許多科學(xué)計(jì)算軟件的開發(fā)延用著傳統(tǒng)的開發(fā)技術(shù)。傳統(tǒng)的軟件開發(fā)方法具有編寫容易、目的明確等優(yōu)點(diǎn),運(yùn)算速度基本能滿足需要,但其主要不足是:(1)開發(fā)的軟件規(guī)模較小,功能單一,重復(fù)利用率低;(2)較難進(jìn)行多語(yǔ)言聯(lián)合開發(fā)及二次開發(fā);(3)由于FOrtran自身及其所使用的應(yīng)用框架的局限性,使之可視化界面粗糙,且不能充分發(fā)揮現(xiàn)有操作系統(tǒng)及各種應(yīng)用服務(wù)器的先進(jìn)功能來(lái)進(jìn)行網(wǎng)絡(luò)化的分布式管理。當(dāng)不僅僅把計(jì)算程序作為一種公式計(jì)算器時(shí),我們需要一種新的開發(fā)方法來(lái)進(jìn)行軟件開發(fā),而運(yùn)用這種方法開發(fā)需要達(dá)到以下要求:(1)軟件的通用性較強(qiáng),具有高度的集成性和復(fù)雜度,二次開發(fā)較為方便,在WindOws下具有友好的人機(jī)界面,能充分利用網(wǎng)絡(luò)進(jìn)行分布式管理;(2)能有效地區(qū)分科學(xué)計(jì)算內(nèi)核和其他管理功能的開發(fā)任務(wù),使負(fù)責(zé)編寫科學(xué)計(jì)算程序的工程師與負(fù)責(zé)其它設(shè)計(jì)任務(wù)的程序員的工作能夠清楚地分開,讓計(jì)算功能盡可能地從具體問題中抽象出來(lái),計(jì)算工程師可用與原來(lái)相似的方法編寫計(jì)算內(nèi)核程序,甚至原有的程序被稍加改動(dòng)既可變?yōu)橛?jì)算框架的新內(nèi)核,從而大大提高了原有計(jì)算程序的利用率,而對(duì)外圍程序可利用與計(jì)算內(nèi)核無(wú)關(guān)的最先進(jìn)的開發(fā)手段進(jìn)行開發(fā)。

進(jìn)行科學(xué)計(jì)算軟件開發(fā)的主要問題是如何使應(yīng)用程序框架高效、合理、安全地操作計(jì)算程序內(nèi)核,使之能正常工作并能返回正確的運(yùn)行結(jié)果。主要的實(shí)現(xiàn)方法有6種:(1)利用文件作為接口傳遞參數(shù);(2)編寫共享內(nèi)存接口庫(kù)使內(nèi)核與主框架通訊;(3)利用數(shù)據(jù)庫(kù)作為參數(shù)控制管理核心的方式;(4)將計(jì)算內(nèi)核改寫為FOrtran動(dòng)態(tài)鏈接庫(kù)的形式由主框架直接調(diào)用;(5)將計(jì)算內(nèi)核部署為COM/DCOM/ActiVeX組件;(6)部署為Web形式的B/S結(jié)構(gòu)。

設(shè)計(jì)與實(shí)現(xiàn)方法一該方法利用文件作為接口傳遞參數(shù)與計(jì)算內(nèi)核進(jìn)行通信。主程序框架將內(nèi)核所需的參數(shù)以文件的形式寫入指定路徑,然后啟動(dòng)內(nèi)核進(jìn)程,將參數(shù)從文件中讀取出來(lái)進(jìn)行運(yùn)算。這種方法簡(jiǎn)單快捷,容易開發(fā),持久保持在硬盤中的參數(shù)記錄下計(jì)算過程,使計(jì)算內(nèi)核進(jìn)程在重新啟動(dòng)后能繼續(xù)執(zhí)行計(jì)算工作,無(wú)需從頭再來(lái),這符合大多數(shù)計(jì)算程序讀取參數(shù)的方式,計(jì)算程序做很小改動(dòng),甚至不做改動(dòng)就可無(wú)縫地融合到整個(gè)框架之中。該方法最符合開發(fā)科學(xué)計(jì)算軟件的程序員的習(xí)慣。

方法二該方法編寫共享內(nèi)存接口庫(kù)使內(nèi)核與主框架通訊。在Win32環(huán)境下,每一個(gè)進(jìn)程都有獨(dú)立的進(jìn)程空間,其它進(jìn)程不能訪問,要想利用內(nèi)存進(jìn)行公共數(shù)據(jù)交換,可選擇建立內(nèi)存映像文件的方法來(lái)實(shí)現(xiàn)。利用內(nèi)存映像文件與計(jì)算內(nèi)核進(jìn)程通訊具有I/O開銷小,數(shù)據(jù)傳輸效率高"操作靈活的優(yōu)點(diǎn),其速度優(yōu)勢(shì)在處理較大量數(shù)據(jù)傳輸?shù)膯栴}時(shí)非常明顯,十分適合傳遞網(wǎng)格、圖像之類的大型數(shù)組數(shù)據(jù),不必生成中間文件"在一定程度上避免了中間狀態(tài)數(shù)據(jù)的泄漏。由于編程語(yǔ)言的限制和程序分工的不同,讓Fortan程序員直接調(diào)用Win32的API函數(shù)實(shí)現(xiàn)上述功能既不方便編寫,又不利于Fortran程序作為計(jì)算內(nèi)核的抽象性,所以建議把要使用的API函數(shù)封裝到一個(gè)用其它語(yǔ)言編寫的動(dòng)態(tài)鏈接庫(kù)中,供Fortran程序調(diào)用,使其源程序相對(duì)簡(jiǎn)化。

方法三該方法利用數(shù)據(jù)庫(kù)作為參數(shù)控制管理核心。這種方式使數(shù)據(jù)的保存、更新、刪除等工作更加方便,對(duì)參數(shù)的檢索方式更為靈活,在一些實(shí)際的工程中已經(jīng)出現(xiàn)了這種帶數(shù)據(jù)庫(kù)接口的工程計(jì)算程序:利用數(shù)據(jù)庫(kù)接口,將計(jì)算過程中的信息以及計(jì)算結(jié)果進(jìn)行存取,再在計(jì)算結(jié)果數(shù)據(jù)庫(kù)之上建立管理信息系統(tǒng),從而對(duì)計(jì)算數(shù)據(jù)進(jìn)行查詢和分析。雖然此模式有一些成功案例,但它的問題是:在計(jì)算程序中使用數(shù)據(jù)庫(kù)接口進(jìn)行大量繁雜的數(shù)據(jù)操作,破壞了計(jì)算程序作為內(nèi)核的單純性,使其編寫的復(fù)雜性大大增加。同時(shí)由于Fortan語(yǔ)言和VisualFortanFramework的限制,它的數(shù)據(jù)庫(kù)性能無(wú)法與VC++/Delphi相比,用這種方法編寫的程序的數(shù)據(jù)庫(kù)性能和穩(wěn)定性相對(duì)較差。同時(shí)將數(shù)據(jù)庫(kù)的接口封裝在不同計(jì)算內(nèi)核中既可能占用更多的資源,又會(huì)產(chǎn)生數(shù)據(jù)同步性差的隱患,還不利于整個(gè)框架的部署,建議將數(shù)據(jù)庫(kù)的工作交給框架平臺(tái),而用于計(jì)算的內(nèi)核進(jìn)程應(yīng)專注于計(jì)算本身,將必要的計(jì)算過程和計(jì)算結(jié)果數(shù)據(jù)的存取修改以消息的方式通知框架平臺(tái),由它進(jìn)行處理。

方法四該方法將計(jì)算內(nèi)核改寫為Fortran動(dòng)態(tài)鏈接庫(kù)(DLL)的形式由主框架直接調(diào)。當(dāng)應(yīng)用程序調(diào)用動(dòng)態(tài)鏈接庫(kù)函數(shù)時(shí),會(huì)將這個(gè)DLL映射到自身進(jìn)程的內(nèi)存空間內(nèi)(BFFFFFFF-80000000)。DLL將利用調(diào)用它的進(jìn)程來(lái)堆棧,故調(diào)用DLL中的函數(shù)就像調(diào)用本身的函數(shù)一樣方便不存在多進(jìn)程通訊的復(fù)雜處理過程。由于DLL在內(nèi)存中只存在一份,調(diào)用程序僅是將它的內(nèi)存地址映射到自己的內(nèi)存地址空間,所以當(dāng)有多個(gè)進(jìn)程調(diào)用同一個(gè)DLL時(shí),操作系統(tǒng)只會(huì)將這個(gè)DLL的副本復(fù)制到進(jìn)程,而不會(huì)像開辟獨(dú)立進(jìn)程那樣再開辟內(nèi)存,使用DLL的效率比使用進(jìn)程要高。

將計(jì)算內(nèi)核改寫為Fortran動(dòng)態(tài)鏈接庫(kù)以供主框架調(diào)用是一種高效快捷的方法,但它的優(yōu)勢(shì)有時(shí)也會(huì)轉(zhuǎn)換為劣勢(shì)。由于它需要注入別的進(jìn)程,所以DLL不能單獨(dú)運(yùn)行,例如為了快捷方便,用戶可能直接啟動(dòng)一些計(jì)算模塊,但DLL卻做不到這一點(diǎn)(運(yùn)行rundll32.exe可以執(zhí)行某個(gè)DLL但是不夠靈活而且在顯示表達(dá)上也不夠豐富),另外當(dāng)它所注入的進(jìn)程因?yàn)殄e(cuò)誤(也有可能是該進(jìn)程引用的其他DLL的錯(cuò)誤)導(dǎo)致本進(jìn)程無(wú)法繼續(xù)運(yùn)行時(shí),這個(gè)進(jìn)程相關(guān)聯(lián)的所有DLL也都會(huì)在進(jìn)程空間里失效,這種失效有可能會(huì)使一個(gè)計(jì)算了幾天的工作結(jié)果付之東流,相對(duì)前面所提到的基于多進(jìn)程的結(jié)構(gòu),這種基于DLL的多線程結(jié)構(gòu)的穩(wěn)定性比較差(ORACLE數(shù)據(jù)庫(kù)就是基于多進(jìn)程的而微軟的SOLSERVER是基于多線程的),所以在涉及到長(zhǎng)時(shí)間、大強(qiáng)度、關(guān)鍵性運(yùn)算時(shí)使用動(dòng)態(tài)鏈接庫(kù)框架要慎重。

方法五該方法將計(jì)算內(nèi)核部署為COM/DCOM/ActiveX組件的形式。COM(ComponentObjectModel)即組建對(duì)象模型時(shí)Windows系統(tǒng)的核心,也可以說(shuō)Windows就是建立在COM模型之上的。編寫COM對(duì)象不但可以實(shí)現(xiàn)二進(jìn)制級(jí)別上的代碼復(fù)用,還可以深入到系統(tǒng)的核心。任何支持接口(Interface)的編程語(yǔ)言都可以調(diào)用COM對(duì)象的接口方法,而COM對(duì)象接口如果繼承自Idispatch那該接口的方法可以被腳本語(yǔ)言調(diào)用,這將大大豐富COM對(duì)象的使用面。在網(wǎng)絡(luò)上部署的COM組件被稱為DCOM,DCOM需要部署為進(jìn)程外服務(wù)器或部署在MTS之類的應(yīng)用服務(wù)器之上,供使用者在網(wǎng)絡(luò)上進(jìn)行分布式調(diào)用。這樣做的好處是可以充分發(fā)揮網(wǎng)絡(luò)資源的優(yōu)勢(shì),根據(jù)每臺(tái)機(jī)器的特點(diǎn)部署不同計(jì)算強(qiáng)度的組件,使計(jì)算力量合理分配。而這一切對(duì)使用者來(lái)說(shuō)又幾乎是透明的,操作起來(lái)就像操作本地電腦一樣方便。當(dāng)然,這樣的做法較復(fù)雜,不太適合負(fù)責(zé)計(jì)算模塊的程序員編寫??上扔肅++/ObjectPascal之類的語(yǔ)言編寫COM對(duì)象,再用前文的方法1~4將對(duì)象與底層核心組合起來(lái),由COM負(fù)責(zé)與核心的通信,訪問程序只和COM對(duì)象打交道。

方法六該方法將開發(fā)框架部署為Web形式的B/S結(jié)構(gòu)。將計(jì)算程序和管理它的WebApplication安裝在服務(wù)器上的優(yōu)勢(shì)是:客戶端無(wú)需再安裝任何軟件和進(jìn)行復(fù)雜的系統(tǒng)配置,就可在任何地方使用任何系統(tǒng)進(jìn)行計(jì)算。不僅可以在局域網(wǎng)內(nèi)使用這種B/S結(jié)構(gòu)的計(jì)算框架,在Internet上同樣可以讓瀏覽器操作防火墻后的計(jì)算程序,當(dāng)然這種操作可以是集成了安全認(rèn)證的。用這種方式構(gòu)建的遠(yuǎn)程計(jì)算框架可以為我們帶來(lái)一種較為流行的軟件提供形式,即ApplicationSerVice交付給客戶的不再是光盤中的軟件和復(fù)雜的使用說(shuō)明書,而可能僅僅是一張寫有服務(wù)器網(wǎng)址和用戶名密碼的卡片,甚至是限制計(jì)算次數(shù)的充值卡。這種框架不太適合用ASPActiVeXSerVerPage實(shí)現(xiàn),因?yàn)檫@里涉及到本地代碼的調(diào)用問題,可以考慮使用Jsp+JaVaBean/EJB或VC++/Delphi編寫的ISAPI來(lái)實(shí)現(xiàn)。ISAPI即InternetSerVerApplicationProgramInterface是微軟提供的一套面向Internet服務(wù)的API接口。SAPI的工作原理是通過交互式主頁(yè)取得用戶輸入信息,然后交服務(wù)器后臺(tái)處理。在ISAPI下建立的應(yīng)用程序是以動(dòng)態(tài)鏈接庫(kù)的形式存在的,ISAPI應(yīng)用的DLL不僅可以象CGI(即通用網(wǎng)關(guān)接口CommonGatewayInterface)程序一樣被用戶請(qǐng)求激活,還可以被系統(tǒng)預(yù)先激活來(lái)監(jiān)視用戶輸入。被用戶激活的DLL在處理完一個(gè)用戶請(qǐng)求后將繼續(xù)駐留在內(nèi)存中等待處理別的用戶輸入,直到過了一段無(wú)用戶輸入時(shí)間后才消失。一個(gè)ISAPI的DLL可在被用戶請(qǐng)求激活后長(zhǎng)駐內(nèi)存,等待用戶的另一個(gè)請(qǐng)求,還可在一個(gè)DLL里設(shè)置多個(gè)用戶請(qǐng)求處理函數(shù),此外ISAPI的DLL應(yīng)用程序和WWW服務(wù)器處于同一個(gè)進(jìn)程中,效率要顯著高于CGI。1

常用的深度學(xué)習(xí)科學(xué)計(jì)算框架TensorflowTensorFlow是一款開源的數(shù)學(xué)計(jì)算軟件,使用數(shù)據(jù)流圖(DataFlowGraph)的形式進(jìn)行計(jì)算。圖中的節(jié)點(diǎn)代表數(shù)學(xué)運(yùn)算,而圖中的線條表示多維數(shù)據(jù)數(shù)組(tensor)之間的交互。TensorFlow靈活的架構(gòu)可以部署在一個(gè)或多個(gè)CPU、GPU的臺(tái)式以及服務(wù)器中,或者使用單一的API應(yīng)用在移動(dòng)設(shè)備中。TensorFlow最初是由研究人員和GoogleBrain團(tuán)隊(duì)針對(duì)機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)進(jìn)行研究所開發(fā)的,開源之后可以在幾乎各種領(lǐng)域適用。

TensorFlow的特點(diǎn):

機(jī)動(dòng)性:TensorFlow并不只是一個(gè)規(guī)則的neuralnetwork庫(kù),事實(shí)上如果你可以將你的計(jì)算表示成dataflowgraph的形式,就可以使用TensorFlow。用戶構(gòu)建graph,寫內(nèi)層循環(huán)代碼驅(qū)動(dòng)計(jì)算,TensorFlow可以幫助裝配子圖。定義新的操作只需要寫一個(gè)Python函數(shù),如果缺少底層的數(shù)據(jù)操作,需要寫一些C++代碼定義操作。

可適性強(qiáng):可以應(yīng)用在不同設(shè)備上,cpus,gpu,移動(dòng)設(shè)備,云平臺(tái)等

自動(dòng)差分:TensorFlow的自動(dòng)差分能力對(duì)很多基于Graph的機(jī)器學(xué)習(xí)算法有益

多種編程語(yǔ)言可選:TensorFlow很容易使用,有python接口和C++接口。其他語(yǔ)言可以使用SWIG工具使用接口。(SWIG—SimplifiedWrapperandInterfaceGenerator,是一個(gè)非常優(yōu)秀的開源工具,支持將C/C++代碼與任何主流腳本語(yǔ)言相集成。)

最優(yōu)化表現(xiàn):充分利用硬件資源,TensorFlow可以將graph的不同計(jì)算單元分配到不同設(shè)備執(zhí)行,使用TensorFlow處理副本。

TorchTorch是一個(gè)有大量機(jī)器學(xué)習(xí)算法支持的科學(xué)計(jì)算框架,其誕生已經(jīng)有十年之久,但是真正起勢(shì)得益于Facebook開源了大量Torch的深度學(xué)習(xí)模塊和擴(kuò)展。Torch另外一個(gè)特殊之處是采用了編程語(yǔ)言Lua(該語(yǔ)言曾被用來(lái)開發(fā)視頻游戲)。

Torch的優(yōu)勢(shì):

構(gòu)建模型簡(jiǎn)單

高度模塊化

快速高效的GPU支持

通過LuaJIT接入C

數(shù)值優(yōu)化程序等

可嵌入到iOS、Android和FPGA后端的接口

CaffeCaffe由加州大學(xué)伯克利的PHD賈揚(yáng)清開發(fā),全稱ConvolutionalArchitectureforFastFeatureEmbedding,是一個(gè)清晰而高效的開源深度學(xué)習(xí)框架,由伯克利視覺學(xué)中心(BerkeleyVisionandLearningCenter,BVLC)進(jìn)行維護(hù)。(賈揚(yáng)清曾就職于MSRA、NEC、GoogleBrain,他也是TensorFlow的作者之一,任職于FacebookFAIR實(shí)驗(yàn)室。)

Caffe基本流程:Caffe遵循了神經(jīng)網(wǎng)絡(luò)的一個(gè)簡(jiǎn)單假設(shè)——所有的計(jì)算都是以layer的形式表示的,layer做的事情就是獲得一些數(shù)據(jù),然后輸出一些計(jì)算以后的結(jié)果。比如說(shuō)卷積——就是輸入一個(gè)圖像,然后和這一層的參數(shù)(filter)做卷積,然后輸出卷積的結(jié)果。每一個(gè)層級(jí)(layer)需要做兩個(gè)計(jì)算:前向forward是從輸入計(jì)算輸出,然后反向backward是從上面給的gradient來(lái)計(jì)算相對(duì)于輸入的gradient,只要這兩個(gè)函數(shù)實(shí)現(xiàn)了以后,我們就可以把很多層連接成一個(gè)網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)做的事情就是輸入我們的數(shù)據(jù)(圖像或者語(yǔ)音等),然后來(lái)計(jì)算我們需要的輸出(比如說(shuō)識(shí)別的標(biāo)簽),在訓(xùn)練的時(shí)候,我們可以根據(jù)已有的標(biāo)簽來(lái)計(jì)算損失和gradient,然后用gradient來(lái)更新網(wǎng)絡(luò)的參數(shù)。

Caffe的優(yōu)勢(shì):

上手快:模型與相應(yīng)優(yōu)化都是以文本形式而非代碼形式給出

速度快:能夠運(yùn)行最棒的模型與大量的數(shù)據(jù)

模塊化:方便擴(kuò)展到新的任務(wù)和設(shè)置上

開放性:公開的代碼和參考模型用于再現(xiàn)

社區(qū)好:可以通過BSD-2參與開發(fā)與討論

Theano2008年誕生于蒙特利爾理工學(xué)院,Theano派生出了大量深度學(xué)習(xí)Python軟件包,最著名的包括Blocks和Keras。Theano的核心是一個(gè)數(shù)學(xué)表達(dá)式的編譯器,它知道如何獲取你的結(jié)構(gòu)。并使之成為一個(gè)使用numpy、高效本地庫(kù)的高效代碼,如BLAS和本地代碼(C++)在CPU或GPU上盡可能快地運(yùn)行。它是為深度學(xué)習(xí)中處理大型神經(jīng)網(wǎng)絡(luò)算法所需的計(jì)算而專門設(shè)計(jì)的,是這類庫(kù)的發(fā)明之一(發(fā)展始于2007年),被認(rèn)為是深度學(xué)習(xí)研究和開發(fā)的行業(yè)標(biāo)準(zhǔn)。

Theano的優(yōu)勢(shì):

集成NumPy-使用numpy.ndarray

使用GPU加速計(jì)算-比CPU快140倍(只針對(duì)32位float類型)

有效的符號(hào)微分-計(jì)算一元或多元函數(shù)的導(dǎo)數(shù)

速度和穩(wěn)定性優(yōu)化

動(dòng)態(tài)地生成C代碼-更快地進(jìn)行計(jì)算

廣泛地單元測(cè)試和自我驗(yàn)證-檢測(cè)和診斷多種錯(cuò)誤

靈活性好

本詞條內(nèi)容貢獻(xiàn)者為:

王慧維 - 副研究員 - 西南大學(xué)