Cómo labelr una herramienta de procesamiento de datos científicos para garantizar la repetibilidad

desarrollamos una herramienta de procesamiento de datos para extraer algunos resultados científicos de un set dado de datos brutos. En ciencia de datos, es muy importante que pueda volver a get los resultados y repetir los cálculos, lo que condujo a un set de resultados

Dado que la herramienta está evolucionando, necesitamos una forma de averiguar qué revisión / compilation de nuestra herramienta generó un determinado set de resultados y cómo encontrar la fuente correspondiente a partir de la cual se construyó la herramienta.

La herramienta está escrita en C ++ y Python; pegar las partes de C ++ utilizando Boost :: Python. Usamos CMake como un sistema de compilation que genera Make files para Linux. Actualmente el proyecto está almacenado en un repository de subversión, pero algunos de nosotros ya usamos git resp. hg y estamos planeando migrar todo el proyecto a uno de ellos en un futuro muy cercano.

¿Cuáles son las mejores prácticas en un escenario como este para get una asignación única entre el código fuente, el binary y el set de resultados?

Ideas que ya estamos discutiendo:

  • De alguna manera, inyectando el número de revisión global
  • Usando un generador de numbers de compilation
  • Almacenar todo el código fuente dentro del ejecutable

Este es un problema en el que gasto bastante time trabajando. Para lo que @VonC ya ha escrito, permítanme agregar algunas ideas.

Creo que el tema de la administración de la configuration del software se entiende bien y, a menudo, se practica con cuidado en entornos comerciales. Sin embargo, este enfoque general a menudo no existe en los entornos de procesamiento de datos científicos, muchos de los cuales permanecen en la academia, o han surgido de ella. Sin embargo, si se encuentra en un ambiente de trabajo así, hay fonts de información y consejos fácilmente disponibles y muchas herramientas para ayudar. No ampliaré más esto.

No creo que su sugerencia de include todo el código fuente en un ejecutable sea, incluso si es factible, necesaria. De hecho, si obtiene SCM en el momento correcto, una de las testings esenciales que ha hecho, y continúa haciéndolo, es su capacidad para rebuild ejecutables 'antiguos' a pedido. También debería poder determinar qué revisión de fonts se utilizó en cada ejecutable y versión. Estos deberían hacer que include el código fuente en un file ejecutable sea innecesario.

El tema de atar los sets de resultados a los cálculos también es, como usted dice, esencial. Estos son algunos de los componentes de la solución que estamos construyendo:

Nos estamos alejando del file de text tradicional no estructurado que es característico del resultado de muchos progtwigs científicos hacia files estructurados, en nuestro caso estamos viendo HDF5 y XML, en el cual tanto los datos de interés como los metadatos está almacenado. Los metadatos incluyen la identificación del progtwig (y la versión) que se usó para producir los resultados, la identificación de los sets de datos de input, los parameters del trabajo y un montón de otras cosas.

Analizamos el uso de un SGBD para almacenar nuestros resultados; nos gustaría ir por este path, pero no tenemos los resources para hacerlo este año, probablemente tampoco el próximo. Pero las empresas usan DBMS por una variedad de razones, y una de las razones es su capacidad para retroceder, proporcionar una pista de auditoría, ese tipo de cosas.

También estamos observando de cerca qué sets de resultados deben almacenarse. Un buen enfoque sería solo almacenar los sets de datos originales capturados de nuestros sensores de campo. Lamentablemente, algunos de nuestros cálculos requieren 1000s de horas de CPU para producir, por lo que no es posible reproducirlos ab-initio a pedido. Sin embargo, saveemos muchos less sets de datos intermedios en el futuro de los que tenemos en el pasado.

También estamos haciendo que sea mucho más difícil (me gustaría pensar que es imposible, pero no estoy seguro de que estamos allí todavía) para que los usuarios editen los sets de resultados directamente. Una vez que alguien hace eso, toda la información de procedencia en el mundo es incorrecta e inútil.

Finalmente, si quiere leer más sobre el tema, intente con Google para temas similares a 'flujo de trabajo científico' y 'proveniencia de datos'.

EDITAR: No está claro por lo que escribí arriba, pero hemos modificado nuestros progtwigs para que contengan su propia identificación (utilizamos las capacidades de palabras key de Subversion para esto con una extensión o dos de la nuestra) y escribimos esto en cualquier resultado que produzcan .

Debe considerar los submodules de git de los hg subrepos .

La mejor práctica en este escenario es tener un repository principal que haga reference a:

  • las fonts de la herramienta
  • el set de resultados generado a partir de esa herramienta
  • idealmente el comstackdor de c ++ (no evolucionará todos los días)
  • idealmente la distribución python (no evolucionará todos los días)

Cada uno de ellos es un componente, que es un repository independiente (Git o Mercurial).
Una revisión precisa de cada componente será referenceda por un repository padre.

El process de todos es representativo de un enfoque basado en componentes , y es key en el uso de un SCM (aquí Gestión de configuration de software) en su totalidad.