0%

物理海洋大数据云计算入门-Pangeo

背景

前面已经提到云计算平台pangeo,很多人了解GEE、航天宏图PIE、AWS(亚马逊)、谷歌云地球科学服务等,但pangeo云还是第一听说。小编查阅网络发现,中文资料为零,说明中国的用户确实较少。然而,pangeo云在美欧已发展多年,相关分析工具和云计算已经较为成熟,在地球科学领域,特别是物理海洋领域已经取得很多研究成果。因为这是不错的小众云计算平台,所以特此介绍。今天先聊pangeo入门。

pangeo是由一群草根科学家自发组织的地学大数据云计算系统,它在2016年由美国哥伦比亚大学Ryan Abernathey 领导的一个物理海洋小组发起,最初是希望更好处理海洋科学大数据,例如MITgcm高分辨模式LLC4320的PB级别数据。通过数年时间,大批参与者通过github平台发展了一系列的大数据和云计算分析软件,搭建了pangeo云计算基础设施,形成了良好的科学生态系统(如JupyterHub、dask、xarray、intake、Zarr等)。这几年,pangeo云计算已在一定程度上改变了地球科学的研究方式,它提高了科学生产力,使研究结果可重复,也为数据密集型问题的研究打开新大门。

pangeo得到了美国NSF EarthCube计划、Anaconda、NASA、NCAR以及一些私人基金会的强力资助,使之能够持续发展。目前pangeo为全世界用户免费提供云计算服务(最大16CPU,60G内存)。

云计算和传统科研模式的区别

我们先欣赏下传统的数据下载模式,以著名的欧洲Climate Data Store (CDS) 分发ECMWF ERA5资料为例,视频是CDS数据中心的机器人插卡作业模式,如果你申请这里的数据,机器人的机械手臂会把磁带接口插入相关卡槽读取数据,完成后再提供下载服务:

Climate Data Store (CDS) @ECMWF的机器人插卡作业模式

云计算离不开云数据。pangeo将大量数据存储于商业云平台,并购买数据中心附近的计算机算力资源,由这些算力来计算靠近它的云数据,因此数据读相当快。而云计算的计算能力则和费用相关。由于pangeo为免费服务,因此算力不能和超算媲美,但通过结合dask集群,计算能力足够强大。

Pangeo云架构:

注册使用

因为是云计算,需要注册一个账号。

https://pangeo.io/cloud.html

Pangeo Cloud目前包含两个不同的计算集群:

  • us-central1-b.gcp.pangeo.io 谷歌云平台。
  • aws-uswest2.pangeo.io AWS集群。

建议根据您要访问的数据选择集群。例如,如果您的数据主要存在于AWS中,请选择aws-uswest2。经Pangeo管理员审查同意之后,加入Pangeo的Github小组,便可以使用Pangeo云。(需要有一个Github账号,并对Git有一定的了解)

Pangeo Cloud集群为用户提供不同数量的RAM和CPU,可以在登录时进行设置。请为根据工作需要选择资源最少的设施,因为更大的内存和cpu会花费更多的钱。 是的,云计算本质上是收费服务,这部分钱由美国NSF等基金支付了。

云数据初探

几十年来,地球科学领域一直采用“下载模式”分析数据,即科学家从远程FTP服务器下载数据到个人电脑。而Pangeo的理念是将计算带到云数据中,这也就是云计算。Pangeo提供靠近高性能存储的高性能计算集群,目前许多广泛使用的数据集已经存储在这些云上。

如果对分析特定的大型数据集感兴趣,应该首先确定此数据集是否已存储在现有的云端,然后,可以请求访问该特定云数据以执行计算分析。或者,如果您的实验室或小组已经维护了一个数据存储库,也可以考虑在本地计算资源上部署Pangeo环境数据服务器(可能比较费力)。

使用云数据和云计算无需掌握很多特殊知识,但需要能够熟练使用一下基础工具:

  • Jupyter Hub
  • Python
  • Xarray

