生物医学网络科学Biomedical Network Science
研究问题、可复现分析与敏感性分析04 / 16

计算环境与工作流

阅读
约 2 分钟

同一段代码在不同的软件版本下可能给出不同的结果:默认参数会变,算法实现会改,随机数生成器也可能改变。Burger 等(2023)在心理网络报告规范中专门指出,软件包的估计默认值会随版本更新而改变,因此即使使用默认参数也要报告参数和版本。

四个层次

层次 工具举例 解决的问题 局限
记录版本 pip freeze、sessionInfo()、运行清单 知道用的是什么版本 不保证能重新装出来
锁定依赖 requirements.txt(精确版本)、conda environment.yml 与锁定文件、R 的 renv.lock 可以重建相同的包集合 依赖操作系统和底层库
容器 Docker、Apptainer/Singularity(高性能计算集群常用) 连同操作系统和系统库一起打包 镜像体积大;硬件差异仍可能带来浮点差异
工作流管理 Make、Snakemake、Nextflow 记录步骤之间的依赖关系,只重跑受影响的步骤 需要学习成本

Boettiger(2015)介绍了用 Docker 打包研究计算环境的做法;Grüning 等(2018)针对生命科学提出了组合使用包管理器(如 Bioconda)、容器和工作流系统的分层方案。对于大多数网络分析项目,“精确锁定版本的环境文件 + Git + 一个能从原始数据跑到最终图表的主脚本(或 Makefile)”已经足够;需要在集群或跨机构复算时,再加上容器。

让代码可以被检验

  • 小型测试:对关键函数写断言,例如“三角形图的平均聚集系数等于 1”“度保持随机化后度序列不变”。
  • 持续集成(continuous integration, CI):在代码托管平台上每次提交时自动在干净环境中运行测试,相当于定期做一次“别人能不能跑起来”的检查。
  • 代码审阅:请合作者在自己的机器上按 README 运行一遍。

The Turing Way 手册的“可复现研究指南”系统覆盖了版本控制、许可、研究数据管理、可复现环境、代码文档与测试、代码审阅、持续集成、用 Make 组织流程和研究纲要等主题,可作为实践手册查阅。

浮点结果的“可复算”应以容差为准。不同的 CPU、BLAS 库或并行线程数可能导致矩阵求逆、特征分解结果在末位不同;对接近阈值的边,这种差异甚至会改变边是否存在。复算时应比较数值是否在合理容差内一致,并检查结论(而不是逐字节输出)是否改变。