科学计算框架是对科学研究领域(如空气动力学)中的理论计算过程进行档案管理、图形处理、资料库构建等可视化开发和集成的软体平台具有强大的实用功能 。
基本介绍
- 中文名:科学计算框架
- 外文名:Scientific computing framework
- 作用:科学计算
简介
在软体工程领域,许多科学计算软体的开发延用着传统的开发技术。传统的软体开发方法具有编写容易、目的明确等优点,运算速度基本能满足需要,但其主要不足是:(1)开发的软体规模较小,功能单一,重複利用率低;(2)较难进行多语言联合开发及二次开发;(3)由于FOrtran自身及其所使用的套用框架的局限性,使之可视化界面粗糙,且不能充分发挥现有作业系统及各种套用伺服器的先进功能来进行网路化的分散式管理。当不仅仅把计算程式作为一种公式计算器时,我们需要一种新的开发方法来进行软体开发,而运用这种方法开发需要达到以下要求:(1)软体的通用性较强,具有高度的集成性和複杂度,二次开发较为方便,在WindOws下具有友好的人机界面,能充分利用网路进行分散式管理;(2)能有效地区分科学计算核心和其他管理功能的开发任务,使负责编写科学计算程式的工程师与负责其它设计任务的程式设计师的工作能够清楚地分开,让计算功能儘可能地从具体问题中抽象出来,计算工程师可用与原来相似的方法编写计算核心程式,甚至原有的程式被稍加改动既可变为计算框架的新核心,从而大大提高了原有计算程式的利用率,而对外围程式可利用与计算核心无关的最先进的开发手段进行开发。
进行科学计算软体开发的主要问题是如何使应用程式框架高效、合理、安全地操作计算程式核心,使之能正常工作并能返回正确的运行结果。主要的实现方法有6种:(1)利用档案作为接口传递参数;(2)编写共享记忆体接口库使核心与主框架通讯;(3)利用资料库作为参数控制管理核心的方式;(4)将计算核心改写为FOrtran动态程式库的形式由主框架直接调用;(5)将计算核心部署为COM/DCOM/ActiVeX组件;(6)部署为Web形式的B/S结构。
设计与实现
方法一
该方法利用档案作为接口传递参数与计算核心进行通信。主程式框架将核心所需的参数以档案的形式写入指定路径,然后启动核心进程,将参数从档案中读取出来进行运算。这种方法简单快捷,容易开发,持久保持在硬碟中的参数记录下计算过程,使计算核心进程在重新启动后能继续执行计算工作,无需从头再来,这符合大多数计算程式读取参数的方式,计算程式做很小改动,甚至不做改动就可无缝地融合到整个框架之中。该方法最符合开发科学计算软体的程式设计师的习惯。
方法二
该方法编写共享记忆体接口库使核心与主框架通讯。在Win32环境下,每一个进程都有独立的进程空间,其它进程不能访问,要想利用记忆体进行公共数据交换,可选择建立记忆体映像档案的方法来实现。利用记忆体映像档案与计算核心进程通讯具有I/O开销小,数据传输效率高"操作灵活的优点,其速度优势在处理较大量数据传输的问题时非常明显,十分适合传递格线、图像之类的大型数组数据,不必生成中间档案"在一定程度上避免了中间状态数据的泄漏。由于程式语言的限制和程式分工的不同,让Fortan程式设计师直接调用Win32的API函式实现上述功能既不方便编写,又不利于Fortran程式作为计算核心的抽象性,所以建议把要使用的API函式封装到一个用其它语言编写的动态程式库中,供Fortran程式调用,使其源程式相对简化。
方法三
该方法利用资料库作为参数控制管理核心。这种方式使数据的保存、更新、删除等工作更加方便,对参数的检索方式更为灵活,在一些实际的工程中已经出现了这种带资料库接口的工程计算程式:利用资料库接口,将计算过程中的信息以及计算结果进行存取,再在计算结果资料库之上建立管理信息系统,从而对计算数据进行查询和分析。虽然此模式有一些成功案例,但它的问题是:在计算程式中使用资料库接口进行大量繁杂的数据操作,破坏了计算程式作为核心的单纯性,使其编写的複杂性大大增加。同时由于Fortan语言和VisualFortanFramework的限制,它的资料库性能无法与VC++/Delphi相比,用这种方法编写的程式的资料库性能和稳定性相对较差。同时将资料库的接口封装在不同计算核心中既可能占用更多的资源,又会产生数据同步性差的隐患,还不利于整个框架的部署,建议将资料库的工作交给框架平台,而用于计算的核心进程应专注于计算本身,将必要的计算过程和计算结果数据的存取修改以讯息的方式通知框架平台,由它进行处理。
方法四
该方法将计算核心改写为Fortran动态程式库(DLL)的形式由主框架直接调。当应用程式调用动态程式库函式时,会将这个DLL映射到自身进程的记忆体空间内(BFFFFFFF-80000000)。DLL将利用调用它的进程来堆叠,故调用DLL中的函式就像调用本身的函式一样方便不存在多进程通讯的複杂处理过程。由于DLL在记忆体中只存在一份,调用程式仅是将它的记忆体地址映射到自己的记忆体地址空间,所以当有多个进程调用同一个DLL时,作业系统只会将这个DLL的副本複製到进程,而不会像开闢独立进程那样再开闢记忆体,使用DLL的效率比使用进程要高。
将计算核心改写为Fortran动态程式库以供主框架调用是一种高效快捷的方法,但它的优势有时也会转换为劣势。由于它需要注入别的进程,所以DLL不能单独运行,例如为了快捷方便,用户可能直接启动一些计算模组,但DLL却做不到这一点(运行rundll32.exe可以执行某个DLL但是不够灵活而且在显示表达上也不够丰富),另外当它所注入的进程因为错误(也有可能是该进程引用的其他DLL的错误)导致本进程无法继续运行时,这个进程相关联的所有DLL也都会在进程空间里失效,这种失效有可能会使一个计算了几天的工作结果付之东流,相对前面所提到的基于多进程的结构,这种基于DLL的多执行绪结构的稳定性比较差(ORACLE资料库就是基于多进程的而微软的SOLSERVER是基于多执行绪的),所以在涉及到长时间、大强度、关键性运算时使用动态程式库框架要慎重。
方法五
该方法将计算核心部署为COM/DCOM/ActiveX组件的形式。COM(ComponentObjectModel)即组建对象模型时Windows系统的核心,也可以说Windows就是建立在COM模型之上的。编写COM对象不但可以实现二进制级别上的代码复用,还可以深入到系统的核心。任何支持接口(Interface)的程式语言都可以调用COM对象的接口方法,而COM对象接口如果继承自Idispatch那该接口的方法可以被脚本语言调用,这将大大丰富COM对象的使用面。在网路上部署的COM组件被称为DCOM,DCOM需要部署为进程外伺服器或部署在MTS之类的套用伺服器之上,供使用者在网路上进行分散式调用。这样做的好处是可以充分发挥网路资源的优势,根据每台机器的特点部署不同计算强度的组件,使计算力量合理分配。而这一切对使用者来说又几乎是透明的,操作起来就像操作本地电脑一样方便。当然,这样的做法较複杂,不太适合负责计算模组的程式设计师编写。可先用C++/ObjectPascal之类的语言编写COM对象,再用前文的方法1~4将对象与底层核心组合起来,由COM负责与核心的通信,访问程式只和COM对象打交道。
方法六
该方法将开发框架部署为Web形式的B/S结构。将计算程式和管理它的WebApplication安装在伺服器上的优势是:客户端无需再安装任何软体和进行複杂的系统配置,就可在任何地方使用任何系统进行计算。不仅可以在区域网路内使用这种B/S结构的计算框架,在Internet上同样可以让浏览器操作防火墙后的计算程式,当然这种操作可以是集成了安全认证的。用这种方式构建的远程计算框架可以为我们带来一种较为流行的软体提供形式,即ApplicationSerVice交付给客户的不再是光碟中的软体和複杂的使用说明书,而可能仅仅是一张写有伺服器网址和用户名密码的卡片,甚至是限制计算次数的充值卡。这种框架不太适合用ASPActiVeXSerVerPage实现,因为这里涉及到本地代码的调用问题,可以考虑使用Jsp+JaVaBean/EJB或VC++/Delphi编写的ISAPI来实现。ISAPI即InternetSerVerApplicationProgramInterface是微软提供的一套面向Internet服务的API接口。SAPI的工作原理是通过互动式主页取得用户输入信息,然后交伺服器后台处理。在ISAPI下建立的应用程式是以动态程式库的形式存在的,ISAPI套用的DLL不仅可以象CGI(即通用网关接口CommonGatewayInterface)程式一样被用户请求激活,还可以被系统预先激活来监视用户输入。被用户激活的DLL在处理完一个用户请求后将继续驻留在记忆体中等待处理别的用户输入,直到过了一段无用户输入时间后才消失。一个ISAPI的DLL可在被用户请求激活后长驻记忆体,等待用户的另一个请求,还可在一个DLL里设定多个用户请求处理函式,此外ISAPI的DLL应用程式和WWW伺服器处于同一个进程中,效率要显着高于CGI。
常用的深度学习科学计算框架
Tensorflow
TensorFlow是一款开源的数学计算软体,使用数据流图(DataFlowGraph)的形式进行计算。图中的节点代表数学运算,而图中的线条表示多维数据数组(tensor)之间的互动。TensorFlow灵活的架构可以部署在一个或多个CPU、GPU的台式以及伺服器中,或者使用单一的API套用在移动设备中。TensorFlow最初是由研究人员和GoogleBrain团队针对机器学习和深度神经网路进行研究所开发的,开源之后可以在几乎各种领域适用。
TensorFlow的特点:
机动性:TensorFlow并不只是一个规则的neuralnetwork库,事实上如果你可以将你的计算表示成dataflowgraph的形式,就可以使用TensorFlow。用户构建graph,写内层循环代码驱动计算,TensorFlow可以帮助装配子图。定义新的操作只需要写一个Python函式,如果缺少底层的数据操作,需要写一些C++代码定义操作。
可适性强:可以套用在不同设备上,cpus,gpu,移动设备,云平台等
自动差分:TensorFlow的自动差分能力对很多基于Graph的机器学习算法有益
多种程式语言可选:TensorFlow很容易使用,有python接口和C++接口。其他语言可以使用SWIG工具使用接口。(SWIG—SimplifiedWrapperandInterfaceGenerator,是一个非常优秀的开源工具,支持将C/C++代码与任何主流脚本语言相集成。)
最最佳化表现:充分利用硬体资源,TensorFlow可以将graph的不同计算单元分配到不同设备执行,使用TensorFlow处理副本。
Torch
Torch是一个有大量机器学习算法支持的科学计算框架,其诞生已经有十年之久,但是真正起势得益于Facebook开源了大量Torch的深度学习模组和扩展。Torch另外一个特殊之处是採用了程式语言Lua(该语言曾被用来开发视频游戏)。
Torch的优势:
- 构建模型简单
- 高度模组化
- 快速高效的GPU支持
- 通过LuaJIT接入C
- 数值最佳化程式等
- 可嵌入到iOS、Android和FPGA后端的接口
Caffe
Caffe由加州大学伯克利的PHD贾扬清开发,全称ConvolutionalArchitectureforFastFeatureEmbedding,是一个清晰而高效的开源深度学习框架,由伯克利视觉学中心(BerkeleyVisionandLearningCenter,BVLC)进行维护。(贾扬清曾就职于MSRA、NEC、GoogleBrain,他也是TensorFlow的作者之一,任职于FacebookFAIR实验室。)
Caffe基本流程:Caffe遵循了神经网路的一个简单假设——所有的计算都是以layer的形式表示的,layer做的事情就是获得一些数据,然后输出一些计算以后的结果。比如说卷积——就是输入一个图像,然后和这一层的参数(filter)做卷积,然后输出卷积的结果。每一个层级(layer)需要做两个计算:前向forward是从输入计算输出,然后反向backward是从上面给的gradient来计算相对于输入的gradient,只要这两个函式实现了以后,我们就可以把很多层连线成一个网路,这个网路做的事情就是输入我们的数据(图像或者语音等),然后来计算我们需要的输出(比如说识别的标籤),在训练的时候,我们可以根据已有的标籤来计算损失和gradient,然后用gradient来更新网路的参数。
Caffe的优势:
上手快:模型与相应最佳化都是以文本形式而非代码形式给出
速度快:能够运行最棒的模型与大量的数据
模组化:方便扩展到新的任务和设定上
开放性:公开的代码和参考模型用于再现
社区好:可以通过BSD-2参与开发与讨论
Theano
2008年诞生于蒙特娄理工学院,Theano派生出了大量深度学习Python软体包,最着名的包括Blocks和Keras。Theano的核心是一个数学表达式的编译器,它知道如何获取你的结构。并使之成为一个使用numpy、高效本地库的高效代码,如BLAS和本地代码(C++)在CPU或GPU上儘可能快地运行。它是为深度学习中处理大型神经网路算法所需的计算而专门设计的,是这类库的发明之一(发展始于2007年),被认为是深度学习研究和开发的行业标準。
Theano的优势:
- 集成NumPy-使用numpy.ndarray
- 使用GPU加速计算-比CPU快140倍(只针对32位float类型)
- 有效的符号微分-计算一元或多元函式的导数
- 速度和稳定性最佳化
- 动态地生成C代码-更快地进行计算
- 广泛地单元测试和自我验证-检测和诊断多种错误
- 灵活性好