当前,许多预存数据集目录都位于catalog.pangeo.io。此目录已预先配置,包含海洋、大气、气候和水文等不同类型数据。在大多数情况下,调取云数据很简单:

1
2
3
4
from intake import open_catalog

cat = open_catalog("https://raw.githubusercontent.com/pangeo-data/pangeo-datastore/master/intake-catalogs/master.yaml")
list(cat)

[‘ocean’, ‘atmosphere’, ‘climate’, ‘hydro’]

这些数据集合中包含了CESM全球气候模式、NCAR数据集、CCMP、极地数据、Landsat8数据、CMIP6、卫星测高沿轨和网格数据、MOM6/CESM、MITgcm ECCOv4、LLC4320、ESIP等资料。

此外,还可以利用fsspec打开目录之外的数据,例如,要从Google Cloud Storage打开公共文件cmpi6,您可以执行以下操作:

1
2
3
4
5
import pandas as pd
import fsspec
path = 'gs://cmip6/cmip6-zarr-consolidated-stores.csv'
with fsspec.open(path) as f:
df = pd.read_csv(f)

物理海洋数据集

物理海洋数据集是pangeo的重点,通过命令open_catalog可以很方便的打开它,该数据集合包含了多种常见的数据,比如卫星高度计的沿轨和网格数据、多种高分模式数据等,还有前面提到的MITgcm LLC4320模式数据。LLC4320数据由于存储巨大,它几乎只能在超级计算机或者Pangeo云端使用。

1
2
cat = open_catalog("https://raw.githubusercontent.com/pangeo-data/pangeo-datastore/master/intake-catalogs/ocean.yaml")
list(cat)

[‘sea_surface_height’,
‘cesm_mom6_example’,
‘ECCOv4r3’,
‘SOSE’,
‘GODAS’,
‘ECCO_layers’,
‘altimetry’,
‘LLC4320’,
‘GFDL_CM2_6’,
‘CESM_POP’,
‘channel’,
‘MEOM_NEMO’]

我们先用简单的SSH数据为例,介绍怎么读取、制图、计算和保存。
读取命令为to_dask(),这一步为lazy计算,并未真的计算:

1
2
ds  = cat["sea_surface_height"].to_dask()
ds

SSH数据中包含了sla、adt、流速等信息。

看一下sla的数据结构和大小,超过68G:

这时候数据已经是常见的xarray格式,通过isel选择一个时间:

1
ds.sla.isel(time=0)

使用xarray的.plot()函数进行绘图,这时候数据才真正的调入内存:

1
ds.sla.isel(time=0).plot(figsize=(15, 7))

1
ds.sla.sel(time="1993-01-07",latitude=slice(-60,-20),longitude=slice(0,50)).plot()

使用xarray的to_netcdf()保存nc数据格式到本地。通常我们只保存数据计算结果,原始数据和中间数据的保存没有太大意义。

1
ds.sel(time="1993-01-07",latitude=slice(-60,-20),longitude=slice(0,50)).to_netcdf("ssh.nc")

大数据并行计算

上面仅展示单独数据文件的读取、绘图和保存,数据体积小,无需大数据的相关并行运算。如果数据量较大,比如使用全部的sla数据计算全球海平面变化,则一共需要读取68G的数据,这时候可能需要集群的并行计算配置。pangeo通过融合dask可以实现集群计算。

Dask 是 Pangeo Cloud 的重要组件,可用于并行化的大型计算。pangeo用户无需太多并行计算知识即可使用它,但由于Dask能够使用许多云计算节点,大型、长时间运行、空闲的集群将会浪费Pangeo有限的云计算资金。因此请谨慎使用此力量!

要使用Dask进行可扩展计算,您需要使用Dask Gateway创建一个集群并连接到它

1
2
3
4
5
6
from dask_gateway import GatewayCluster
from dask.distributed import Client
cluster = GatewayCluster()
cluster.scale(5)
client = Client(cluster)
cluster

