基于h5py和mpi4py的HDF5数据并行处理的探索

2022-09-12

Hierarchical Data Format 5 (HDF5) 称为层次性数据格式第五版, 伴随着HDF5发展和其生态的逐渐完善, 越来越多的科研机构选择使用HDF5格式来存放科研数据。但随之而来的问题是体量庞大的科研HDF5数据处理, 若是使用传统的个人电脑和串行程序, 则在处理时间上会开销巨大。所以目前对于这种大数据的处理通常会选择在集群计算机上使用并行计算的方式, 从而提高处理效率。本文旨在探索一种简单有效的HDF5数据并行处理方法, 该方法通过将常用的数据处理语言Python结合其并行计算包mpi4py和HDF5处理包h5py, 可一定程度简化以往复杂的并行程序编写, 同时具有较高的并行计算效率。

一、HDF5数据

(一) HDF5简介

HDF5最初是由美国的国家超算中心所开发, 用来存储和管理海量科学数据集合的一种文件格式。目前是由HDF组 (一个非盈利性质的组织) 来开发和维护。HDF5文件由于其设计特性, 已经被广泛应用在卫星数据、气象数据、水利数据、核能数据、航空数据、金融数据、生物数据和医学成像数据等各类科学研究中。发展至今, 整个HDF5不仅包括文件的格式, 还包括了数据模型, 应用程序接口、开源标准库和一些工具套件。

(二) HDF5文件结构

在HDF5文件的数据模型中, 两个最基本的对象是分组 (group) 和数据集合 (dataset) 。分组中有大于等于0个或者多个分组、数据集合和一些用于补充说明的元数据。数据集合中有存放数据元素的多维数组和一切用户补充说明的元数据。数据模型中还有一些对象是对分组 (group) 和数据集合 (dataset) 的补充说明, 例如:数据类型 (datatype) 、数据空间 (dataspace) 、特性表 (property list) 和属性 (attribute) 。HDF5文件的组成和结构类似于UNIX/LINUX的操作系统的文件目录结构, 它总是有一个根节点的组 (root group, 符号表示为/) , 然后从根节点组再衍生出具体的分组和组成员, 并且用路径的形式来分组和组成员。数据集合 (dataset) 一般位于分组的 (group) 下面。例如名称为test的数据集合可存放在b组下面, 其路径可表示为/a/b/test。图1具体展示了HDF5文件的结构。

(三) HDF5开源代码库和生态系统

HDF5的开源库文件是由HDF组的主要项目产品, 该库文件很大一部分是用C语言编写的, 它可运行在笔记、台式机甚至超级计算机上, 并且提供对诸如C、C++和Fortran90等高级语言的应用程序接口, 本文所用的Python接口模块h5py就是HDF组所提供的。因为HDF5还具有良好的软件生态环境, 所以HDF5文件可以跨平台在任何操作系统上对其进行读写。各种编程语言, 例如Python、C#、Java等都支持对HDF5的操作, 另外HDF5还提供工具集合, 包括了对开放数据库互连 (Open Database Connectivity, ODBC) 的接口工具、命令行工具, 转换、编辑、查看工具。不仅如此, HDF5被很多国内外著名的研究机构所使用, 其中就有美国国家航空和宇宙航行局 (NASA) , 欧洲的南方天文台 (ESO) 和中国的科学院国家空间科学中心、国家卫星气象中心。

二、并行计算

(一) HDF5和并行计算

HDF5文件经常被用来存储天文数据、卫星图像、地理信息和金融交易记录等体量巨大的数据集。如此高维度的数据集合, 对于计算性能会有很高的要求, 此时传统串行处理的方式往往捉襟见肘, 不能满足快速高效甚至实时的数据处理要求。若要快速完成对海量数据集的处理, 则需要使用并行计算。并行计算顾名思义就是在计算机集群上, 将一个大型的计算任务细分成多个小型的计算子任务并分配给集群中不同的计算机求解, 各计算节点相互协同, 从而加速完成计算任务的求解。HDF的设计涵盖了支持大容量的文件和并行操作这两个重要特性。并行HDF5支持使用消息传递接口 (Message Passing Interface, MPI) , 它作为并行计算机编程的跨语言跨平台通信协议, 长期以来都被广泛应用于计算密集型的场景。

(二) Python、mpi4py和h5py

虽然MPI在并行计算领域占据着举足轻重的地位, 但由于原生只支持C、C++和Fortran三种编程语言。可相对复杂代码规范和数据结构表达, 使得C和Fortran对于很多没有计算机背景的研究人员需要花费大量的时间去熟练掌握。

对于并行计算, Python的软件库中有mpi4py, 它是用Cython编写而成, 负责提供对MPI的绑定, 其中实现了MPI标准的接口, 例如点对点通信, 组内集合通信, 阻塞/非阻塞通信等, 可以让Python的数据在多个进程之间完成传递。

对于操作HDF5文件, Python的软件库中还有h5py, 它将HDF5中的分组、数据集合和属性等进行了上层封装, 同时还将C语言编写的HDF5底层进行了封装, 这使得h5py可以完成所有C语言对HDF5的操作, 但是很大程度上降低了程序的代码量和编程的复杂度。基于此, 使用Python配合其并行软件库mpi4py和HDF5接口库h5py, 就可以十分方便的对含有海量数据集合的HDF5数据文件实施并行处理。

三、配置并行环境

虽然使用Python并行计算相比于使用C或者Fortran的并行计算在一定程度上得到了简化, 但是并行环境的安装和配置并没有变得简单, 还需要按照如下的步骤进行。

