第16章 命令行界面

入门 操作指南

OGGM的命令行界面(CLI)是面向最终用户的主要交互接口。通过cli/目录下的一组模块,用户无需编写Python代码即可完成从数据下载到全球冰川模拟的完整工作流。本章详细解析CLI的架构设计、主要命令、配置机制和HPC部署模式。

16.1 CLI架构:入口点与模块组织

16.1.1 pyproject.toml入口点注册

OGGM使用PEP 621标准的pyproject.toml注册CLI入口点。每个CLI命令对应一个[project.scripts]条目:

[project.scripts]
oggm_prepro = "oggm.cli.prepro_levels:main"
oggm_benchmark = "oggm.cli.benchmark:main"

当用户执行oggm_prepro时,Python调用oggm.cli.prepro_levels.main()函数。这种设计遵循了Python打包的最佳实践,保证了跨平台的兼容性。

16.1.2 CLI模块清单

模块命令用途
prepro_levels.pyoggm_prepro主力常用预处理管线(L0-L5)
benchmark.pyoggm_benchmark性能基准测试

16.2 oggm_prepro:主力常用CLI

oggm_prepro是OGGM最重要(也最复杂)的命令行工具。它将第15章讨论的5级预处理管线暴露为一系列命令行参数。

16.2.1 基本调用结构

oggm_prepro \
  --rgi-reg 01 \                    # RGI区域编号
  --rgi-version 6 \                 # RGI版本
  --map-border 160 \                 # 周围边距(像素)
  --start-level 0 \                 # 起始预处理级别(prepro level)
  --max-level 4 \                   # 最大运行级别
  --working-dir /path/to/wd \       # 工作目录
  --output-dir /path/to/out         # 输出目录

16.2.2 五级管线参数

--start-level--max-level定义了管线执行的起止范围。完整流程为L0→L1→L2→L3→L4→L5:

级别执行内容关键输出文件
L0RGI初始化,gdir创建glacier_grid.json
L1DEM裁剪,冰川掩膜gridded_data.nc, glacier_mask.tif
L2完整GIS预处理链centerlines.pkl, geometries.pkl
L3气候数据+MB校准+反演inversion_output.pkl, climate_historical.nc
L4历史模拟运行model_diagnostics.nc, model_flowlines.nc
L5清理中间文件仅保留最终输出

16.2.3 完整CLI参数表

参数类型默认值说明
--rgi-regstrOGGM_RGI_REG envRGI区域编号(如"01"代表Alaska)
--rgi-versionint6RGI版本(6或7)
--map-borderint160冰川周围扩展像素数(越大越"安全"但对DEM而言更贵)
--start-levelint0起始预处理级别(prepro level)
--max-levelint5最大运行级别
--start-base-urlstrNone恢复归档的URL(增量重启)
--working-dirstrOGGM_WORKDIR env工作目录路径
--output-dirstrOGGM_OUTDIR env输出目录路径(与workdir可分离)
--dem-sourcestr配置默认DEM源(ALL, STANDARD, 或特定代码如"COPDEM")
--elev-bandsflagFalse使用elevation bands流线方法(默认为中心线方法)
--centerlinesflagTrue使用中心线方法(默认启用)
--mb-calibration-strategystrinformed_threestepMB校准策略:informed_threestep, melt_temp, temp_melt
--add-consensus-thicknessflagFalse添加Farinotti共识冰厚数据
--add-itslive-velocityflagFalse添加ITS_LIVE表面速度数据
--add-millan-thicknessflagFalse添加Millan冰厚估计数据
--add-hugonnet-dhdtflagFalse添加Hugonnet高程变化率数据
--dynamic-spinupstrNone动态预热(dynamic spinup)策略(area/dmdtda, volume/dmdtda)
--override-paramsstrNoneJSON字符串覆盖默认参数

16.2.4 流线方法选择

OGGM提供两种流线提取方法,通过--elev-bands--centerlines互斥标志选择:

选择建议 对于数量少于1000条冰川的详细研究,首选中心线方法(默认)。对于全球尺度的快速扫描或敏感性分析,高程带方法能显著加速。两种方法在L3及以后级别的计算时间差异可达5-10倍。

16.2.5 物质平衡校准策略

--mb-calibration-strategy控制温度敏感度参数mu*的校准方式:

策略算法适用场景
informed_threestep三步信息校准(默认)标准正式运行,有大地测量MB数据
melt_temp融化温度法简化校准,备选方案
temp_melt温度融化法另一备选方案

16.3 环境变量与配置交互

OGGM CLI的参数解析遵循明确的优先级:

CLI显式参数 > 环境变量 > params.cfg配置文件 > 内置默认值

五个核心环境变量:

变量作用
OGGM_RGI_REG默认RGI区域编号
OGGM_MAP_BORDER默认地图边距
OGGM_WORKDIR默认工作目录
OGGM_OUTDIR默认输出目录
OGGM_EXTRACT_DIR临时解压目录