完成计算后,您可以显式关闭集群

1
cluster.close()
dask监控界面

海平面变化时间序列

计算全球海平面变化并不复杂,主要是均值的计算。首先沿着经纬度计算均值,并载入内存:

1
sla_timeseries = ds.sla.mean(dim=('latitude', 'longitude')).load()

该集群计算启动了5个worker,10个线程,大约1分半处理完数据,计算得到全球的平均海平面变化时间序列:

绘图:

1
2
3
4
5
6
sla_timeseries.plot(label='full data')
sla_timeseries.rolling(time=365, center=True).mean().plot(label='rolling annual mean')
plt.ylabel('Sea Level Anomaly [m]')
plt.title('Global Mean Sea Level')
plt.legend()
plt.grid()

本质上,SSH数据并不算大数据,只是比较大。这里仅展示其工作流程。

纬向变化时间特征

还可以计算纬向SLA变化,即在经度方向计算均值,耗时大约2分钟:

1
2
3
4
sla_hov = ds.sla.mean(dim='longitude').load()
fig, ax = plt.subplots(figsize=(12, 4))
sla_hov.name = 'Sea Level Anomaly [m]'
sla_hov.transpose().plot(vmax=0.2, ax=ax)

我们可以看到海平面变化的纬向特征:

空间变化特征

可以通过STD来计算全球海平面变化的空间特征:

1
2
3
4
sla_std = ds.sla.std(dim='time').load()
sla_std.name = 'Sea Level Variability [m]'
ax = sla_std.plot(figsize=(20, 12))
_ = plt.title('Sea Level Variability')

在流场较强的海域,variability是比较大的,比如西边界流、南极绕极流等:

KE计算

接下来,以南大洋绕极流为例,计算KE的长时间平均,这里的计算稍微加强一点,但也不复杂:

1
2
3
4
5
6
7
ds_SO = ds.sel(latitude=slice(-90, -30))
meanSSH = ds_SO.adt.mean('time')
meanSSH.load()
EKE = 0.5*(ds_SO.ugosa**2 + ds_SO.vgosa**2).mean('time') # KE
EKE.load()
MKE = 0.5*( (ds_SO.ugos - ds_SO.ugosa)**2 + (ds_SO.vgos - ds_SO.vgosa)**2).mean('time') # MKE (mean)
MKE.load()

绘图:

1
2
3
plt.figure(figsize=(16,5))
np.log10(EKE).plot.contourf(vmin=-3.5, vmax=-0.7, levels=10)
meanSSH.plot.contour(levels=15, linewidths=0.75)

1
2
3
plt.figure(figsize=(16,5))
np.log10(MKE).plot.contourf(vmin=-3.5, vmax=-0.7, levels=9)
meanSSH.plot.contour(levels=15, linewidths=0.5)

小结

通过注册,得到一个有效的云计算账户,然后初次尝试pangeo计算全球海平面变化,以及局部海域的动量特征,我们可以总结它的特色为:

  • 降低大数据编程的精力投入,增强宏观科学问题的思考
  • 降低集群分析门槛,无需专门的并行计算和云计算知识
  • 无需数据下载,按需调取海量云数据集
  • 开源支持,生态系统完备可持续

目前,GEE等云计算和大数据平台已经较为普及,但GEE等平台专注于图像遥感,无法接入物理海洋、大气科学等数据(模式和观测等)。pangeo云计算则在一定程度填补了这些空白,它发源于草根群体,在美国一步步发展壮大,获得NSF等机构数百万美元的资助,得到了美国政府和科学界的认可,小编认为这必然是未来海洋、大气科学的重点发展方向之一。国内在该领域暂时是空白的(大部分人无法访问pangeo和谷歌云服务),未来几年国内将可预见的在海洋、大气云计算领域快速增长。

下节预告

  • 基于云计算的LLC4320海洋模式数据谱分析