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

Version control 如何标记科学数据处理工具以确保可重复性,version-control,build-process,cmake,scientific-computing,Version Control,Build Process,Cmake,Scientific Computing,我们开发了一个数据处理工具,从给定的一组原始数据中提取一些科学结果。在数据科学中,非常重要的是,您可以重新获得结果并重复计算,从而生成结果集 由于工具在不断发展,我们需要一种方法来找出工具的哪个版本/构建生成了给定的结果集,以及如何找到从中构建工具的相应源 工具是用C++和Python编写的;使用Boosi::Python将C++部分粘合在一起。我们使用CMake作为生成Linux Make文件的构建系统。目前该项目存储在subversion repo中,但我们中的一些人已经使用git resp

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

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

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

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

我们已经在讨论的想法:

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

你需要考虑。

本场景中的最佳实践是,有一个父回购协议,该回购协议将参考:

  • 工具的来源
  • 从该工具生成的结果集
  • 理想的C++编译器(不会每天进化)
  • 理想情况下,python发行版(不会每天都在发展)
每一个都是一个组件,是一个独立的存储库(Git或Mercurial)。
父存储库将引用每个组件的一个精确版本


所有流程都是一个代表性的流程,是最充分使用SCM(此处为软件配置管理)的关键。

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

我认为软件配置管理的主题已经被很好地理解,并且经常在商业环境中被仔细地实践。然而,在科学数据处理环境中通常缺乏这种通用方法,其中许多环境要么留在学术界,要么已经从学术界发展而来。然而,如果你在这样一个工作环境中,有现成的信息来源、建议和许多工具可以帮助你。我将不再进一步详述这一点

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

正如你所说,将结果集与计算联系起来的主题也是至关重要的。以下是我们正在构建的解决方案的一些组件:

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

我们考虑使用数据库管理系统来存储我们的结果;我们想走这条路,但我们今年没有足够的资源,可能明年也没有。但是,企业使用DBMS的原因有很多,其中一个原因是它们能够回滚,提供审计跟踪,诸如此类

我们还密切关注需要存储哪些结果集。一个好的方法是只存储从现场传感器捕获的原始数据集。不幸的是,我们的一些计算需要1000个CPU小时才能完成,所以按需从头开始复制它们是不可行的。然而,未来我们存储的中间数据集将比过去少得多

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

最后,如果你想了解更多关于这个主题的信息,可以在谷歌上搜索“科学工作流程”和“数据来源”类似的主题

编辑:我上面写的内容不清楚,但我们已经修改了我们的程序,使其包含自己的标识(我们使用Subversion的关键字功能和一两个我们自己的扩展),并将其写入他们生成的任何输出中