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

Ber*_*ler 5 version-control build-process cmake scientific-computing

我们开发了一个数据处理工具,从一组给定的原始数据中提取一些科学结果.在数据科学中,您可以重新获得结果并重复计算,从而产生结果集非常重要

由于该工具正在发展,我们需要一种方法来找出我们的工具的哪个版本/构建生成给定的结果集以及如何找到构建工具的相应源.

该工具是用C++和Python编写的; 使用Boost :: Python将C++部分粘合在一起.我们使用CMake作为构建系统,为Linux生成Make文件.目前该项目存储在subversion repo中,但是我们中的一些人已经使用了git resp.hg,我们计划在不久的将来将整个项目迁移到其中一个项目.

在这样的场景中,获得源代码,二进制和结果集之间的唯一映射的最佳实践是什么?

我们已经在讨论的想法:

  • 以某种方式注入全局修订号
  • 使用内部版本号生成器
  • 将整个源代码存储在可执行文件本身中

Hig*_*ark 3

这是我花了相当多时间来解决的一个问题。对于 @VonC 已经写的内容,让我补充一些想法。

我认为软件配置管理的主题很好理解,并且经常在商业环境中仔细实践。然而,这种通用方法在科学数据处理环境中往往缺乏,其中许多环境要么留在学术界,要么已经脱离学术界。然而,如果您处于这样的工作环境中,就有现成的信息和建议来源以及许多可以提供帮助的工具。我不会进一步扩展这一点。

我认为您将整个源代码包含在可执行文件中的建议即使可行,也没有必要。事实上,如果您正确地掌握了 SCM,那么您已经这样做并继续这样做的基本测试之一就是您根据需要重建“旧”可执行文件的能力。您还应该能够确定每个可执行文件和版本中使用了哪个源版本。这些应该使得在可执行文件中包含源代码变得不必要。

正如您所说,将结果集与计算联系起来的主题也是必不可少的。以下是我们正在构建的解决方案的一些组件:

我们正在从传统的非结构化文本文件(许多科学程序输出的特征)转向结构化文件,在我们的例子中,我们正在考虑 HDF5 和 XML,其中感兴趣的数据和元数据被储存了。元数据包括用于生成结果的程序(和版本)的标识、输入数据集的标识、作业参数和一堆其他内容。

我们考虑使用 DBMS 来存储我们的结果;我们想走这条路,但今年我们没有资源这样做,明年也可能不会。但企业使用 DBMS 的原因有多种,其中一个原因是它们能够回滚、提供审计跟踪等。

我们还在仔细研究需要存储哪些结果集。一个好的方法是只存储从我们的现场传感器捕获的原始数据集。不幸的是,我们的一些计算需要花费数千个 CPU 小时才能完成,因此无法根据需要从头开始重现它们。然而,我们将来存储的中间数据集将比过去少得多。

我们还让用户直接编辑结果集变得更加困难(我认为这是不可能的,但我不确定我们是否已经做到了)。一旦有人这样做,世界上所有的出处信息都是错误且无用的。

最后,如果您想了解有关该主题的更多信息,请尝试在谷歌上搜索“科学工作流程”和“数据来源”类似主题。

编辑:从我上面写的内容中还不清楚,但是我们修改了我们的程序,以便它们包含自己的标识(我们使用 Subversion 的关键字功能以及我们自己的一个或两个扩展)并将其写入它们产生的任何输出中。