如何对科学数据处理工具进行标记以确保可重复性

5
我们开发了一个数据处理工具,可以从给定的原始数据中提取一些科学结果。在数据科学中,能够重新获得结果并重复导致结果集的计算非常重要。
由于该工具正在不断发展,我们需要找到一种方法来确定哪个修订版本/构建版本生成了给定的结果集,并找到生成该工具的相应源代码。
该工具是用C++和Python编写的,使用Boost::Python将C++部分粘合在一起。我们使用CMake作为构建系统,在Linux上生成Make文件。目前,项目存储在子版本库中,但我们中的一些人已经在使用git resp. hg,并计划在不久的将来将整个项目迁移到其中之一。
在这种情况下,获取源代码、二进制文件和结果集之间的唯一映射的最佳实践是什么?
我们已经讨论过的一些想法: - 在全局注入修订号 - 使用构建号生成器 - 将整个源代码存储在可执行文件内
2个回答

3
这是一个我花费了相当多时间研究的问题。除了@VonC已经写过的,让我补充一些想法。
我认为软件配置管理的主题在商业环境中得到了很好的理解和精心实践。然而,在许多科学数据处理环境中,这种普遍方法常常缺乏,其中许多要么仍处于学术界,要么已经脱离了学术界。但是,如果您处于这样的工作环境中,就有可靠的信息和建议来源以及大量的工具可供使用。我不会进一步扩展此内容。
我认为即使可行,将整个源代码包含在可执行文件中也是不必要的。事实上,如果您正确地使用SCM,那么您已经完成并继续完成的其中一个关键测试是您能够按需重建“旧”可执行文件。您还应该能够确定每个可执行文件和版本中使用的源代码修订版。这些应该使将源代码包含在可执行文件中变得不必要。
将结果集与计算绑定的主题也是至关重要的。以下是我们正在构建的解决方案的一些组成部分:
我们正在从许多科学程序输出的传统非结构化文本文件转向结构化文件,对于我们来说,我们正在查看HDF5和XML,其中存储了感兴趣的数据和元数据。元数据包括用于生成结果的程序(和版本)的标识、输入数据集的标识、作业参数和一堆其他内容。
我们考虑使用DBMS来存储我们的结果;我们想走这条路,但我们今年没有资源去做,可能明年也不行。但是企业出于各种原因使用DBMS之一就是它们提供回滚、提供审计跟踪等功能。
我们还密切关注需要存储哪些结果集。一个好的方法是仅存储从我们的现场传感器捕获的原始数据集。不幸的是,我们的一些计算需要花费数千个CPU小时才能产生,因此无法按需重新生成它们ab-initio。然而,将来我们将存储比过去少得多的中间数据集。
我们还使用户更难(我希望是不可能的,但我不确定我们是否已经到达那里)直接编辑结果集。一旦有人这样做,所有的溯源信息都是错误和无用的。
最后,如果您想阅读更多关于此主题的内容,请尝试在Google上搜索“科学工作流”和“数据溯源”等类似主题。
编辑:从我上面写的内容不清楚,但我们已经修改了我们的程序,使它们包含自己的标识(我们使用Subversion的关键字功能进行此操作,并使用我们自己的扩展)。并将其写入它们产生的任何输出中。

1

你需要考虑 git子模块hg子仓库

在这种情况下,最佳实践是拥有一个父仓库,它将引用:

  • 工具的源代码
  • 从该工具生成的结果集
  • 理想情况下是C++编译器(不会每天都发展)
  • 理想情况下是Python分发(不会每天都发展)

每个组件都是一个独立的仓库(Git或Mercurial)。
父仓库将引用每个组件的一个精确版本。

整个过程代表了一种基于组件的方法,并且在充分使用SCM(此处为软件配置管理)方面非常关键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接