科学计算框架

科技工作者之家 2020-11-17

科学计算框架是对科学研究领域(如空气动力学)中的理论计算过程进行文件管理、图形处理、数据库构建等可视化开发和集成的软件平台具有强大的实用功能 。

简介在软件工程领域,许多科学计算软件的开发延用着传统的开发技术。传统的软件开发方法具有编写容易、目的明确等优点,运算速度基本能满足需要,但其主要不足是:(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。1

常用的深度学习科学计算框架TensorflowTensorFlow是一款开源的数学计算软件,使用数据流图(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处理副本。

TorchTorch是一个有大量机器学习算法支持的科学计算框架,其诞生已经有十年之久,但是真正起势得益于Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了编程语言Lua(该语言曾被用来开发视频游戏)。

Torch的优势:

构建模型简单

高度模块化

快速高效的GPU支持

通过LuaJIT接入C

数值优化程序等

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

CaffeCaffe由加州大学伯克利的PHD贾扬清开发,全称ConvolutionalArchitectureforFastFeatureEmbedding,是一个清晰而高效的开源深度学习框架,由伯克利视觉学中心(BerkeleyVisionandLearningCenter,BVLC)进行维护。(贾扬清曾就职于MSRA、NEC、GoogleBrain,他也是TensorFlow的作者之一,任职于FacebookFAIR实验室。)

Caffe基本流程:Caffe遵循了神经网络的一个简单假设——所有的计算都是以layer的形式表示的,layer做的事情就是获得一些数据,然后输出一些计算以后的结果。比如说卷积——就是输入一个图像,然后和这一层的参数(filter)做卷积,然后输出卷积的结果。每一个层级(layer)需要做两个计算:前向forward是从输入计算输出,然后反向backward是从上面给的gradient来计算相对于输入的gradient,只要这两个函数实现了以后,我们就可以把很多层连接成一个网络,这个网络做的事情就是输入我们的数据(图像或者语音等),然后来计算我们需要的输出(比如说识别的标签),在训练的时候,我们可以根据已有的标签来计算损失和gradient,然后用gradient来更新网络的参数。

Caffe的优势:

上手快:模型与相应优化都是以文本形式而非代码形式给出

速度快:能够运行最棒的模型与大量的数据

模块化:方便扩展到新的任务和设置上

开放性:公开的代码和参考模型用于再现

社区好:可以通过BSD-2参与开发与讨论

Theano2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。Theano的核心是一个数学表达式的编译器,它知道如何获取你的结构。并使之成为一个使用numpy、高效本地库的高效代码,如BLAS和本地代码(C++)在CPU或GPU上尽可能快地运行。它是为深度学习中处理大型神经网络算法所需的计算而专门设计的,是这类库的发明之一(发展始于2007年),被认为是深度学习研究和开发的行业标准。

Theano的优势:

集成NumPy-使用numpy.ndarray

使用GPU加速计算-比CPU快140倍(只针对32位float类型)

有效的符号微分-计算一元或多元函数的导数

速度和稳定性优化

动态地生成C代码-更快地进行计算

广泛地单元测试和自我验证-检测和诊断多种错误

灵活性好

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。