复合参数通过--override-params传入JSON字符串覆盖params.cfg中的任意值:

oggm_prepro --override-params '{"mp_processes": 8, "use_multiple_flowlines": false}' \ ...
参数覆盖注意事项 --override-params提供的JSON会与params.cfg进行浅层合并。嵌套配置项(如"climate": {"temp_use_gradient": true})可能需要完整提供嵌套对象。建议在运行前用oggm.cfg.log_params()验证最终生效的参数。

16.4 增量处理与恢复

--start-base-url是工业化生产的关键参数。它允许从远程URL加载前一个预处理级别(prepro level)的tar存档,实现断点恢复:

# 首次运行L0-L2
oggm_prepro --start-level 0 --max-level 2 ...

# L2完成后,从L2存档恢复,继续L3-L5
oggm_prepro --start-level 3 --max-level 5 \
  --start-base-url https://cluster.unibe.ch/prepro/RGIv6/L2/RGI01_L2.tar.gz ...

这种设计将耗时的工作流分解为可独立调度、可故障恢复的阶段。在SLURM集群中,每个级别可以提交为独立的job array,充分利用作业调度系统的容错能力。

16.5 oggm_benchmark:性能基准测试

cli/benchmark.py提供了一个标准化的性能测试工具。它定义了一条13任务的线性管线,在恒定气候和随机气候两种条件下各运行250年:

benchmark_tasks = [
    tasks.define_glacier_region,
    tasks.glacier_masks,
    tasks.compute_centerlines,
    tasks.initialize_flowlines,
    tasks.compute_downstream_line,
    tasks.compute_downstream_bedshape,
    tasks.catchment_area,
    tasks.catchment_intersections,
    tasks.catchment_width_geom,
    tasks.catchment_width_correction,
    tasks.process_climate_data,
    tasks.local_mustar,
    tasks.run_random_climate,  # 或 run_constant_climate
]

对每个任务,benchmark记录执行时间并输出CSV格式的计时报告。constant_climate模式使用不变的气候(适合测试模型物理),random_climate模式使用随机生成的气候序列(适合测试模型对气候变率的响应)。

16.6 HPC部署模式

16.6.1 SLURM Job Array模式

RGI的19个一级区域天然适合SLURM job array:

#!/bin/bash
#SBATCH --job-name=oggm_prepro
#SBATCH --array=1-19
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16

export OGGM_WORKDIR=/scratch/oggm_work
export OGGM_OUTDIR=/scratch/oggm_output

oggm_prepro \
  --rgi-reg $(printf "%02d" $SLURM_ARRAY_TASK_ID) \
  --start-level 0 \
  --max-level 5

每个数组任务处理一个RGI区域,16个CPU核心用于multiprocessing。19个任务可以并行提交(取决于集群资源限制),总吞吐量受限于最慢的区域(通常是区域19,南极外围冰川)。

16.6.2 MPI多节点模式

对于单个大型RGI区域(如Alaska有超过27000条冰川),单节点16核可能不够。此时可以启用MPI跨节点并行:

#!/bin/bash
#SBATCH --job-name=oggm_mpi
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16

mpirun -np 64 python -c "
from oggm import workflow
# ... 设置RGI区域 ...
workflow.execute_entity_task(task, gdirs)
"

16.7 典型工作流示例

单冰川快速测试

# 仅处理RGI60-11.00897(Hintereisferner)
oggm_prepro \
  --rgi-reg single \
  --start-level 0 --max-level 5 \
  --working-dir ./test_wd

区域处理(Alaska)

oggm_prepro \
  --rgi-reg 01 --rgi-version 6 \
  --map-border 160 \
  --dem-source COP30 \
  --start-level 0 --max-level 4

动态预热(dynamic spinup)校准

oggm_prepro \
  --rgi-reg 11 --rgi-version 6 \
  --dynamic-spinup volume/dmdtda \
  --start-level 3 --max-level 4 \
  --add-consensus-thickness

多区域集合

for reg in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19; do
  oggm_prepro --rgi-reg $reg --start-level 0 --max-level 5 &
done
wait
业务化运行环境建议 在业务化运行环境中运行全球19个RGI区域时,预计需要数百GB的磁盘空间和数千CPU小时。强烈建议:(1) 在集群上使用job array而非本地循环;(2) 启用等级存档,每个级别结束后立即压缩;(3) 在运行前检查磁盘配额和inode限制。

16.8 小结

OGGM的CLI层将强大的科学计算能力封装为直观的命令行参数。从简单的单冰川测试到全球19个区域的分布式处理,oggm_prepro提供了统一的界面。理解其参数体系、环境变量优先规则和增量恢复机制,是在HPC环境中高效使用OGGM的前提。

上一章:第15章 工作流管线 下一章:第17章 MPI并行计算