在国产超算上从零部署CESM2.1.3:我的三天踩坑实录与完整配置文件分享
国产超算环境CESM2.1.3部署实战:关键配置与问题解决全记录
1. 环境准备与源码获取
在国产超算环境中部署CESM(Community Earth System Model)需要面对特殊的网络环境和模块管理系统。不同于常规Linux服务器,超算平台通常存在以下特征:
- 受限的网络访问:GitHub等外部代码仓库可能无法直接访问
- 模块化软件管理:依赖库通过
module load方式加载 - 非标准目录结构:输入数据和临时文件存储位置有特殊规范
1.1 源码下载的变通方案
由于直接git clone官方仓库经常失败,可采用分步下载策略:
# 先下载主仓库(可能需多次尝试) git clone -b release-cesm2.1.3 https://github.com/ESCOMP/CESM.git my_cesm_sandbox # 修改Git配置解决SSL问题 git config --global http.sslVerify false git config --global url."https://".insteadOf git://组件下载失败的典型报错及处理:
ERROR: Command '[u'git', u'clone', u'--quiet', u'https://github.com/ESCOMP/ctsm/', u'clm']' returned non-zero exit status 128此时应进入my_cesm_sandbox目录手动执行:
./manage_externals/checkout_externals -S1.2 模块环境配置
超算平台通常预装Intel编译器和MPI环境,需在~/.bashrc中固化模块加载命令:
# 基础环境配置 module purge module load compiler/intel/2017.5.239 module load mpi/hpcx/2.7.4/intel-2017.5.239 module load mathlib/netcdf/intel/4.4.1 module load mathlib/pnetcdf/intel/1.12.1关键检查点:
# 验证编译器 mpiicc --version # 验证NetCDF ncdump --version2. 机器配置文件深度定制
2.1 config_machines.xml核心参数
以下为经过验证的国产超算适配配置(关键部分):
<machine MACH="CAS-ESM"> <NODENAME_REGEX>login04</NODENAME_REGEX> <COMPILERS>intel</COMPILERS> <MPILIBS>intelmpi</MPILIBS> <CIME_OUTPUT_ROOT>${HOME}/cesm/scratch</CIME_OUTPUT_ROOT> <DIN_LOC_ROOT>${HOME}/cesm/inputdata</DIN_LOC_ROOT> <MAX_TASKS_PER_NODE>24</MAX_TASKS_PER_NODE> <module_system type="module"> <modules compiler="intel"> <command name="load">compiler/intel/2017.5.239</command> <command name="load">mpi/hpcx/2.7.4/intel-2017.5.239</command> </modules> </module_system> </machine>2.2 常见配置陷阱
NODENAME_REGEX匹配问题:
- 必须确保正则表达式能匹配计算节点和登录节点主机名
- 错误配置会导致
Expected one child报错
default_run_suffix陷阱:
- 新版CESM要求严格XML格式,删除此标签可避免解析错误
环境变量优先级:
$CIME_OUTPUT_ROOT等路径变量会覆盖case设置- 建议使用
$ENV{HOME}替代绝对路径
3. 编译系统配置实战
3.1 config_compilers.xml优化
针对Intel编译器的最佳实践配置:
<compiler COMPILER="intel" MACH="CAS-ESM"> <FFLAGS> <base>-qno-opt-dynamic-align -convert big_endian -assume byterecl</base> <append DEBUG="FALSE">-O2 -debug minimal</append> </FFLAGS> <SLIBS> <append MPILIB="intelmpi">-mkl=cluster</append> </SLIBS> </compiler>3.2 编译问题诊断
典型错误及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
undefined reference | 库链接顺序错误 | 在SLIBS中添加-mkl=cluster |
File format not recognized | 编译器版本不匹配 | 统一使用Intel 2017工具链 |
MPI_Init_thread失败 | MPI环境冲突 | 执行module purge后重新加载 |
4. 案例创建与验证
4.1 创建测试案例
通过验证的创建命令:
./create_newcase \ --case FHIST_f19 \ --res f19_f19 \ --compset FHIST \ --compiler intel \ --mach CAS-ESM \ --run-unsupported4.2 常见创建错误处理
XML验证失败:
xmllint --noout --schema $CIMEROOT/config/xml_schemas/config_machines.xsd config_machines.xml机器未识别:
- 确保
config_machines.xml位于~/.cime/或$CIMEROOT/config/cesm/machines/ - 检查
NODENAME_REGEX与实际主机名匹配
- 确保
批处理系统配置:
- 无作业调度系统时应设置
<BATCH_SYSTEM>none</BATCH_SYSTEM> - 错误配置会导致
no element found解析错误
- 无作业调度系统时应设置
5. 性能调优与稳定性保障
5.1 超算环境特有优化
内存管理:
<environment_variables> <env name="OMP_STACKSIZE">256M</env> </environment_variables> <resource_limits> <resource name="RLIMIT_STACK">-1</resource> </resource_limits>并行配置建议:
MAX_TASKS_PER_NODE不超过物理核心数- 实际运行时
ntasks应为节点数的整数倍
5.2 长期运行保障措施
输入数据管理:
- 将常用输入数据缓存到
$DIN_LOC_ROOT - 定期清理
$CIME_OUTPUT_ROOT中的临时文件
- 将常用输入数据缓存到
模块版本固化:
# 记录当前环境模块版本 module list > cesm_modules.versions日志监控要点:
- 检查
cesm.log.$LID中的内存泄漏警告 - 关注
OMP_STACKSIZE相关错误
- 检查
6. 完整配置文件参考
config_machines.xml(精简版)
<?xml version="1.0"?> <config_machines version="2.0"> <machine MACH="CAS-ESM"> <NODENAME_REGEX>login\d+</NODENAME_REGEX> <COMPILERS>intel</COMPILERS> <MPILIBS>intelmpi</MPILIBS> <CIME_OUTPUT_ROOT>$ENV{HOME}/cesm_output</CIME_OUTPUT_ROOT> <MAX_TASKS_PER_NODE>24</MAX_TASKS_PER_NODE> <module_system type="module"> <modules compiler="intel"> <command name="load">compiler/intel/2017.5.239</command> <command name="load">mathlib/netcdf/intel/4.4.1</command> </modules> </module_system> </machine> </config_machines>config_compilers.xml(关键片段)
<compiler COMPILER="intel" MACH="CAS-ESM"> <MPIFC>mpiifort</MPIFC> <SFC>ifort</SFC> <SLIBS> <append MPILIB="intelmpi">-mkl=cluster</append> </SLIBS> </compiler>在国产超算这类特殊环境中,CESM部署成功的关键在于准确识别平台特性并针对性调整配置。经过三天的问题排查,最深刻的体会是:超算环境的差异性远大于文档假设,必须通过实际测试验证每个配置项的有效性。特别是NODENAME_REGEX和模块加载顺序这类看似简单的设置,往往成为阻碍成功的"最后一公里"。
