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

时间:2010-07-14 08:31:50

标签: version-control build-process cmake scientific-computing

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

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

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

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

我们已经在讨论的想法:

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

2 个答案:

答案 0 :(得分:3)

这是一个我花费大量时间工作的问题。对于@VonC已经写过的内容,我想补充一些想法。

我认为软件配置管理的主题很好理解,并且经常在商业环境中仔细实施。然而,这种一般方法通常缺乏科学数据处理环境,其中许多环境保留在学术界或已经从学术界发展出来。但是,如果您处于这样一个工作环境中,那么随时可以获得信息和建议的来源以及许多可以提供帮助的工具。我不会进一步扩展这一点。

我认为,即使在可行的情况下,您建议将整个源代码包含在可执行文件中也是必要的。实际上,如果你的SCM正确,那么你已经完成的一项基本测试,并且继续这样做,就是你能够按需重建“旧的”可执行文件。您还应该能够确定每个可执行文件和版本中使用的源代码版本。这些应该使源代码包含在可执行文件中是不必要的。

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

我们正在逐渐远离传统的非结构化文本文件,这是许多科学程序输出结构化文件的特征,在我们的例子中,我们正在研究HDF5和XML,其中感兴趣的数据和存储元数据。元数据包括用于生成结果的程序(和版本)的标识,输入数据集的标识,作业参数和一堆其他内容。

我们考虑使用DBMS存储结果;我们想要这样做,但我们今年没有足够的资源去做,也许下次也不会。但是企业出于各种原因使用DBMS,其中一个原因是它们能够回滚,提供审计跟踪等等。

我们也在密切关注需要存储哪些结果集。一种很好的方法只能存储从我们的现场传感器捕获的原始数据集。不幸的是,我们的一些计算需要花费1000个CPU小时才能生成,因此根据需要重现它们 ab-initio 是不可行的。但是,我们将来存储的中间数据集将远远少于过去。

我们也正在努力让用户直接编辑结果集更难(我想不可能,但我不确定我们是否在那里)。一旦有人这样做,世界上所有的出处信息都是错误和无用的。

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

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

答案 1 :(得分:1)

您需要考虑git submoduleshg subrepos

此场景中的最佳做法是拥有一个将引用的父回购:

  • 工具的来源
  • 从该工具生成的结果集
  • 理想情况下是c ++编译器(不会每天都在发展)
  • 理想情况下是python发行版(不会每天都在发展)

每个都是一个组件,即一个独立的存储库(Git或Mercurial) 每个组件的一个精确修订将由父存储库引用。

所有流程都代表component-based approach,并且最重要的是使用SCM(此处为软件配置管理)。