并行环境需要在Linux下进行安装和配置, 根据软件之间的相互依赖关系, 有序的进行, 以免产生错误。通常情况要在Linux系统里提前安装gcc和python3.x, 在多机集群环境运行, 还应提前对防火墙SSH进行设置。

(一) 安装和测试MPICH和mpi4py

在Python下的并行编程需要用到MPICH和mpi4py。MPICH提供原始的MPI接口, mpi4py则是一个Python的库, 所以使用mpi4py则首先要正确编译和安装MPICH的动态库。MPICH和mpi4py源程序均可从各自的官网地址中下载, 并按照官方指导进行本地编译。

(二) 安装并设置HDF5和h5py

HDF5文件格式作为目前科学计算中使用较为广泛的数据格式, 要对其进行操作则必须要安装相应的软件。从HDF的官方网站下载源代码压缩包, 目前最新的版本为HDF5-1.10.1, 在解压缩后进入该目录执行配置、编译和安装。需要注意的是, 若要使用并行HDF5在编译的时候--enable-parallel和--enable-shared这两个参数必须要加上。同时为了避免后期运行时产生缺少头文件的错误, 还需单独安装2个和HDF5相关的包:libhdf5-serial-dev和hdf5-helpers。完成以上安装后可以使用h5pcc--showconfig命令测试是否安装正确。

由于Python不能直接调用HDF5, 所以还需要安装h5py库来调用HDF5的数据操作。

四、HDF5数据并行处理

以行的方式, 并行读取HDF5文件中的数据集 (dset) 后写入空的数据集 (newdset) 中。如图2所示, 假定dset.dims[0]=8, 即一共有8行数据;numproc=4, 即运行程序的处理器数量为4个。那么按照处理器数量划分任务区块得到的结果为ranklen=2, 即平均每2行数据分配给一个处理器进行处理。

进一步细分读取任务:

1号处理器负责读取整个文件中第1、2行的数据: (offsetstart=0, offsetend=2)

2号处理器负责读取整个文件中第3、4行的数据: (offsetstart=2, offsetend=4)

3号处理器负责读取整个文件中第5、6行的数据: (offsetstart=4, offsetend=6)

4号处理器负责读取整个文件中第7、8行的数据: (offsetstart=6, offsetend=8)

五、台湾新北海域数据处理实例

现要对Nasa Ocean Color海洋亮温产品 (Aqua MODIS Sea Surface Temperature 11μdaytime Daily 4km) 数据进行数据提取和可视化图像生成。Nasa Ocean Color海洋亮温产品的数据文件采用HDF5格式。单个处理任务首先对2013年全年的每个单天全球海洋温度数据进行提取,

其中d表示年度天数, 矩阵表示每个数据点的温度值。再遍历矩阵中每个数据点的值, 根据所选取的颜色样式将数据矩阵转换为可视化的图像矩阵。

程序首先设定启用的cpu数量, 调度程序记录当前处理进度, 并在未处理完365个数据文件时持续给每个cpu分派处理任务。处理所有文件所需的时间如下图所示:

对以上数据计算出cpu加速比, 如下图所示:

六、总结展望

本文首先通过介绍HDF5和并行处理, 其次采用分层推进探索的方式, 主要描述了基于h5py和mpi4py的HDF5数据并行处理的方法, 最后结合实例说明其并行处理的有效性。该方法不但可降低科研人员使用并行计算处理HDF5数据的门槛, 而且具有较高的处理效率。

摘要:随着层次性数据格式的不断发展, HDF5已经成为一种研究数据存储的通用格式之一。然而受限于HDF5数据文件通常包含大量的数据集这一现状, 普通串行处理的方式逐渐不能满足数据处理的要求。本文通过介绍HDF5数据和并行计算的基础, 结合目前流行的数据处理语言Python以及广泛应用于并行计算和HDF5处理的两个软件包——mpi4py和h5py, 探索了一种新的对HDF5数据并行计算的方式, 该方式具有计算简单、效率高的特点。

关键词:并行计算,HDF5,h5py,mpi4py

参考文献

[1] 王永韬, 刘良明. HDF5格式特点及其对遥感数据格式标准化的几点启示[J].国土资源遥感, 2005, 17 (3) :39-43.

[2] Collette A. Python and HDF5:Unlocking Scientific Data[M].“O’Reilly Media, Inc.”, 2013.

[3] 张若愚. Python科学计算[M].清华大学出版社, 2012.

[4] https://support.hdfgroup.org/HDF5/Tutor/HDF5Intro.pdf.

[5] http://malagis.com/about-hdf.html.

[6] https://pypi.python.org/pypi/mpi4py.

[7] http://pythonhosted.org/mpi4py/usrman/install.html#usingdistutils.

[8] https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/INSTALL_parallel.

[9] http://docs.h5py.org/en/latest/mpi.html.

[10] https://github.com/h5py/h5py.

[11] Collette A. Python and HDF5:Unlocking Scientific Data[M].“O’Reilly Media, Inc.”, 2013.

[12] 刘洋, 关庆锋.景观指数的并行计算方法[J].地球信息科学学报, 2017, 19 (4) :457-466.

[13] 陶晓玲, 韦毅, 王勇.一种基于本体的并行网络流量分类方法[J].电子科技大学学报, 2016, 45 (3) :417-422.

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:超低渗透储层开发技术对策研究下一篇:引滦工程综合信息管理系统开发