{"id":1103,"date":"2026-08-19T09:48:38","date_gmt":"2026-08-19T09:48:38","guid":{"rendered":"https:\/\/matforge.org\/?p=1103","raw":"https:\/\/matforge.org\/?p=1103"},"modified":"2026-08-19T09:48:38","modified_gmt":"2026-08-19T09:48:38","slug":"python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/","title":{"rendered":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos","raw":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 20<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h1>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos<\/h1>\n<p>El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 <strong>combinaci\u00f3n espec\u00edfica<\/strong> de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros produjo un resultado particular. Esa distinci\u00f3n es lo que separa un fr\u00e1gil flujo de trabajo experimental de una canalizaci\u00f3n de simulaci\u00f3n reproducible.<\/p>\n<p>La herramienta m\u00e1s ampliamente adoptada para esto es DVC (Data Version Control), que ampl\u00eda el modelo de versiones de Git para manejar grandes conjuntos de datos y etapas de canalizaci\u00f3n. Este art\u00edculo cubre la implementaci\u00f3n pr\u00e1ctica de DVC para flujos de trabajo cient\u00edficos: construcci\u00f3n de tuber\u00edas con <code>dvc.yaml<\/code>, aislamiento de par\u00e1metros con <code>params.yaml<\/code>, integraci\u00f3n HPC\/SLURM y seguimiento de procedencia de W3C Prov-JSON, para que pueda crear campa\u00f1as de simulaci\u00f3n deterministas que sobreviven a la rotaci\u00f3n de equipos, la migraci\u00f3n de hardware y los ciclos de vida de los proyectos durante a\u00f1os.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li><strong>Valor central de DVC<\/strong>: Los archivos de canalizaci\u00f3n (<code>dvc.yaml<\/code>) hacen que las simulaciones sean conscientes de la dependencia, por lo que <code>dvc repro<\/code> vuelve a ejecutar solo lo que cambi\u00f3<\/li>\n<li><strong>Reproductibilidad versionada<\/strong>: DVC vincula las instant\u00e1neas de datos (<code>.dvc<\/code> archivos), confirmaciones de c\u00f3digo (git) y archivos de par\u00e1metros (<code>params.yaml<\/code>) en unidades de experimento reproducibles<\/li>\n<li><strong>Integraci\u00f3n de HPC<\/strong>: la programaci\u00f3n de lotes de SLURM envuelve el DVC para la ejecuci\u00f3n de la canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual<\/li>\n<li><strong>Est\u00e1ndares de procedencia<\/strong>: W3C Prov-JSON (YPROV4ML) surge como un formato interoperable complementario al empaque RO-Crate<\/li>\n<li><strong>DVC vs Datalad<\/strong>: elija DVC para experimentos orientados a canalizaciones; Elija Datalad para la curaci\u00f3n de datos a largo plazo y conjuntos de datos distribuidos<\/li>\n<\/ul>\n<h2>Por qu\u00e9 falla el control de versiones est\u00e1ndar para los flujos de trabajo de simulaci\u00f3n<\/h2>\n<p>Git es excelente para el seguimiento de los cambios de c\u00f3digo. Es terrible para el seguimiento de los cambios de datos.<\/p>\n<p>Cuando ejecuta un c\u00e1lculo de relajaci\u00f3n DFT, Git no puede almacenar el archivo de estructura de cristales resultante <code>.xyz<\/code> (a menudo decenas de MB). Puede copiarlo a una unidad compartida, o agregar su hash SHA-256 a un archivo de texto, o depender de la memoria. Los tres enfoques se rompen cuando cambia la fuente de datos, cuando necesita compartir con colaboradores que no tienen acceso a la unidad compartida, o cuando regresa seis meses despu\u00e9s y olvida qu\u00e9 conjunto de par\u00e1metros produjo la estructura de menor energ\u00eda.<\/p>\n<p>Las herramientas de versionado de datos resuelven esto desacoplando <strong>seguimiento de datos<\/strong> desde <strong>Seguimiento de c\u00f3digo<\/strong>. Almacenan archivos reales en almacenamiento remoto (Google Drive, S3, un NAS compartido o incluso otro repositorio de Git) y registran archivos de puntero ligeros en el repositorio de Git. Los archivos de puntero (normalmente peque\u00f1os archivos <code>.dvc<\/code> o las referencias de enlaces simb\u00f3licos de Git-Annex contienen metadatos (sunci\u00f3n de comprobaci\u00f3n, ubicaci\u00f3n remota, etiqueta de versi\u00f3n) sin duplicar los datos reales.<\/p>\n<p>Esta separaci\u00f3n es importante para los flujos de trabajo de simulaci\u00f3n porque el volumen de datos se escala independientemente del volumen de c\u00f3digo. Una sola campa\u00f1a de simulaci\u00f3n puede producir miles de archivos de trayectoria, mientras que los scripts de Python que los generan permanecen en unos pocos cientos de l\u00edneas.<\/p>\n<h3>La brecha de la tuber\u00eda<\/h3>\n<p>La mayor\u00eda de los investigadores comienzan con el seguimiento de datos ad-hoc: un script bash que ejecuta c\u00e1lculos en secuencia, con los resultados copiados en un directorio <code>results\/<\/code> y los n\u00fameros finales pegados en una hoja de Google. Esto funciona para peque\u00f1os proyectos. Se descompone cuando:<\/p>\n<ol>\n<li><strong>Re-Ejecuci\u00f3n con diferentes par\u00e1metros<\/strong> \u2014 Debe recordar qu\u00e9 archivo <code>params.yaml<\/code> se utiliz\u00f3 y volver a ejecutar s\u00f3lo las etapas modificadas<\/li>\n<li><strong>Errores de depuraci\u00f3n<\/strong>: debe saber si el error proviene de da\u00f1os de datos, cambios de c\u00f3digo o desajuste de par\u00e1metros<\/li>\n<li><strong>Pasa de equipo<\/strong> \u2014 Un nuevo estudiante no puede reconstruir la canalizaci\u00f3n a partir de un script <code>bash<\/code> y una carpeta de archivos hu\u00e9rfanos<\/li>\n<\/ol>\n<p>El archivo de definici\u00f3n de canalizaci\u00f3n de DVC (<code>dvc.yaml<\/code>) aborda esta brecha al declarar etapas con dependencias y salidas expl\u00edcitas. Cada etapa se vuelve a ejecutar solo cuando cambian sus dependencias (<code>dvc repro &lt;stage&gt;<\/code>), lo que hace que las campa\u00f1as de simulaci\u00f3n sean m\u00e1s eficientes al volver a ejecutar c\u00e1lculos con diferentes par\u00e1metros.<\/p>\n<h2>Construcci\u00f3n de tuber\u00edas de DVC para flujos de trabajo cient\u00edficos<\/h2>\n<p>Un archivo de canalizaci\u00f3n de DVC es un documento YAML declarativo que mapea c\u00f3mo sus pasos de simulaci\u00f3n dependen unos de otros. Aqu\u00ed hay un ejemplo concreto para un flujo de trabajo de ciencia de materiales computacionales:<\/p>\n<pre><code class=\"language-yaml\"># dvc.yaml \u2014 DFT relaxation and energy calculation pipeline\n\nstages:\n  relax:\n    cmd: python src\/relax.py\n    deps:\n    - data\/raw_crystal_structure.xyz\n    - src\/relax.py\n    params:\n    - params.yaml\n    outs:\n    - results\/relaxed_structure.xyz\n\n  energy:\n    cmd: python src\/energy.py\n    deps:\n    - results\/relaxed_structure.xyz\n    - src\/energy.py\n    params:\n    - params.yaml\n    outs:\n    - results\/energies.txt\n    metrics:\n    - results\/energies.txt\n\n  visualize:\n    cmd: python src\/plot.py\n    deps:\n    - results\/energies.txt\n    - src\/plot.py\n    outs:\n    - figures\/energy_plot.png\n<\/code><\/pre>\n<p>Cada etapa declara:<\/p>\n<ul>\n<li><strong><code>cmd<\/code><\/strong>: El comando que genera las salidas de esta etapa<\/li>\n<li><strong><code>deps<\/code><\/strong>: archivos que, si se cambia, activan la repetici\u00f3n de esta etapa<\/li>\n<li><strong><code>params<\/code><\/strong>: Archivos de par\u00e1metros que, si se cambia, activan la repetici\u00f3n de esta etapa.<\/li>\n<li><strong><code>outs<\/code><\/strong>: archivos producidos por esta etapa (seguido como versiones de datos)<\/li>\n<li><strong><code>metrics<\/code><\/strong>: archivos que DVC rastrea num\u00e9ricamente para la comparaci\u00f3n de experimentos<\/li>\n<\/ul>\n<h3>Por qu\u00e9 <code>params.yaml<\/code> importa<\/h3>\n<p>El archivo <code>params.yaml<\/code> a\u00edsla los par\u00e1metros de simulaci\u00f3n de los scripts de ejecuci\u00f3n. Esto es fundamental para los flujos de trabajo de Ciencias de Materiales donde el mismo c\u00f3digo de simulaci\u00f3n se ejecuta cientos de veces con diferentes par\u00e1metros:<\/p>\n<pre><code class=\"language-yaml\"># params.yaml\nsimulator:\n  cutoff_energy: 500  # eV\n  kpoints: [8, 8, 8]\n  tolerance: 1e-6\n  \noptimization:\n  max_steps: 200\n  algorithm: ionic\n<\/code><\/pre>\n<p>Cuando cambia <code>tolerance<\/code> de <code>1e-6<\/code> a <code>1e-8<\/code> y ejecuta <code>dvc repro<\/code>, DVC detecta el cambio de <code>params.yaml<\/code> y vuelve a ejecutar todas las etapas que dependen de \u00e9l. El archivo <code>relaxed_structure.xyz<\/code> resultante obtiene una nueva etiqueta de versi\u00f3n. La versi\u00f3n anterior permanece disponible en la memoria cach\u00e9: no pierdes carreras hist\u00f3ricas.<\/p>\n<p>Para los barridos de par\u00e1metros, puede usar <code>--set-param<\/code> para anular los valores sin modificar el archivo:<\/p>\n<pre><code class=\"language-bash\">dvc exp run --set-param sim.tolerance=1e-8 --set-param sim.cutoff_energy=450\n<\/code><\/pre>\n<p>Esto crea una nueva rama de experimento, que conserva tanto las ejecuciones originales como las modificadas en su historial de canalizaciones.<\/p>\n<h2>Reproducibilidad versionada: contribuci\u00f3n conceptual del DVC<\/h2>\n<p>El blog de DVC (diciembre de 2021) introdujo la \u00abreproducibilidad en versiones\u00bb como la capacidad de recrear no solo un resultado, sino el <strong>estado experimental exacto<\/strong> que lo produjo. Esto distingue el DVC de la versi\u00f3n gen\u00e9rica:<\/p>\n<ul>\n<li><strong>Versionado est\u00e1ndar<\/strong> Realiza un seguimiento de los cambios en los archivos a lo largo del tiempo (prop\u00f3sito de Git)<\/li>\n<li><strong>Reproducibilidad versionada<\/strong> Realiza un seguimiento de qu\u00e9 versi\u00f3n de datos, confirmaci\u00f3n de c\u00f3digo y combinaci\u00f3n de archivos de par\u00e1metros espec\u00edficos produjo un resultado determinado (prop\u00f3sito de DVC)<\/li>\n<\/ul>\n<p>DVC logra esto al vincular tres artefactos versionados independientemente:<\/p>\n<table>\n<thead>\n<tr>\n<th>Artefacto<\/th>\n<th>Sistema de versiones<\/th>\n<th>lo que rastrea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.dvc<\/code> Archivos de puntero<\/td>\n<td>dvc<\/td>\n<td>Versi\u00f3n del archivo de datos + ubicaci\u00f3n remota + suma de verificaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>GIT comete<\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n de c\u00f3digo + mensaje de confirmaci\u00f3n + diferencial<\/td>\n<\/tr>\n<tr>\n<td><code>params.yaml<\/code><\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n del archivo de par\u00e1metros + cambios en el nivel del campo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La combinaci\u00f3n de estos tres crea una unidad reproducible: un \u00abexperimento versionado\u00bb que se puede reconstruir de forma aislada. Esto importa para la simulaci\u00f3n porque los experimentos se refinan iterativamente. Los investigadores necesitan saber \u00abqu\u00e9 funcion\u00f3\u00bb y poder reproducirlo sin volver a ejecutar cada paso intermedio.<\/p>\n<h3>Implicaciones pr\u00e1cticas<\/h3>\n<p>Cuando un revisor solicita los datos detr\u00e1s de una figura publicada, puede proporcionar:<\/p>\n<ol>\n<li>El hash de confirmaci\u00f3n de Git (versi\u00f3n de c\u00f3digo)<\/li>\n<li>La referencia del archivo de puntero <code>.dvc<\/code> (versi\u00f3n de datos)<\/li>\n<li>El archivo <code>params.yaml<\/code> en ese compromiso (versi\u00f3n de par\u00e1metro)<\/li>\n<\/ol>\n<p>Combinados, estos tres artefactos son suficientes para reproducir el resultado en cualquier m\u00e1quina. Este es el est\u00e1ndar de oro para la reproducibilidad de la simulaci\u00f3n: mucho m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) o los repositorios de Git desnudos (que no pueden manejar datos de gran tama\u00f1o).<\/p>\n<h2>Colas de experimentos y gesti\u00f3n<\/h2>\n<p>La gesti\u00f3n de experimentos de DVC (<code>dvc exp<\/code>) extiende el modelo de canalizaci\u00f3n para admitir experimentos concurrentes y en cola:<\/p>\n<pre><code class=\"language-bash\"># Run a single experiment with custom parameters\ndvc exp run -S sim.tolerance=1e-8\n\n# Queue multiple experiments\ndvc exp run --queue -S sim.tolerance=1e-8\ndvc exp run --queue -S sim.tolerance=1e-6\ndvc exp run --queue -S sim.tolerance=1e-5\n\n# Execute queued experiments\ndvc exp run\n<\/code><\/pre>\n<p>El indicador <code>--queue<\/code> difiere la ejecuci\u00f3n, lo que le permite preparar m\u00faltiples experimentos y ejecutarlos por lotes de forma secuencial. Esto es valioso para los experimentos computacionales que se ejecutan durante horas o d\u00edas; puede poner en cola un barrido de par\u00e1metros durante la noche sin iniciar manualmente cada ejecuci\u00f3n.<\/p>\n<p>Para la comparaci\u00f3n de experimentos, DVClive proporciona seguimiento de m\u00e9tricas en tiempo real:<\/p>\n<pre><code class=\"language-python\"># src\/metrics.py \u2014 DVCLive integration\nfrom dvclive import Live\n\nwith Live() as live:\n    for step in range(n_iterations):\n        result = run_step(step)\n        live.step = step\n        live.log(\"energy\", result[\"total_energy\"])\n        live.log(\"forces\", result[\"max_force\"])\n<\/code><\/pre>\n<p>Esto produce un panel de comparaci\u00f3n interactivo donde puede ver c\u00f3mo evolucionan la energ\u00eda y las fuerzas a trav\u00e9s de los barridos de par\u00e1metros.<\/p>\n<h2>Ejecuci\u00f3n de canalizaciones de DVC en cl\u00fasteres de HPC<\/h2>\n<p>La mayor\u00eda de los cient\u00edficos computacionales no ejecutan tuber\u00edas en computadoras port\u00e1tiles. Los ejecutan en cl\u00fasteres con SLURM, PBS o programadores LSF. DVC se integra con SLURM a trav\u00e9s de la envoltura <code>srun<\/code>, permitiendo la ejecuci\u00f3n de canalizaci\u00f3n nativa de cl\u00faster:<\/p>\n<pre><code class=\"language-bash\"># Run a single pipeline stage with SLURM resource allocation\nsrun dvc repro -n relax --job slurm-job.sh\n\n# Run all pipeline stages on the cluster\nsrun dvc repro\n<\/code><\/pre>\n<p>El indicador <code>--job<\/code> le dice a DVC que ejecute cada etapa a trav\u00e9s del programador de trabajo de SLURM, manejando autom\u00e1ticamente:<\/p>\n<ul>\n<li>Asignaci\u00f3n de recursos espec\u00edficos del cl\u00faster (memoria, CPU, nodos GPU)<\/li>\n<li>Ejecuci\u00f3n en modo por lotes sin intervenci\u00f3n manual<\/li>\n<li>Cola de trabajo autom\u00e1tica para etapas de tuber\u00eda<\/li>\n<li>Integraci\u00f3n con sistemas de archivos y almacenamiento espec\u00edficos de cl\u00faster (lustre, GPFS, BEEGFS)<\/li>\n<\/ul>\n<p>ARXIV 2505.06558v2 (septiembre de 2025) demuestra esta integraci\u00f3n para los flujos de trabajo de materiales-ciencia que ejecutan c\u00e1lculos DFT en cl\u00fasteres HPC. La ventaja clave es que <code>dvc repro<\/code> se vuelve consciente del cl\u00faster: si una etapa falla o sus dependencias cambian, SLURM maneja la asignaci\u00f3n de recursos para volver a ejecutar solo las etapas necesarias.<\/p>\n<h3>Consideraciones de almacenamiento en cl\u00faster<\/h3>\n<p>El almacenamiento remoto de DVC funciona bien con sistemas de archivos de cl\u00faster. Puede configurar DVC para utilizar el sistema de archivos GPFS Lustre o GPFS como un DVC Remote:<\/p>\n<pre><code class=\"language-bash\"># Configure a cluster storage remote\ndvc remote modify cluster_storage token_url \"https:\/\/cluster-storage.example.com\"\n<\/code><\/pre>\n<p>Esto evita la sobrecarga de copiar datos hacia\/desde el almacenamiento en la nube externo y mantiene la canalizaci\u00f3n autocontenida dentro de la jerarqu\u00eda de almacenamiento del cl\u00faster.<\/p>\n<h2>Seguimiento de procedencia W3C Prov-JSON<\/h2>\n<p>Si bien DVC rastrea las etapas de la canalizaci\u00f3n y las versiones de datos, no produce de forma nativa un gr\u00e1fico de procedencia accionable por m\u00e1quina. Para eso, necesita un est\u00e1ndar de procedencia, y el formato emergente es W3C Prov-JSON.<\/p>\n<p>YPROV4ML (ARXIV julio de 2025) implementa la procedencia W3C Prov-JSON con modificaciones m\u00ednimas de c\u00f3digo. captura:<\/p>\n<ul>\n<li><strong>Qui\u00e9n<\/strong> ejecut\u00f3 el experimento (identidad de usuario)<\/li>\n<li><strong>Qu\u00e9<\/strong> se utilizaron los datos y el c\u00f3digo (origen de origen)<\/li>\n<li><strong>c\u00f3mo<\/strong> corri\u00f3 el experimento (procedencia de ejecuci\u00f3n)<\/li>\n<li><strong>Por qu\u00e9<\/strong> (motivaci\u00f3n opcional, vinculada a los objetivos de la investigaci\u00f3n)<\/li>\n<\/ul>\n<p>La salida es un gr\u00e1fico Prov-JSON: un gr\u00e1fico dirigido donde los nodos representan entidades (archivos, par\u00e1metros, confirmaciones de c\u00f3digo) y los bordes representan relaciones (derivado, producido por, usado por). Este formato permite:<\/p>\n<ul>\n<li><strong>Interoperabilidad entre sistemas de procedencia<\/strong>: Prov-JSON es legible por m\u00e1quina y se puede consultar con bases de datos SPARQL o Graph<\/li>\n<li><strong>Cumplimiento de datos justos<\/strong>: los gr\u00e1ficos Prov-JSON cumplen los principios justos al documentar las condiciones de linaje y reutilizaci\u00f3n de datos<\/li>\n<li><strong>Colaboraci\u00f3n interinstitucional<\/strong>: Prov-JSON es un est\u00e1ndar W3C, por lo que los gr\u00e1ficos de procedencia de diferentes instituciones son compatibles<\/li>\n<\/ul>\n<h3>Prov-JSON vs Ro-Crate<\/h3>\n<p>Es \u00fatil distinguir Prov-JSON de RO-Crate, ya que ambos aparecen en discusiones de reproducibilidad:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aspecto<\/th>\n<th>caja de cambio<\/th>\n<th>Promoci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Prop\u00f3sito<\/td>\n<td>Formato de paquete para metadatos enriquecidos<\/td>\n<td>Formato de datos para gr\u00e1ficos de procedencia<\/td>\n<\/tr>\n<tr>\n<td>Alcance<\/td>\n<td>Conjunto de datos completo + recursos asociados<\/td>\n<td>Ejecuci\u00f3n de linaje y dependencias<\/td>\n<\/tr>\n<tr>\n<td>Formato<\/td>\n<td>JSON-LD<\/td>\n<td>JSON (est\u00e1ndar PROV)<\/td>\n<\/tr>\n<tr>\n<td>interoperabilidad<\/td>\n<td>Paquete aut\u00f3nomo<\/td>\n<td>Basado en gr\u00e1ficos, consultable<\/td>\n<\/tr>\n<tr>\n<td>Relaci\u00f3n<\/td>\n<td>Complementaria, no compitiendo<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Abordan diferentes capas de reproducibilidad. RO-Crate empaqueta su conjunto de datos con metadatos. Prov-JSON rastrea el linaje computacional de c\u00f3mo se produjo ese conjunto de datos. El uso de ambos proporciona una reproducibilidad completa: \u00abAqu\u00ed est\u00e1n los datos\u00bb (ro-Crate) m\u00e1s \u00abAs\u00ed es como se produjo\u00bb (Prov-JSON).<\/p>\n<h2>Cu\u00e1ndo usar DVC vs Datalad vs Bibliotecas compatibles con Prov<\/h2>\n<p>Elegir entre DVC, Datalad y bibliotecas compatibles con Prov depende de sus patrones de flujo de trabajo:<\/p>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>dvc<\/th>\n<th>drogadicto<\/th>\n<th>Bibliotecas de PRO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Caso de uso principal<\/td>\n<td>Experimentos orientados a tuber\u00edas<\/td>\n<td>Curaci\u00f3n de datos a largo plazo<\/td>\n<td>procedencia accionable a m\u00e1quina<\/td>\n<\/tr>\n<tr>\n<td>Tama\u00f1o de los datos<\/td>\n<td>Archivos grandes (modelos, simulaciones)<\/td>\n<td>Grandes conjuntos de datos distribuidos<\/td>\n<td>N\/A (enfocado en metadatos)<\/td>\n<\/tr>\n<tr>\n<td>Modelo de ejecuci\u00f3n<\/td>\n<td>Pipeline basado en etapas (<code>dvc repro<\/code>)<\/td>\n<td>Basado en comandos (<code>datalad run<\/code>)<\/td>\n<td>Basado en decorador<\/td>\n<\/tr>\n<tr>\n<td>Integraci\u00f3n HPC<\/td>\n<td><code>srun dvc repro<\/code><\/td>\n<td>Git-anexo nativo + SSH<\/td>\n<td>configurable<\/td>\n<\/tr>\n<tr>\n<td>Salida de procedencia<\/td>\n<td><code>.dvc<\/code> Archivos + Historial de Git<\/td>\n<td>Enlaces simb\u00f3licos de Git-Anex + registro de Git<\/td>\n<td>Gr\u00e1fico Provincia JSON<\/td>\n<\/tr>\n<tr>\n<td>mejor para<\/td>\n<td>Materiales-Ciencias de Ciencias, Barridos de Par\u00e1metros<\/td>\n<td>Curaci\u00f3n de repositorios a largo plazo, cumplimiento de ofertas<\/td>\n<td>Datos justos, procedencia interinstitucional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>DVC es adecuado para usted si:<\/h3>\n<ul>\n<li>Su flujo de trabajo tiene varias etapas dependientes (relajaci\u00f3n \u2192 c\u00e1lculo de propiedades \u2192 visualizaci\u00f3n)<\/li>\n<li>Necesita barridos de par\u00e1metros con repetici\u00f3n autom\u00e1tica<\/li>\n<li>Desea realizar un seguimiento de qu\u00e9 combinaci\u00f3n de par\u00e1metros produjo el resultado de energ\u00eda m\u00e1s baja<\/li>\n<\/ul>\n<h3>Datalad es adecuado para usted si:<\/h3>\n<ul>\n<li>Est\u00e1s curando un repositorio de conjunto de datos a largo plazo<\/li>\n<li>Necesita enlaces simb\u00f3licos de Git-Anex para un manejo eficiente de archivos grandes<\/li>\n<li>Est\u00e1s trabajando con conjuntos de datos distribuidos en todas las instituciones<\/li>\n<li>Necesitas Cumplimiento de Ofertas (Com\u00fan en Neuroimagen)<\/li>\n<\/ul>\n<h3>Las bibliotecas que cumplen con Prov son adecuadas para usted si:<\/h3>\n<ul>\n<li>Necesita procedencia accionable a m\u00e1quina para un cumplimiento justo<\/li>\n<li>Desea un gr\u00e1fico de procedencia consultable para el linaje de datos<\/li>\n<li>Est\u00e1s colaborando entre instituciones con diferentes sistemas de procedencia<\/li>\n<li>Est\u00e1s publicando en un repositorio de datos justo<\/li>\n<\/ul>\n<h2>Poni\u00e9ndolo en com\u00fan, un flujo de trabajo pr\u00e1ctico<\/h2>\n<p>Aqu\u00ed hay un patr\u00f3n de flujo de trabajo pr\u00e1ctico que combina todos los conceptos anteriores:<\/p>\n<pre><code class=\"language-bash\"># 1. Initialize the repository\ngit init\ndvc init\n\n# 2. Add the data\ndvc add data\/raw_crystal_structure.xyz\n\n# 3. Run the pipeline\ndvc repro\n\n# 4. Check the results\ndvc metrics show results\/energies.txt\n\n# 5. Run experiments with different parameters\ndvc exp run -S sim.tolerance=1e-8 --set-param sim.cutoff_energy=550\n\n# 6. Push data and experiments to remote\ndvc push\ndvc exp push\ngit push origin main\n\n# 7. (Optional) Generate PROV-JSON provenance\npython src\/provenance.py --output provenance.json\n<\/code><\/pre>\n<p>Este patr\u00f3n garantiza que cada resultado de la simulaci\u00f3n se pueda rastrear hasta su versi\u00f3n de datos exacta, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros. La salida Prov-JSON (paso 7) agrega una capa de procedencia accionable por m\u00e1quina en la parte superior de la tuber\u00eda de DVC.<\/p>\n<h2>Errores comunes: qu\u00e9 evitar<\/h2>\n<p><strong>Error 1: Versiones de todo<\/strong> \u2014 No ejecute <code>dvc add<\/code> en cada archivo de salida. Solo realice un seguimiento de los archivos que son entradas a etapas posteriores o que representan los resultados finales. Los archivos intermedios (como los arreglos de fuerza sin procesar) deben permanecer en Git o ser excluidos por completo. La adici\u00f3n excesiva crea ruido de tuber\u00eda.<\/p>\n<p><strong>Error 2: Rutas de codificaci\u00f3n dura<\/strong> \u2014 No utilice rutas absolutas en <code>dvc.yaml<\/code>. Utilice rutas relativas para que la canalizaci\u00f3n funcione en diferentes m\u00e1quinas y configuraciones de cl\u00faster.<\/p>\n<p><strong>Error 3: Mezcla de tipos de datos<\/strong> \u2014 No coloque los par\u00e1metros de simulaci\u00f3n y los puntos de control del modelo en el mismo archivo <code>.dvc<\/code>. Mantenga los tipos de datos separados para evitar conflictos de cach\u00e9.<\/p>\n<p><strong>Error 4: Ignorar la procedencia<\/strong> \u2014 Los archivos DVC por s\u00ed solos no son suficientes para el cumplimiento justo. Si su instituci\u00f3n requiere gr\u00e1ficos de procedencia, empareje DVC con salida Prov-JSON (YPROV4ML) o RO-Crate Package.<\/p>\n<p><strong>Error 5: Olvidar <code>params.yaml<\/code><\/strong> \u2014 Si los par\u00e1metros de c\u00f3digo r\u00edgido en sus scripts en lugar de aislarlos en <code>params.yaml<\/code>, el seguimiento de par\u00e1metros de DVC se vuelve in\u00fatil. Utilice siempre <code>params.yaml<\/code> para los par\u00e1metros de simulaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>DVC transforma los flujos de trabajo cient\u00edficos de procesos fr\u00e1giles y dependientes de la memoria en canalizaciones deterministas y conscientes de la dependencia. La informaci\u00f3n clave es que <code>dvc.yaml<\/code> archivos de canalizaci\u00f3n y <code>params.yaml<\/code> aislamiento de par\u00e1metros crean \u00abreproducibilidad en versi\u00f3n\u00bb: la capacidad de reconstruir no solo un resultado, sino el estado experimental exacto (versi\u00f3n de datos + code commit + archivo de par\u00e1metros) que lo produjo. Esto va m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) y m\u00e1s all\u00e1 de Git (que no pueden manejar grandes conjuntos de datos).<\/p>\n<p>Para la integraci\u00f3n de HPC, el envoltorio <code>srun<\/code> de SLURM permite la ejecuci\u00f3n de canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual. Para la procedencia, W3C Prov-JSON (YPROPR4ML) surge como un formato interoperable complementario al empaque de RO-Crate, lo que permite un linaje de datos accionable por m\u00e1quina que satisface los requisitos de cumplimiento justo.<\/p>\n<p>La elecci\u00f3n entre DVC, Datalad y bibliotecas compatibles con ProV depende de sus patrones de flujo de trabajo: DVC para experimentos orientados a canalizaciones, Datalad para curaci\u00f3n de datos a largo plazo y bibliotecas PROP para gr\u00e1ficos de procedencia accionables por m\u00e1quina. La mayor\u00eda de los equipos de simulaci\u00f3n se benefician del uso de DVC para la ejecuci\u00f3n de la canalizaci\u00f3n y Prov-JSON para el seguimiento de procedencias: las dos herramientas son complementarias, no compiten.<\/p>\n<hr>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/reproducibility-workflows-beyond-containers-data-versioning-and-provenance-tracking\/\">Reproducibilidad m\u00e1s all\u00e1 de los contenedores<\/a> \u2014 Cubre los conceptos b\u00e1sicos de DVC, el envase de procedencia de caja RO-Crate y los patrones de reproducibilidad basados en contenedores<\/li>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">Gesti\u00f3n de problemas de PDE a gran escala<\/a> \u2014 Discute la gesti\u00f3n de recursos de cl\u00faster y Flujos de trabajo de HPC<\/li>\n<li><a href=\"https:\/\/matforge.org\/verification-vs-validation-in-scientific-simulations-a-practical-guide\/\">Verificaci\u00f3n vs validaci\u00f3n en simulaciones cient\u00edficas<\/a> \u2014 explica la reproducibilidad m\u00e1s amplia Contexto para los resultados de la simulaci\u00f3n&lt;\/fs_write_file&gt;<br \/> &lt;\/tool_call&gt;<\/li>\n<\/ul>\n<p>&lt;tool_call&gt;<br \/> &lt;function=fs_write_file&gt;<br \/> &lt;par\u00e1metro=contenido&gt;<\/p>\n<h1>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos<\/h1>\n<p>El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 <strong>combinaci\u00f3n espec\u00edfica<\/strong> de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros produjo un resultado particular. Esa distinci\u00f3n es lo que separa un fr\u00e1gil flujo de trabajo experimental de una canalizaci\u00f3n de simulaci\u00f3n reproducible.<\/p>\n<p>La herramienta m\u00e1s ampliamente adoptada para esto es DVC (Data Version Control), que ampl\u00eda el modelo de versiones de Git para manejar grandes conjuntos de datos y etapas de canalizaci\u00f3n. Este art\u00edculo cubre la implementaci\u00f3n pr\u00e1ctica de DVC para flujos de trabajo cient\u00edficos: construcci\u00f3n de tuber\u00edas con <code>dvc.yaml<\/code>, aislamiento de par\u00e1metros con <code>params.yaml<\/code>, integraci\u00f3n HPC\/SLURM y seguimiento de procedencia de W3C Prov-JSON, para que pueda crear campa\u00f1as de simulaci\u00f3n deterministas que sobreviven a la rotaci\u00f3n de equipos, la migraci\u00f3n de hardware y los ciclos de vida de los proyectos durante a\u00f1os.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li><strong>Valor central de DVC<\/strong>: Los archivos de canalizaci\u00f3n (<code>dvc.yaml<\/code>) hacen que las simulaciones sean conscientes de la dependencia, por lo que <code>dvc repro<\/code> vuelve a ejecutar solo lo que cambi\u00f3<\/li>\n<li><strong>Reproductibilidad versionada<\/strong>: DVC vincula las instant\u00e1neas de datos (<code>.dvc<\/code> archivos), confirmaciones de c\u00f3digo (git) y archivos de par\u00e1metros (<code>params.yaml<\/code>) en unidades de experimento reproducibles<\/li>\n<li><strong>Integraci\u00f3n de HPC<\/strong>: la programaci\u00f3n de lotes de SLURM envuelve el DVC para la ejecuci\u00f3n de la canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual<\/li>\n<li><strong>Est\u00e1ndares de procedencia<\/strong>: W3C Prov-JSON (YPROV4ML) surge como un formato interoperable complementario al empaque RO-Crate<\/li>\n<li><strong>DVC vs Datalad<\/strong>: elija DVC para experimentos orientados a canalizaciones; Elija Datalad para la curaci\u00f3n de datos a largo plazo y conjuntos de datos distribuidos<\/li>\n<\/ul>\n<h2>Por qu\u00e9 falla el control de versiones est\u00e1ndar para los flujos de trabajo de simulaci\u00f3n<\/h2>\n<p>Git es excelente para el seguimiento de los cambios de c\u00f3digo. Es terrible para el seguimiento de los cambios de datos.<\/p>\n<p>Cuando ejecuta un c\u00e1lculo de relajaci\u00f3n DFT, Git no puede almacenar el archivo de estructura de cristales resultante <code>.xyz<\/code> (a menudo decenas de MB). Puede copiarlo a una unidad compartida, o agregar su hash SHA-256 a un archivo de texto, o depender de la memoria. Los tres enfoques se rompen cuando cambia la fuente de datos, cuando necesita compartir con colaboradores que no tienen acceso a la unidad compartida, o cuando regresa seis meses despu\u00e9s y olvida qu\u00e9 conjunto de par\u00e1metros produjo la estructura de menor energ\u00eda.<\/p>\n<p>Las herramientas de versionado de datos resuelven esto desacoplando <strong>seguimiento de datos<\/strong> desde <strong>Seguimiento de c\u00f3digo<\/strong>. Almacenan archivos reales en almacenamiento remoto (Google Drive, S3, un NAS compartido o incluso otro repositorio de Git) y registran archivos de puntero ligeros en el repositorio de Git. Los archivos de puntero (normalmente peque\u00f1os archivos <code>.dvc<\/code> o las referencias de enlaces simb\u00f3licos de Git-Annex contienen metadatos (sunci\u00f3n de comprobaci\u00f3n, ubicaci\u00f3n remota, etiqueta de versi\u00f3n) sin duplicar los datos reales.<\/p>\n<p>Esta separaci\u00f3n es importante para los flujos de trabajo de simulaci\u00f3n porque el volumen de datos se escala independientemente del volumen de c\u00f3digo. Una sola campa\u00f1a de simulaci\u00f3n puede producir miles de archivos de trayectoria, mientras que los scripts de Python que los generan permanecen en unos pocos cientos de l\u00edneas.<\/p>\n<h3>La brecha de la tuber\u00eda<\/h3>\n<p>La mayor\u00eda de los investigadores comienzan con el seguimiento de datos ad-hoc: un script bash que ejecuta c\u00e1lculos en secuencia, con los resultados copiados en un directorio <code>results\/<\/code> y los n\u00fameros finales pegados en una hoja de Google. Esto funciona para peque\u00f1os proyectos. Se descompone cuando:<\/p>\n<ol>\n<li><strong>Re-Ejecuci\u00f3n con diferentes par\u00e1metros<\/strong> \u2014 Debe recordar qu\u00e9 archivo <code>params.yaml<\/code> se utiliz\u00f3 y volver a ejecutar s\u00f3lo las etapas modificadas<\/li>\n<li><strong>Errores de depuraci\u00f3n<\/strong>: debe saber si el error proviene de da\u00f1os de datos, cambios de c\u00f3digo o desajuste de par\u00e1metros<\/li>\n<li><strong>Pasa de equipo<\/strong> \u2014 Un nuevo estudiante no puede reconstruir la canalizaci\u00f3n a partir de un script <code>bash<\/code> y una carpeta de archivos hu\u00e9rfanos<\/li>\n<\/ol>\n<p>El archivo de definici\u00f3n de canalizaci\u00f3n de DVC (<code>dvc.yaml<\/code>) aborda esta brecha al declarar etapas con dependencias y salidas expl\u00edcitas. Cada etapa se vuelve a ejecutar solo cuando cambian sus dependencias (<code>dvc repro &lt;stage&gt;<\/code>), lo que hace que las campa\u00f1as de simulaci\u00f3n sean m\u00e1s eficientes al volver a ejecutar c\u00e1lculos con diferentes par\u00e1metros.<\/p>\n<h2>Construcci\u00f3n de tuber\u00edas de DVC para flujos de trabajo cient\u00edficos<\/h2>\n<p>Un archivo de canalizaci\u00f3n de DVC es un documento YAML declarativo que mapea c\u00f3mo sus pasos de simulaci\u00f3n dependen unos de otros. Aqu\u00ed hay un ejemplo concreto para un flujo de trabajo de ciencia de materiales computacionales:<\/p>\n<pre><code class=\"language-yaml\"># dvc.yaml \u2014 DFT relaxation and energy calculation pipeline\n\nstages:\n  relax:\n    cmd: python src\/relax.py\n    deps:\n    - data\/raw_crystal_structure.xyz\n    - src\/relax.py\n    params:\n    - params.yaml\n    outs:\n    - results\/relaxed_structure.xyz\n\n  energy:\n    cmd: python src\/energy.py\n    deps:\n    - results\/relaxed_structure.xyz\n    - src\/energy.py\n    params:\n    - params.yaml\n    outs:\n    - results\/energies.txt\n    metrics:\n    - results\/energies.txt\n\n  visualize:\n    cmd: python src\/plot.py\n    deps:\n    - results\/energies.txt\n    - src\/plot.py\n    outs:\n    - figures\/energy_plot.png\n<\/code><\/pre>\n<p>Cada etapa declara:<\/p>\n<ul>\n<li><strong><code>cmd<\/code><\/strong>: El comando que genera las salidas de esta etapa<\/li>\n<li><strong><code>deps<\/code><\/strong>: archivos que, si se cambia, activan la repetici\u00f3n de esta etapa<\/li>\n<li><strong><code>params<\/code><\/strong>: Archivos de par\u00e1metros que, si se cambia, activan la repetici\u00f3n de esta etapa.<\/li>\n<li><strong><code>outs<\/code><\/strong>: archivos producidos por esta etapa (seguido como versiones de datos)<\/li>\n<li><strong><code>metrics<\/code><\/strong>: archivos que DVC rastrea num\u00e9ricamente para la comparaci\u00f3n de experimentos<\/li>\n<\/ul>\n<h3>Por qu\u00e9 <code>params.yaml<\/code> importa<\/h3>\n<p>El archivo <code>params.yaml<\/code> a\u00edsla los par\u00e1metros de simulaci\u00f3n de los scripts de ejecuci\u00f3n. Esto es fundamental para los flujos de trabajo de Ciencias de Materiales donde el mismo c\u00f3digo de simulaci\u00f3n se ejecuta cientos de veces con diferentes par\u00e1metros:<\/p>\n<pre><code class=\"language-yaml\"># params.yaml\nsimulator:\n  cutoff_energy: 500  # eV\n  kpoints: [8, 8, 8]\n  tolerance: 1e-6\n  \noptimization:\n  max_steps: 200\n  algorithm: ionic\n<\/code><\/pre>\n<p>Cuando cambia <code>tolerance<\/code> de <code>1e-6<\/code> a <code>1e-8<\/code> y ejecuta <code>dvc repro<\/code>, DVC detecta el cambio de <code>params.yaml<\/code> y vuelve a ejecutar todas las etapas que dependen de \u00e9l. El archivo <code>relaxed_structure.xyz<\/code> resultante obtiene una nueva etiqueta de versi\u00f3n. La versi\u00f3n anterior permanece disponible en la memoria cach\u00e9: no pierdes carreras hist\u00f3ricas.<\/p>\n<p>Para los barridos de par\u00e1metros, puede usar <code>--set-param<\/code> para anular los valores sin modificar el archivo:<\/p>\n<pre><code class=\"language-bash\">dvc exp run --set-param sim.tolerance=1e-8 --set-param sim.cutoff_energy=450\n<\/code><\/pre>\n<p>Esto crea una nueva rama de experimento, que conserva tanto las ejecuciones originales como las modificadas en su historial de canalizaciones.<\/p>\n<h2>Reproducibilidad versionada: contribuci\u00f3n conceptual del DVC<\/h2>\n<p>El blog de DVC (diciembre de 2021) introdujo la \u00abreproducibilidad en versiones\u00bb como la capacidad de recrear no solo un resultado, sino el <strong>estado experimental exacto<\/strong> que lo produjo. Esto distingue el DVC de la versi\u00f3n gen\u00e9rica:<\/p>\n<ul>\n<li><strong>Versionado est\u00e1ndar<\/strong> Realiza un seguimiento de los cambios en los archivos a lo largo del tiempo (prop\u00f3sito de Git)<\/li>\n<li><strong>Reproducibilidad versionada<\/strong> Realiza un seguimiento de qu\u00e9 versi\u00f3n de datos, confirmaci\u00f3n de c\u00f3digo y combinaci\u00f3n de archivos de par\u00e1metros espec\u00edficos produjo un resultado determinado (prop\u00f3sito de DVC)<\/li>\n<\/ul>\n<p>DVC logra esto al vincular tres artefactos versionados independientemente:<\/p>\n<table>\n<thead>\n<tr>\n<th>Artefacto<\/th>\n<th>Sistema de versiones<\/th>\n<th>lo que rastrea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.dvc<\/code> Archivos de puntero<\/td>\n<td>dvc<\/td>\n<td>Versi\u00f3n del archivo de datos + ubicaci\u00f3n remota + suma de verificaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>GIT comete<\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n de c\u00f3digo + mensaje de confirmaci\u00f3n + diferencial<\/td>\n<\/tr>\n<tr>\n<td><code>params.yaml<\/code><\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n del archivo de par\u00e1metros + cambios en el nivel del campo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La combinaci\u00f3n de estos tres crea una unidad reproducible: un \u00abexperimento versionado\u00bb que se puede reconstruir de forma aislada. Esto importa para la simulaci\u00f3n porque los experimentos se refinan iterativamente. Los investigadores necesitan saber \u00abqu\u00e9 funcion\u00f3\u00bb y poder reproducirlo sin volver a ejecutar cada paso intermedio.<\/p>\n<h3>Implicaciones pr\u00e1cticas<\/h3>\n<p>Cuando un revisor solicita los datos detr\u00e1s de una figura publicada, puede proporcionar:<\/p>\n<ol>\n<li>El hash de confirmaci\u00f3n de Git (versi\u00f3n de c\u00f3digo)<\/li>\n<li>La referencia del archivo de puntero <code>.dvc<\/code> (versi\u00f3n de datos)<\/li>\n<li>El archivo <code>params.yaml<\/code> en ese compromiso (versi\u00f3n de par\u00e1metro)<\/li>\n<\/ol>\n<p>Combinados, estos tres artefactos son suficientes para reproducir el resultado en cualquier m\u00e1quina. Este es el est\u00e1ndar de oro para la reproducibilidad de la simulaci\u00f3n: mucho m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) o los repositorios de Git desnudos (que no pueden manejar datos de gran tama\u00f1o).<\/p>\n<h2>Colas de experimentos y gesti\u00f3n<\/h2>\n<p>La gesti\u00f3n de experimentos de DVC (<code>dvc exp<\/code>) extiende el modelo de canalizaci\u00f3n para admitir experimentos concurrentes y en cola:<\/p>\n<pre><code class=\"language-bash\"># Run a single experiment with custom parameters\ndvc exp run -S sim.tolerance=1e-8\n\n# Queue multiple experiments\ndvc exp run --queue -S sim.tolerance=1e-8\ndvc exp run --queue -S sim.tolerance=1e-6\ndvc exp run --queue -S sim.tolerance=1e-5\n\n# Execute queued experiments\ndvc exp run\n<\/code><\/pre>\n<p>El indicador <code>--queue<\/code> difiere la ejecuci\u00f3n, lo que le permite preparar m\u00faltiples experimentos y ejecutarlos por lotes de forma secuencial. Esto es valioso para los experimentos computacionales que se ejecutan durante horas o d\u00edas; puede poner en cola un barrido de par\u00e1metros durante la noche sin iniciar manualmente cada ejecuci\u00f3n.<\/p>\n<p>Para la comparaci\u00f3n de experimentos, DVClive proporciona seguimiento de m\u00e9tricas en tiempo real:<\/p>\n<pre><code class=\"language-python\"># src\/metrics.py \u2014 DVCLive integration\nfrom dvclive import Live\n\nwith Live() as live:\n    for step in range(n_iterations):\n        result = run_step(step)\n        live.step = step\n        live.log(\"energy\", result[\"total_energy\"])\n        live.log(\"forces\", result[\"max_force\"])\n<\/code><\/pre>\n<p>Esto produce un panel de comparaci\u00f3n interactivo donde puede ver c\u00f3mo evolucionan la energ\u00eda y las fuerzas a trav\u00e9s de los barridos de par\u00e1metros.<\/p>\n<h2>Ejecuci\u00f3n de canalizaciones de DVC en cl\u00fasteres de HPC<\/h2>\n<p>La mayor\u00eda de los cient\u00edficos computacionales no ejecutan tuber\u00edas en computadoras port\u00e1tiles. Los ejecutan en cl\u00fasteres con SLURM, PBS o programadores LSF. DVC se integra con SLURM a trav\u00e9s de la envoltura <code>srun<\/code>, permitiendo la ejecuci\u00f3n de canalizaci\u00f3n nativa de cl\u00faster:<\/p>\n<pre><code class=\"language-bash\"># Run a single pipeline stage with SLURM resource allocation\nsrun dvc repro -n relax --job slurm-job.sh\n\n# Run all pipeline stages on the cluster\nsrun dvc repro\n<\/code><\/pre>\n<p>El indicador <code>--job<\/code> le dice a DVC que ejecute cada etapa a trav\u00e9s del programador de trabajo de SLURM, manejando autom\u00e1ticamente:<\/p>\n<ul>\n<li>Asignaci\u00f3n de recursos espec\u00edficos del cl\u00faster (memoria, CPU, nodos GPU)<\/li>\n<li>Ejecuci\u00f3n en modo por lotes sin intervenci\u00f3n manual<\/li>\n<li>Cola de trabajo autom\u00e1tica para etapas de tuber\u00eda<\/li>\n<li>Integraci\u00f3n con sistemas de archivos y almacenamiento espec\u00edficos de cl\u00faster (lustre, GPFS, BEEGFS)<\/li>\n<\/ul>\n<p>ARXIV 2505.06558v2 (septiembre de 2025) demuestra esta integraci\u00f3n para los flujos de trabajo de materiales-ciencia que ejecutan c\u00e1lculos DFT en cl\u00fasteres HPC. La ventaja clave es que <code>dvc repro<\/code> se vuelve consciente del cl\u00faster: si una etapa falla o sus dependencias cambian, SLURM maneja la asignaci\u00f3n de recursos para volver a ejecutar solo las etapas necesarias.<\/p>\n<h3>Consideraciones de almacenamiento en cl\u00faster<\/h3>\n<p>El almacenamiento remoto de DVC funciona bien con sistemas de archivos de cl\u00faster. Puede configurar DVC para utilizar el sistema de archivos GPFS Lustre o GPFS como un DVC Remote:<\/p>\n<pre><code class=\"language-bash\"># Configure a cluster storage remote\ndvc remote modify cluster_storage token_url \"https:\/\/cluster-storage.example.com\"\n<\/code><\/pre>\n<p>Esto evita la sobrecarga de copiar datos hacia\/desde el almacenamiento en la nube externo y mantiene la canalizaci\u00f3n autocontenida dentro de la jerarqu\u00eda de almacenamiento del cl\u00faster.<\/p>\n<h2>Seguimiento de procedencia W3C Prov-JSON<\/h2>\n<p>Si bien DVC rastrea las etapas de la canalizaci\u00f3n y las versiones de datos, no produce de forma nativa un gr\u00e1fico de procedencia accionable por m\u00e1quina. Para eso, necesita un est\u00e1ndar de procedencia, y el formato emergente es W3C Prov-JSON.<\/p>\n<p>YPROV4ML (ARXIV julio de 2025) implementa la procedencia W3C Prov-JSON con modificaciones m\u00ednimas de c\u00f3digo. captura:<\/p>\n<ul>\n<li><strong>Qui\u00e9n<\/strong> ejecut\u00f3 el experimento (identidad de usuario)<\/li>\n<li><strong>Qu\u00e9<\/strong> se utilizaron los datos y el c\u00f3digo (origen de origen)<\/li>\n<li><strong>c\u00f3mo<\/strong> corri\u00f3 el experimento (procedencia de ejecuci\u00f3n)<\/li>\n<li><strong>Por qu\u00e9<\/strong> (motivaci\u00f3n opcional, vinculada a los objetivos de la investigaci\u00f3n)<\/li>\n<\/ul>\n<p>La salida es un gr\u00e1fico Prov-JSON: un gr\u00e1fico dirigido donde los nodos representan entidades (archivos, par\u00e1metros, confirmaciones de c\u00f3digo) y los bordes representan relaciones (derivado, producido por, usado por). Este formato permite:<\/p>\n<ul>\n<li><strong>Interoperabilidad entre sistemas de procedencia<\/strong>: Prov-JSON es legible por m\u00e1quina y se puede consultar con bases de datos SPARQL o Graph<\/li>\n<li><strong>Cumplimiento de datos justos<\/strong>: los gr\u00e1ficos Prov-JSON cumplen los principios justos al documentar las condiciones de linaje y reutilizaci\u00f3n de datos<\/li>\n<li><strong>Colaboraci\u00f3n interinstitucional<\/strong>: Prov-JSON es un est\u00e1ndar W3C, por lo que los gr\u00e1ficos de procedencia de diferentes instituciones son compatibles<\/li>\n<\/ul>\n<h3>Prov-JSON vs Ro-Crate<\/h3>\n<p>Es \u00fatil distinguir Prov-JSON de RO-Crate, ya que ambos aparecen en discusiones de reproducibilidad:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aspecto<\/th>\n<th>caja de cambio<\/th>\n<th>Promoci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Prop\u00f3sito<\/td>\n<td>Formato de paquete para metadatos enriquecidos<\/td>\n<td>Formato de datos para gr\u00e1ficos de procedencia<\/td>\n<\/tr>\n<tr>\n<td>Alcance<\/td>\n<td>Conjunto de datos completo + recursos asociados<\/td>\n<td>Ejecuci\u00f3n de linaje y dependencias<\/td>\n<\/tr>\n<tr>\n<td>Formato<\/td>\n<td>JSON-LD<\/td>\n<td>JSON (est\u00e1ndar PROV)<\/td>\n<\/tr>\n<tr>\n<td>interoperabilidad<\/td>\n<td>Paquete aut\u00f3nomo<\/td>\n<td>Basado en gr\u00e1ficos, consultable<\/td>\n<\/tr>\n<tr>\n<td>Relaci\u00f3n<\/td>\n<td>Complementaria, no compitiendo<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Abordan diferentes capas de reproducibilidad. RO-Crate empaqueta su conjunto de datos con metadatos. Prov-JSON rastrea el linaje computacional de c\u00f3mo se produjo ese conjunto de datos. El uso de ambos proporciona una reproducibilidad completa: \u00abAqu\u00ed est\u00e1n los datos\u00bb (ro-Crate) m\u00e1s \u00abAs\u00ed es como se produjo\u00bb (Prov-JSON).<\/p>\n<h2>Cu\u00e1ndo usar DVC vs Datalad vs Bibliotecas compatibles con Prov<\/h2>\n<p>Elegir entre DVC, Datalad y bibliotecas compatibles con Prov depende de sus patrones de flujo de trabajo:<\/p>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>dvc<\/th>\n<th>drogadicto<\/th>\n<th>Bibliotecas de PRO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Caso de uso principal<\/td>\n<td>Experimentos orientados a tuber\u00edas<\/td>\n<td>Curaci\u00f3n de datos a largo plazo<\/td>\n<td>procedencia accionable a m\u00e1quina<\/td>\n<\/tr>\n<tr>\n<td>Tama\u00f1o de los datos<\/td>\n<td>Archivos grandes (modelos, simulaciones)<\/td>\n<td>Grandes conjuntos de datos distribuidos<\/td>\n<td>N\/A (enfocado en metadatos)<\/td>\n<\/tr>\n<tr>\n<td>Modelo de ejecuci\u00f3n<\/td>\n<td>Pipeline basado en etapas (<code>dvc repro<\/code>)<\/td>\n<td>Basado en comandos (<code>datalad run<\/code>)<\/td>\n<td>Basado en decorador<\/td>\n<\/tr>\n<tr>\n<td>Integraci\u00f3n HPC<\/td>\n<td><code>srun dvc repro<\/code><\/td>\n<td>Git-anexo nativo + SSH<\/td>\n<td>configurable<\/td>\n<\/tr>\n<tr>\n<td>Salida de procedencia<\/td>\n<td><code>.dvc<\/code> Archivos + Historial de Git<\/td>\n<td>Enlaces simb\u00f3licos de Git-Anex + registro de Git<\/td>\n<td>Gr\u00e1fico Provincia JSON<\/td>\n<\/tr>\n<tr>\n<td>mejor para<\/td>\n<td>Materiales-Ciencias de Ciencias, Barridos de Par\u00e1metros<\/td>\n<td>Curaci\u00f3n de repositorios a largo plazo, cumplimiento de ofertas<\/td>\n<td>Datos justos, procedencia interinstitucional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>DVC es adecuado para usted si:<\/h3>\n<ul>\n<li>Su flujo de trabajo tiene varias etapas dependientes (relajaci\u00f3n \u2192 c\u00e1lculo de propiedades \u2192 visualizaci\u00f3n)<\/li>\n<li>Necesita barridos de par\u00e1metros con repetici\u00f3n autom\u00e1tica<\/li>\n<li>Desea realizar un seguimiento de qu\u00e9 combinaci\u00f3n de par\u00e1metros produjo el resultado de energ\u00eda m\u00e1s baja<\/li>\n<\/ul>\n<h3>Datalad es adecuado para usted si:<\/h3>\n<ul>\n<li>Est\u00e1s curando un repositorio de conjunto de datos a largo plazo<\/li>\n<li>Necesita enlaces simb\u00f3licos de Git-Anex para un manejo eficiente de archivos grandes<\/li>\n<li>Est\u00e1s trabajando con conjuntos de datos distribuidos en todas las instituciones<\/li>\n<li>Necesitas Cumplimiento de Ofertas (Com\u00fan en Neuroimagen)<\/li>\n<\/ul>\n<h3>Las bibliotecas que cumplen con Prov son adecuadas para usted si:<\/h3>\n<ul>\n<li>Necesita procedencia accionable a m\u00e1quina para un cumplimiento justo<\/li>\n<li>Desea un gr\u00e1fico de procedencia consultable para el linaje de datos<\/li>\n<li>Est\u00e1s colaborando entre instituciones con diferentes sistemas de procedencia<\/li>\n<li>Est\u00e1s publicando en un repositorio de datos justo<\/li>\n<\/ul>\n<h2>Poni\u00e9ndolo en com\u00fan, un flujo de trabajo pr\u00e1ctico<\/h2>\n<p>Aqu\u00ed hay un patr\u00f3n de flujo de trabajo pr\u00e1ctico que combina todos los conceptos anteriores:<\/p>\n<pre><code class=\"language-bash\"># 1. Initialize the repository\ngit init\ndvc init\n\n# 2. Add the data\ndvc add data\/raw_crystal_structure.xyz\n\n# 3. Run the pipeline\ndvc repro\n\n# 4. Check the results\ndvc metrics show results\/energies.txt\n\n# 5. Run experiments with different parameters\ndvc exp run -S sim.tolerance=1e-8 --set-param sim.cutoff_energy=550\n\n# 6. Push data and experiments to remote\ndvc push\ndvc exp push\ngit push origin main\n\n# 7. (Optional) Generate PROV-JSON provenance\npython src\/provenance.py --output provenance.json\n<\/code><\/pre>\n<p>Este patr\u00f3n garantiza que cada resultado de la simulaci\u00f3n se pueda rastrear hasta su versi\u00f3n de datos exacta, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros. La salida Prov-JSON (paso 7) agrega una capa de procedencia accionable por m\u00e1quina en la parte superior de la tuber\u00eda de DVC.<\/p>\n<h2>Errores comunes: qu\u00e9 evitar<\/h2>\n<p><strong>Error 1: Versiones de todo<\/strong> \u2014 No ejecute <code>dvc add<\/code> en cada archivo de salida. Solo realice un seguimiento de los archivos que son entradas a etapas posteriores o que representan los resultados finales. Los archivos intermedios (como los arreglos de fuerza sin procesar) deben permanecer en Git o ser excluidos por completo. La adici\u00f3n excesiva crea ruido de tuber\u00eda.<\/p>\n<p><strong>Error 2: Rutas de codificaci\u00f3n dura<\/strong> \u2014 No utilice rutas absolutas en <code>dvc.yaml<\/code>. Utilice rutas relativas para que la canalizaci\u00f3n funcione en diferentes m\u00e1quinas y configuraciones de cl\u00faster.<\/p>\n<p><strong>Error 3: Mezcla de tipos de datos<\/strong> \u2014 No coloque los par\u00e1metros de simulaci\u00f3n y los puntos de control del modelo en el mismo archivo <code>.dvc<\/code>. Mantenga los tipos de datos separados para evitar conflictos de cach\u00e9.<\/p>\n<p><strong>Error 4: Ignorar la procedencia<\/strong> \u2014 Los archivos DVC por s\u00ed solos no son suficientes para el cumplimiento justo. Si su instituci\u00f3n requiere gr\u00e1ficos de procedencia, empareje DVC con salida Prov-JSON (YPROV4ML) o RO-Crate Package.<\/p>\n<p><strong>Error 5: Olvidar <code>params.yaml<\/code><\/strong> \u2014 Si los par\u00e1metros de c\u00f3digo r\u00edgido en sus scripts en lugar de aislarlos en <code>params.yaml<\/code>, el seguimiento de par\u00e1metros de DVC se vuelve in\u00fatil. Utilice siempre <code>params.yaml<\/code> para los par\u00e1metros de simulaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>DVC transforma los flujos de trabajo cient\u00edficos de procesos fr\u00e1giles y dependientes de la memoria en canalizaciones deterministas y conscientes de la dependencia. La informaci\u00f3n clave es que <code>dvc.yaml<\/code> archivos de canalizaci\u00f3n y <code>params.yaml<\/code> aislamiento de par\u00e1metros crean \u00abreproducibilidad en versi\u00f3n\u00bb: la capacidad de reconstruir no solo un resultado, sino el estado experimental exacto (versi\u00f3n de datos + code commit + archivo de par\u00e1metros) que lo produjo. Esto va m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) y m\u00e1s all\u00e1 de Git (que no pueden manejar grandes conjuntos de datos).<\/p>\n<p>Para la integraci\u00f3n de HPC, el envoltorio <code>srun<\/code> de SLURM permite la ejecuci\u00f3n de canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual. Para la procedencia, W3C Prov-JSON (YPROPR4ML) surge como un formato interoperable complementario al empaque de RO-Crate, lo que permite un linaje de datos accionable por m\u00e1quina que satisface los requisitos de cumplimiento justo.<\/p>\n<p>La elecci\u00f3n entre DVC, Datalad y bibliotecas compatibles con ProV depende de sus patrones de flujo de trabajo: DVC para experimentos orientados a canalizaciones, Datalad para curaci\u00f3n de datos a largo plazo y bibliotecas PROP para gr\u00e1ficos de procedencia accionables por m\u00e1quina. La mayor\u00eda de los equipos de simulaci\u00f3n se benefician del uso de DVC para la ejecuci\u00f3n de la canalizaci\u00f3n y Prov-JSON para el seguimiento de procedencias: las dos herramientas son complementarias, no compiten.<\/p>\n<hr>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/reproducibility-workflows-beyond-containers-data-versioning-and-provenance-tracking\/\">Reproducibilidad m\u00e1s all\u00e1 de los contenedores<\/a> \u2014 Cubre los conceptos b\u00e1sicos de DVC, el envase de procedencia de caja RO-Crate y los patrones de reproducibilidad basados en contenedores<\/li>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">Gesti\u00f3n de problemas de PDE a gran escala<\/a> \u2014 Discute la gesti\u00f3n de recursos de cl\u00faster y Flujos de trabajo de HPC<\/li>\n<li><a href=\"https:\/\/matforge.org\/verification-vs-validation-in-scientific-simulations-a-practical-guide\/\">Verificaci\u00f3n vs validaci\u00f3n en simulaciones cient\u00edficas<\/a> \u2014 explica la reproducibilidad m\u00e1s amplia Contexto para los resultados de simulaci\u00f3n<\/li>\n<\/ul>\n","protected":false,"raw":"<h1>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos<\/h1>\n<p>El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 <strong>combinaci\u00f3n espec\u00edfica<\/strong> de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros produjo un resultado particular. Esa distinci\u00f3n es lo que separa un fr\u00e1gil flujo de trabajo experimental de una canalizaci\u00f3n de simulaci\u00f3n reproducible.<\/p>\n<p>La herramienta m\u00e1s ampliamente adoptada para esto es DVC (Data Version Control), que ampl\u00eda el modelo de versiones de Git para manejar grandes conjuntos de datos y etapas de canalizaci\u00f3n. Este art\u00edculo cubre la implementaci\u00f3n pr\u00e1ctica de DVC para flujos de trabajo cient\u00edficos: construcci\u00f3n de tuber\u00edas con <code>dvc.yaml<\/code>, aislamiento de par\u00e1metros con <code>params.yaml<\/code>, integraci\u00f3n HPC\/SLURM y seguimiento de procedencia de W3C Prov-JSON, para que pueda crear campa\u00f1as de simulaci\u00f3n deterministas que sobreviven a la rotaci\u00f3n de equipos, la migraci\u00f3n de hardware y los ciclos de vida de los proyectos durante a\u00f1os.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li><strong>Valor central de DVC<\/strong>: Los archivos de canalizaci\u00f3n (<code>dvc.yaml<\/code>) hacen que las simulaciones sean conscientes de la dependencia, por lo que <code>dvc repro<\/code> vuelve a ejecutar solo lo que cambi\u00f3<\/li>\n<li><strong>Reproductibilidad versionada<\/strong>: DVC vincula las instant\u00e1neas de datos (<code>.dvc<\/code> archivos), confirmaciones de c\u00f3digo (git) y archivos de par\u00e1metros (<code>params.yaml<\/code>) en unidades de experimento reproducibles<\/li>\n<li><strong>Integraci\u00f3n de HPC<\/strong>: la programaci\u00f3n de lotes de SLURM envuelve el DVC para la ejecuci\u00f3n de la canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual<\/li>\n<li><strong>Est\u00e1ndares de procedencia<\/strong>: W3C Prov-JSON (YPROV4ML) surge como un formato interoperable complementario al empaque RO-Crate<\/li>\n<li><strong>DVC vs Datalad<\/strong>: elija DVC para experimentos orientados a canalizaciones; Elija Datalad para la curaci\u00f3n de datos a largo plazo y conjuntos de datos distribuidos<\/li>\n<\/ul>\n<h2>Por qu\u00e9 falla el control de versiones est\u00e1ndar para los flujos de trabajo de simulaci\u00f3n<\/h2>\n<p>Git es excelente para el seguimiento de los cambios de c\u00f3digo. Es terrible para el seguimiento de los cambios de datos.<\/p>\n<p>Cuando ejecuta un c\u00e1lculo de relajaci\u00f3n DFT, Git no puede almacenar el archivo de estructura de cristales resultante <code>.xyz<\/code> (a menudo decenas de MB). Puede copiarlo a una unidad compartida, o agregar su hash SHA-256 a un archivo de texto, o depender de la memoria. Los tres enfoques se rompen cuando cambia la fuente de datos, cuando necesita compartir con colaboradores que no tienen acceso a la unidad compartida, o cuando regresa seis meses despu\u00e9s y olvida qu\u00e9 conjunto de par\u00e1metros produjo la estructura de menor energ\u00eda.<\/p>\n<p>Las herramientas de versionado de datos resuelven esto desacoplando <strong>seguimiento de datos<\/strong> desde <strong>Seguimiento de c\u00f3digo<\/strong>. Almacenan archivos reales en almacenamiento remoto (Google Drive, S3, un NAS compartido o incluso otro repositorio de Git) y registran archivos de puntero ligeros en el repositorio de Git. Los archivos de puntero (normalmente peque\u00f1os archivos <code>.dvc<\/code> o las referencias de enlaces simb\u00f3licos de Git-Annex contienen metadatos (sunci\u00f3n de comprobaci\u00f3n, ubicaci\u00f3n remota, etiqueta de versi\u00f3n) sin duplicar los datos reales.<\/p>\n<p>Esta separaci\u00f3n es importante para los flujos de trabajo de simulaci\u00f3n porque el volumen de datos se escala independientemente del volumen de c\u00f3digo. Una sola campa\u00f1a de simulaci\u00f3n puede producir miles de archivos de trayectoria, mientras que los scripts de Python que los generan permanecen en unos pocos cientos de l\u00edneas.<\/p>\n<h3>La brecha de la tuber\u00eda<\/h3>\n<p>La mayor\u00eda de los investigadores comienzan con el seguimiento de datos ad-hoc: un script bash que ejecuta c\u00e1lculos en secuencia, con los resultados copiados en un directorio <code>results\/<\/code> y los n\u00fameros finales pegados en una hoja de Google. Esto funciona para peque\u00f1os proyectos. Se descompone cuando:<\/p>\n<ol>\n<li><strong>Re-Ejecuci\u00f3n con diferentes par\u00e1metros<\/strong> \u2014 Debe recordar qu\u00e9 archivo <code>params.yaml<\/code> se utiliz\u00f3 y volver a ejecutar s\u00f3lo las etapas modificadas<\/li>\n<li><strong>Errores de depuraci\u00f3n<\/strong>: debe saber si el error proviene de da\u00f1os de datos, cambios de c\u00f3digo o desajuste de par\u00e1metros<\/li>\n<li><strong>Pasa de equipo<\/strong> \u2014 Un nuevo estudiante no puede reconstruir la canalizaci\u00f3n a partir de un script <code>bash<\/code> y una carpeta de archivos hu\u00e9rfanos<\/li>\n<\/ol>\n<p>El archivo de definici\u00f3n de canalizaci\u00f3n de DVC (<code>dvc.yaml<\/code>) aborda esta brecha al declarar etapas con dependencias y salidas expl\u00edcitas. Cada etapa se vuelve a ejecutar solo cuando cambian sus dependencias (<code>dvc repro &lt;stage&gt;<\/code>), lo que hace que las campa\u00f1as de simulaci\u00f3n sean m\u00e1s eficientes al volver a ejecutar c\u00e1lculos con diferentes par\u00e1metros.<\/p>\n<h2>Construcci\u00f3n de tuber\u00edas de DVC para flujos de trabajo cient\u00edficos<\/h2>\n<p>Un archivo de canalizaci\u00f3n de DVC es un documento YAML declarativo que mapea c\u00f3mo sus pasos de simulaci\u00f3n dependen unos de otros. Aqu\u00ed hay un ejemplo concreto para un flujo de trabajo de ciencia de materiales computacionales:<\/p>\n<pre><code class=\"language-yaml\"># dvc.yaml \u2014 DFT relaxation and energy calculation pipeline\n\nstages:\n  relax:\n    cmd: python src\/relax.py\n    deps:\n    - data\/raw_crystal_structure.xyz\n    - src\/relax.py\n    params:\n    - params.yaml\n    outs:\n    - results\/relaxed_structure.xyz\n\n  energy:\n    cmd: python src\/energy.py\n    deps:\n    - results\/relaxed_structure.xyz\n    - src\/energy.py\n    params:\n    - params.yaml\n    outs:\n    - results\/energies.txt\n    metrics:\n    - results\/energies.txt\n\n  visualize:\n    cmd: python src\/plot.py\n    deps:\n    - results\/energies.txt\n    - src\/plot.py\n    outs:\n    - figures\/energy_plot.png\n<\/code><\/pre>\n<p>Cada etapa declara:<\/p>\n<ul>\n<li><strong><code>cmd<\/code><\/strong>: El comando que genera las salidas de esta etapa<\/li>\n<li><strong><code>deps<\/code><\/strong>: archivos que, si se cambia, activan la repetici\u00f3n de esta etapa<\/li>\n<li><strong><code>params<\/code><\/strong>: Archivos de par\u00e1metros que, si se cambia, activan la repetici\u00f3n de esta etapa.<\/li>\n<li><strong><code>outs<\/code><\/strong>: archivos producidos por esta etapa (seguido como versiones de datos)<\/li>\n<li><strong><code>metrics<\/code><\/strong>: archivos que DVC rastrea num\u00e9ricamente para la comparaci\u00f3n de experimentos<\/li>\n<\/ul>\n<h3>Por qu\u00e9 <code>params.yaml<\/code> importa<\/h3>\n<p>El archivo <code>params.yaml<\/code> a\u00edsla los par\u00e1metros de simulaci\u00f3n de los scripts de ejecuci\u00f3n. Esto es fundamental para los flujos de trabajo de Ciencias de Materiales donde el mismo c\u00f3digo de simulaci\u00f3n se ejecuta cientos de veces con diferentes par\u00e1metros:<\/p>\n<pre><code class=\"language-yaml\"># params.yaml\nsimulator:\n  cutoff_energy: 500  # eV\n  kpoints: [8, 8, 8]\n  tolerance: 1e-6\n  \noptimization:\n  max_steps: 200\n  algorithm: ionic\n<\/code><\/pre>\n<p>Cuando cambia <code>tolerance<\/code> de <code>1e-6<\/code> a <code>1e-8<\/code> y ejecuta <code>dvc repro<\/code>, DVC detecta el cambio de <code>params.yaml<\/code> y vuelve a ejecutar todas las etapas que dependen de \u00e9l. El archivo <code>relaxed_structure.xyz<\/code> resultante obtiene una nueva etiqueta de versi\u00f3n. La versi\u00f3n anterior permanece disponible en la memoria cach\u00e9: no pierdes carreras hist\u00f3ricas.<\/p>\n<p>Para los barridos de par\u00e1metros, puede usar <code>--set-param<\/code> para anular los valores sin modificar el archivo:<\/p>\n<pre><code class=\"language-bash\">dvc exp run --set-param sim.tolerance=1e-8 --set-param sim.cutoff_energy=450\n<\/code><\/pre>\n<p>Esto crea una nueva rama de experimento, que conserva tanto las ejecuciones originales como las modificadas en su historial de canalizaciones.<\/p>\n<h2>Reproducibilidad versionada: contribuci\u00f3n conceptual del DVC<\/h2>\n<p>El blog de DVC (diciembre de 2021) introdujo la \"reproducibilidad en versiones\" como la capacidad de recrear no solo un resultado, sino el <strong>estado experimental exacto<\/strong> que lo produjo. Esto distingue el DVC de la versi\u00f3n gen\u00e9rica:<\/p>\n<ul>\n<li><strong>Versionado est\u00e1ndar<\/strong> Realiza un seguimiento de los cambios en los archivos a lo largo del tiempo (prop\u00f3sito de Git)<\/li>\n<li><strong>Reproducibilidad versionada<\/strong> Realiza un seguimiento de qu\u00e9 versi\u00f3n de datos, confirmaci\u00f3n de c\u00f3digo y combinaci\u00f3n de archivos de par\u00e1metros espec\u00edficos produjo un resultado determinado (prop\u00f3sito de DVC)<\/li>\n<\/ul>\n<p>DVC logra esto al vincular tres artefactos versionados independientemente:<\/p>\n<table>\n<thead>\n<tr>\n<th>Artefacto<\/th>\n<th>Sistema de versiones<\/th>\n<th>lo que rastrea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.dvc<\/code> Archivos de puntero<\/td>\n<td>dvc<\/td>\n<td>Versi\u00f3n del archivo de datos + ubicaci\u00f3n remota + suma de verificaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>GIT comete<\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n de c\u00f3digo + mensaje de confirmaci\u00f3n + diferencial<\/td>\n<\/tr>\n<tr>\n<td><code>params.yaml<\/code><\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n del archivo de par\u00e1metros + cambios en el nivel del campo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La combinaci\u00f3n de estos tres crea una unidad reproducible: un \"experimento versionado\" que se puede reconstruir de forma aislada. Esto importa para la simulaci\u00f3n porque los experimentos se refinan iterativamente. Los investigadores necesitan saber \"qu\u00e9 funcion\u00f3\" y poder reproducirlo sin volver a ejecutar cada paso intermedio.<\/p>\n<h3>Implicaciones pr\u00e1cticas<\/h3>\n<p>Cuando un revisor solicita los datos detr\u00e1s de una figura publicada, puede proporcionar:<\/p>\n<ol>\n<li>El hash de confirmaci\u00f3n de Git (versi\u00f3n de c\u00f3digo)<\/li>\n<li>La referencia del archivo de puntero <code>.dvc<\/code> (versi\u00f3n de datos)<\/li>\n<li>El archivo <code>params.yaml<\/code> en ese compromiso (versi\u00f3n de par\u00e1metro)<\/li>\n<\/ol>\n<p>Combinados, estos tres artefactos son suficientes para reproducir el resultado en cualquier m\u00e1quina. Este es el est\u00e1ndar de oro para la reproducibilidad de la simulaci\u00f3n: mucho m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) o los repositorios de Git desnudos (que no pueden manejar datos de gran tama\u00f1o).<\/p>\n<h2>Colas de experimentos y gesti\u00f3n<\/h2>\n<p>La gesti\u00f3n de experimentos de DVC (<code>dvc exp<\/code>) extiende el modelo de canalizaci\u00f3n para admitir experimentos concurrentes y en cola:<\/p>\n<pre><code class=\"language-bash\"># Run a single experiment with custom parameters\ndvc exp run -S sim.tolerance=1e-8\n\n# Queue multiple experiments\ndvc exp run --queue -S sim.tolerance=1e-8\ndvc exp run --queue -S sim.tolerance=1e-6\ndvc exp run --queue -S sim.tolerance=1e-5\n\n# Execute queued experiments\ndvc exp run\n<\/code><\/pre>\n<p>El indicador <code>--queue<\/code> difiere la ejecuci\u00f3n, lo que le permite preparar m\u00faltiples experimentos y ejecutarlos por lotes de forma secuencial. Esto es valioso para los experimentos computacionales que se ejecutan durante horas o d\u00edas; puede poner en cola un barrido de par\u00e1metros durante la noche sin iniciar manualmente cada ejecuci\u00f3n.<\/p>\n<p>Para la comparaci\u00f3n de experimentos, DVClive proporciona seguimiento de m\u00e9tricas en tiempo real:<\/p>\n<pre><code class=\"language-python\"># src\/metrics.py \u2014 DVCLive integration\nfrom dvclive import Live\n\nwith Live() as live:\n    for step in range(n_iterations):\n        result = run_step(step)\n        live.step = step\n        live.log(\"energy\", result[\"total_energy\"])\n        live.log(\"forces\", result[\"max_force\"])\n<\/code><\/pre>\n<p>Esto produce un panel de comparaci\u00f3n interactivo donde puede ver c\u00f3mo evolucionan la energ\u00eda y las fuerzas a trav\u00e9s de los barridos de par\u00e1metros.<\/p>\n<h2>Ejecuci\u00f3n de canalizaciones de DVC en cl\u00fasteres de HPC<\/h2>\n<p>La mayor\u00eda de los cient\u00edficos computacionales no ejecutan tuber\u00edas en computadoras port\u00e1tiles. Los ejecutan en cl\u00fasteres con SLURM, PBS o programadores LSF. DVC se integra con SLURM a trav\u00e9s de la envoltura <code>srun<\/code>, permitiendo la ejecuci\u00f3n de canalizaci\u00f3n nativa de cl\u00faster:<\/p>\n<pre><code class=\"language-bash\"># Run a single pipeline stage with SLURM resource allocation\nsrun dvc repro -n relax --job slurm-job.sh\n\n# Run all pipeline stages on the cluster\nsrun dvc repro\n<\/code><\/pre>\n<p>El indicador <code>--job<\/code> le dice a DVC que ejecute cada etapa a trav\u00e9s del programador de trabajo de SLURM, manejando autom\u00e1ticamente:<\/p>\n<ul>\n<li>Asignaci\u00f3n de recursos espec\u00edficos del cl\u00faster (memoria, CPU, nodos GPU)<\/li>\n<li>Ejecuci\u00f3n en modo por lotes sin intervenci\u00f3n manual<\/li>\n<li>Cola de trabajo autom\u00e1tica para etapas de tuber\u00eda<\/li>\n<li>Integraci\u00f3n con sistemas de archivos y almacenamiento espec\u00edficos de cl\u00faster (lustre, GPFS, BEEGFS)<\/li>\n<\/ul>\n<p>ARXIV 2505.06558v2 (septiembre de 2025) demuestra esta integraci\u00f3n para los flujos de trabajo de materiales-ciencia que ejecutan c\u00e1lculos DFT en cl\u00fasteres HPC. La ventaja clave es que <code>dvc repro<\/code> se vuelve consciente del cl\u00faster: si una etapa falla o sus dependencias cambian, SLURM maneja la asignaci\u00f3n de recursos para volver a ejecutar solo las etapas necesarias.<\/p>\n<h3>Consideraciones de almacenamiento en cl\u00faster<\/h3>\n<p>El almacenamiento remoto de DVC funciona bien con sistemas de archivos de cl\u00faster. Puede configurar DVC para utilizar el sistema de archivos GPFS Lustre o GPFS como un DVC Remote:<\/p>\n<pre><code class=\"language-bash\"># Configure a cluster storage remote\ndvc remote modify cluster_storage token_url \"https:\/\/cluster-storage.example.com\"\n<\/code><\/pre>\n<p>Esto evita la sobrecarga de copiar datos hacia\/desde el almacenamiento en la nube externo y mantiene la canalizaci\u00f3n autocontenida dentro de la jerarqu\u00eda de almacenamiento del cl\u00faster.<\/p>\n<h2>Seguimiento de procedencia W3C Prov-JSON<\/h2>\n<p>Si bien DVC rastrea las etapas de la canalizaci\u00f3n y las versiones de datos, no produce de forma nativa un gr\u00e1fico de procedencia accionable por m\u00e1quina. Para eso, necesita un est\u00e1ndar de procedencia, y el formato emergente es W3C Prov-JSON.<\/p>\n<p>YPROV4ML (ARXIV julio de 2025) implementa la procedencia W3C Prov-JSON con modificaciones m\u00ednimas de c\u00f3digo. captura:<\/p>\n<ul>\n<li><strong>Qui\u00e9n<\/strong> ejecut\u00f3 el experimento (identidad de usuario)<\/li>\n<li><strong>Qu\u00e9<\/strong> se utilizaron los datos y el c\u00f3digo (origen de origen)<\/li>\n<li><strong>c\u00f3mo<\/strong> corri\u00f3 el experimento (procedencia de ejecuci\u00f3n)<\/li>\n<li><strong>Por qu\u00e9<\/strong> (motivaci\u00f3n opcional, vinculada a los objetivos de la investigaci\u00f3n)<\/li>\n<\/ul>\n<p>La salida es un gr\u00e1fico Prov-JSON: un gr\u00e1fico dirigido donde los nodos representan entidades (archivos, par\u00e1metros, confirmaciones de c\u00f3digo) y los bordes representan relaciones (derivado, producido por, usado por). Este formato permite:<\/p>\n<ul>\n<li><strong>Interoperabilidad entre sistemas de procedencia<\/strong>: Prov-JSON es legible por m\u00e1quina y se puede consultar con bases de datos SPARQL o Graph<\/li>\n<li><strong>Cumplimiento de datos justos<\/strong>: los gr\u00e1ficos Prov-JSON cumplen los principios justos al documentar las condiciones de linaje y reutilizaci\u00f3n de datos<\/li>\n<li><strong>Colaboraci\u00f3n interinstitucional<\/strong>: Prov-JSON es un est\u00e1ndar W3C, por lo que los gr\u00e1ficos de procedencia de diferentes instituciones son compatibles<\/li>\n<\/ul>\n<h3>Prov-JSON vs Ro-Crate<\/h3>\n<p>Es \u00fatil distinguir Prov-JSON de RO-Crate, ya que ambos aparecen en discusiones de reproducibilidad:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aspecto<\/th>\n<th>caja de cambio<\/th>\n<th>Promoci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Prop\u00f3sito<\/td>\n<td>Formato de paquete para metadatos enriquecidos<\/td>\n<td>Formato de datos para gr\u00e1ficos de procedencia<\/td>\n<\/tr>\n<tr>\n<td>Alcance<\/td>\n<td>Conjunto de datos completo + recursos asociados<\/td>\n<td>Ejecuci\u00f3n de linaje y dependencias<\/td>\n<\/tr>\n<tr>\n<td>Formato<\/td>\n<td>JSON-LD<\/td>\n<td>JSON (est\u00e1ndar PROV)<\/td>\n<\/tr>\n<tr>\n<td>interoperabilidad<\/td>\n<td>Paquete aut\u00f3nomo<\/td>\n<td>Basado en gr\u00e1ficos, consultable<\/td>\n<\/tr>\n<tr>\n<td>Relaci\u00f3n<\/td>\n<td>Complementaria, no compitiendo<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Abordan diferentes capas de reproducibilidad. RO-Crate empaqueta su conjunto de datos con metadatos. Prov-JSON rastrea el linaje computacional de c\u00f3mo se produjo ese conjunto de datos. El uso de ambos proporciona una reproducibilidad completa: \"Aqu\u00ed est\u00e1n los datos\" (ro-Crate) m\u00e1s \"As\u00ed es como se produjo\" (Prov-JSON).<\/p>\n<h2>Cu\u00e1ndo usar DVC vs Datalad vs Bibliotecas compatibles con Prov<\/h2>\n<p>Elegir entre DVC, Datalad y bibliotecas compatibles con Prov depende de sus patrones de flujo de trabajo:<\/p>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>dvc<\/th>\n<th>drogadicto<\/th>\n<th>Bibliotecas de PRO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Caso de uso principal<\/td>\n<td>Experimentos orientados a tuber\u00edas<\/td>\n<td>Curaci\u00f3n de datos a largo plazo<\/td>\n<td>procedencia accionable a m\u00e1quina<\/td>\n<\/tr>\n<tr>\n<td>Tama\u00f1o de los datos<\/td>\n<td>Archivos grandes (modelos, simulaciones)<\/td>\n<td>Grandes conjuntos de datos distribuidos<\/td>\n<td>N\/A (enfocado en metadatos)<\/td>\n<\/tr>\n<tr>\n<td>Modelo de ejecuci\u00f3n<\/td>\n<td>Pipeline basado en etapas (<code>dvc repro<\/code>)<\/td>\n<td>Basado en comandos (<code>datalad run<\/code>)<\/td>\n<td>Basado en decorador<\/td>\n<\/tr>\n<tr>\n<td>Integraci\u00f3n HPC<\/td>\n<td><code>srun dvc repro<\/code><\/td>\n<td>Git-anexo nativo + SSH<\/td>\n<td>configurable<\/td>\n<\/tr>\n<tr>\n<td>Salida de procedencia<\/td>\n<td><code>.dvc<\/code> Archivos + Historial de Git<\/td>\n<td>Enlaces simb\u00f3licos de Git-Anex + registro de Git<\/td>\n<td>Gr\u00e1fico Provincia JSON<\/td>\n<\/tr>\n<tr>\n<td>mejor para<\/td>\n<td>Materiales-Ciencias de Ciencias, Barridos de Par\u00e1metros<\/td>\n<td>Curaci\u00f3n de repositorios a largo plazo, cumplimiento de ofertas<\/td>\n<td>Datos justos, procedencia interinstitucional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>DVC es adecuado para usted si:<\/h3>\n<ul>\n<li>Su flujo de trabajo tiene varias etapas dependientes (relajaci\u00f3n \u2192 c\u00e1lculo de propiedades \u2192 visualizaci\u00f3n)<\/li>\n<li>Necesita barridos de par\u00e1metros con repetici\u00f3n autom\u00e1tica<\/li>\n<li>Desea realizar un seguimiento de qu\u00e9 combinaci\u00f3n de par\u00e1metros produjo el resultado de energ\u00eda m\u00e1s baja<\/li>\n<\/ul>\n<h3>Datalad es adecuado para usted si:<\/h3>\n<ul>\n<li>Est\u00e1s curando un repositorio de conjunto de datos a largo plazo<\/li>\n<li>Necesita enlaces simb\u00f3licos de Git-Anex para un manejo eficiente de archivos grandes<\/li>\n<li>Est\u00e1s trabajando con conjuntos de datos distribuidos en todas las instituciones<\/li>\n<li>Necesitas Cumplimiento de Ofertas (Com\u00fan en Neuroimagen)<\/li>\n<\/ul>\n<h3>Las bibliotecas que cumplen con Prov son adecuadas para usted si:<\/h3>\n<ul>\n<li>Necesita procedencia accionable a m\u00e1quina para un cumplimiento justo<\/li>\n<li>Desea un gr\u00e1fico de procedencia consultable para el linaje de datos<\/li>\n<li>Est\u00e1s colaborando entre instituciones con diferentes sistemas de procedencia<\/li>\n<li>Est\u00e1s publicando en un repositorio de datos justo<\/li>\n<\/ul>\n<h2>Poni\u00e9ndolo en com\u00fan, un flujo de trabajo pr\u00e1ctico<\/h2>\n<p>Aqu\u00ed hay un patr\u00f3n de flujo de trabajo pr\u00e1ctico que combina todos los conceptos anteriores:<\/p>\n<pre><code class=\"language-bash\"># 1. Initialize the repository\ngit init\ndvc init\n\n# 2. Add the data\ndvc add data\/raw_crystal_structure.xyz\n\n# 3. Run the pipeline\ndvc repro\n\n# 4. Check the results\ndvc metrics show results\/energies.txt\n\n# 5. Run experiments with different parameters\ndvc exp run -S sim.tolerance=1e-8 --set-param sim.cutoff_energy=550\n\n# 6. Push data and experiments to remote\ndvc push\ndvc exp push\ngit push origin main\n\n# 7. (Optional) Generate PROV-JSON provenance\npython src\/provenance.py --output provenance.json\n<\/code><\/pre>\n<p>Este patr\u00f3n garantiza que cada resultado de la simulaci\u00f3n se pueda rastrear hasta su versi\u00f3n de datos exacta, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros. La salida Prov-JSON (paso 7) agrega una capa de procedencia accionable por m\u00e1quina en la parte superior de la tuber\u00eda de DVC.<\/p>\n<h2>Errores comunes: qu\u00e9 evitar<\/h2>\n<p><strong>Error 1: Versiones de todo<\/strong> \u2014 No ejecute <code>dvc add<\/code> en cada archivo de salida. Solo realice un seguimiento de los archivos que son entradas a etapas posteriores o que representan los resultados finales. Los archivos intermedios (como los arreglos de fuerza sin procesar) deben permanecer en Git o ser excluidos por completo. La adici\u00f3n excesiva crea ruido de tuber\u00eda.<\/p>\n<p><strong>Error 2: Rutas de codificaci\u00f3n dura<\/strong> \u2014 No utilice rutas absolutas en <code>dvc.yaml<\/code>. Utilice rutas relativas para que la canalizaci\u00f3n funcione en diferentes m\u00e1quinas y configuraciones de cl\u00faster.<\/p>\n<p><strong>Error 3: Mezcla de tipos de datos<\/strong> \u2014 No coloque los par\u00e1metros de simulaci\u00f3n y los puntos de control del modelo en el mismo archivo <code>.dvc<\/code>. Mantenga los tipos de datos separados para evitar conflictos de cach\u00e9.<\/p>\n<p><strong>Error 4: Ignorar la procedencia<\/strong> \u2014 Los archivos DVC por s\u00ed solos no son suficientes para el cumplimiento justo. Si su instituci\u00f3n requiere gr\u00e1ficos de procedencia, empareje DVC con salida Prov-JSON (YPROV4ML) o RO-Crate Package.<\/p>\n<p><strong>Error 5: Olvidar <code>params.yaml<\/code><\/strong> \u2014 Si los par\u00e1metros de c\u00f3digo r\u00edgido en sus scripts en lugar de aislarlos en <code>params.yaml<\/code>, el seguimiento de par\u00e1metros de DVC se vuelve in\u00fatil. Utilice siempre <code>params.yaml<\/code> para los par\u00e1metros de simulaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>DVC transforma los flujos de trabajo cient\u00edficos de procesos fr\u00e1giles y dependientes de la memoria en canalizaciones deterministas y conscientes de la dependencia. La informaci\u00f3n clave es que <code>dvc.yaml<\/code> archivos de canalizaci\u00f3n y <code>params.yaml<\/code> aislamiento de par\u00e1metros crean \"reproducibilidad en versi\u00f3n\": la capacidad de reconstruir no solo un resultado, sino el estado experimental exacto (versi\u00f3n de datos + code commit + archivo de par\u00e1metros) que lo produjo. Esto va m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) y m\u00e1s all\u00e1 de Git (que no pueden manejar grandes conjuntos de datos).<\/p>\n<p>Para la integraci\u00f3n de HPC, el envoltorio <code>srun<\/code> de SLURM permite la ejecuci\u00f3n de canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual. Para la procedencia, W3C Prov-JSON (YPROPR4ML) surge como un formato interoperable complementario al empaque de RO-Crate, lo que permite un linaje de datos accionable por m\u00e1quina que satisface los requisitos de cumplimiento justo.<\/p>\n<p>La elecci\u00f3n entre DVC, Datalad y bibliotecas compatibles con ProV depende de sus patrones de flujo de trabajo: DVC para experimentos orientados a canalizaciones, Datalad para curaci\u00f3n de datos a largo plazo y bibliotecas PROP para gr\u00e1ficos de procedencia accionables por m\u00e1quina. La mayor\u00eda de los equipos de simulaci\u00f3n se benefician del uso de DVC para la ejecuci\u00f3n de la canalizaci\u00f3n y Prov-JSON para el seguimiento de procedencias: las dos herramientas son complementarias, no compiten.<\/p>\n<hr>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/reproducibility-workflows-beyond-containers-data-versioning-and-provenance-tracking\/\">Reproducibilidad m\u00e1s all\u00e1 de los contenedores<\/a> \u2014 Cubre los conceptos b\u00e1sicos de DVC, el envase de procedencia de caja RO-Crate y los patrones de reproducibilidad basados en contenedores<\/li>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">Gesti\u00f3n de problemas de PDE a gran escala<\/a> \u2014 Discute la gesti\u00f3n de recursos de cl\u00faster y Flujos de trabajo de HPC<\/li>\n<li><a href=\"https:\/\/matforge.org\/verification-vs-validation-in-scientific-simulations-a-practical-guide\/\">Verificaci\u00f3n vs validaci\u00f3n en simulaciones cient\u00edficas<\/a> \u2014 explica la reproducibilidad m\u00e1s amplia Contexto para los resultados de la simulaci\u00f3n&lt;\/fs_write_file&gt;<br> &lt;\/tool_call&gt;<\/li>\n<\/ul>\n<p>&lt;tool_call&gt;<br> &lt;function=fs_write_file&gt;<br> &lt;par\u00e1metro=contenido&gt;<\/p>\n<h1>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos<\/h1>\n<p>El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 <strong>combinaci\u00f3n espec\u00edfica<\/strong> de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros produjo un resultado particular. Esa distinci\u00f3n es lo que separa un fr\u00e1gil flujo de trabajo experimental de una canalizaci\u00f3n de simulaci\u00f3n reproducible.<\/p>\n<p>La herramienta m\u00e1s ampliamente adoptada para esto es DVC (Data Version Control), que ampl\u00eda el modelo de versiones de Git para manejar grandes conjuntos de datos y etapas de canalizaci\u00f3n. Este art\u00edculo cubre la implementaci\u00f3n pr\u00e1ctica de DVC para flujos de trabajo cient\u00edficos: construcci\u00f3n de tuber\u00edas con <code>dvc.yaml<\/code>, aislamiento de par\u00e1metros con <code>params.yaml<\/code>, integraci\u00f3n HPC\/SLURM y seguimiento de procedencia de W3C Prov-JSON, para que pueda crear campa\u00f1as de simulaci\u00f3n deterministas que sobreviven a la rotaci\u00f3n de equipos, la migraci\u00f3n de hardware y los ciclos de vida de los proyectos durante a\u00f1os.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li><strong>Valor central de DVC<\/strong>: Los archivos de canalizaci\u00f3n (<code>dvc.yaml<\/code>) hacen que las simulaciones sean conscientes de la dependencia, por lo que <code>dvc repro<\/code> vuelve a ejecutar solo lo que cambi\u00f3<\/li>\n<li><strong>Reproductibilidad versionada<\/strong>: DVC vincula las instant\u00e1neas de datos (<code>.dvc<\/code> archivos), confirmaciones de c\u00f3digo (git) y archivos de par\u00e1metros (<code>params.yaml<\/code>) en unidades de experimento reproducibles<\/li>\n<li><strong>Integraci\u00f3n de HPC<\/strong>: la programaci\u00f3n de lotes de SLURM envuelve el DVC para la ejecuci\u00f3n de la canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual<\/li>\n<li><strong>Est\u00e1ndares de procedencia<\/strong>: W3C Prov-JSON (YPROV4ML) surge como un formato interoperable complementario al empaque RO-Crate<\/li>\n<li><strong>DVC vs Datalad<\/strong>: elija DVC para experimentos orientados a canalizaciones; Elija Datalad para la curaci\u00f3n de datos a largo plazo y conjuntos de datos distribuidos<\/li>\n<\/ul>\n<h2>Por qu\u00e9 falla el control de versiones est\u00e1ndar para los flujos de trabajo de simulaci\u00f3n<\/h2>\n<p>Git es excelente para el seguimiento de los cambios de c\u00f3digo. Es terrible para el seguimiento de los cambios de datos.<\/p>\n<p>Cuando ejecuta un c\u00e1lculo de relajaci\u00f3n DFT, Git no puede almacenar el archivo de estructura de cristales resultante <code>.xyz<\/code> (a menudo decenas de MB). Puede copiarlo a una unidad compartida, o agregar su hash SHA-256 a un archivo de texto, o depender de la memoria. Los tres enfoques se rompen cuando cambia la fuente de datos, cuando necesita compartir con colaboradores que no tienen acceso a la unidad compartida, o cuando regresa seis meses despu\u00e9s y olvida qu\u00e9 conjunto de par\u00e1metros produjo la estructura de menor energ\u00eda.<\/p>\n<p>Las herramientas de versionado de datos resuelven esto desacoplando <strong>seguimiento de datos<\/strong> desde <strong>Seguimiento de c\u00f3digo<\/strong>. Almacenan archivos reales en almacenamiento remoto (Google Drive, S3, un NAS compartido o incluso otro repositorio de Git) y registran archivos de puntero ligeros en el repositorio de Git. Los archivos de puntero (normalmente peque\u00f1os archivos <code>.dvc<\/code> o las referencias de enlaces simb\u00f3licos de Git-Annex contienen metadatos (sunci\u00f3n de comprobaci\u00f3n, ubicaci\u00f3n remota, etiqueta de versi\u00f3n) sin duplicar los datos reales.<\/p>\n<p>Esta separaci\u00f3n es importante para los flujos de trabajo de simulaci\u00f3n porque el volumen de datos se escala independientemente del volumen de c\u00f3digo. Una sola campa\u00f1a de simulaci\u00f3n puede producir miles de archivos de trayectoria, mientras que los scripts de Python que los generan permanecen en unos pocos cientos de l\u00edneas.<\/p>\n<h3>La brecha de la tuber\u00eda<\/h3>\n<p>La mayor\u00eda de los investigadores comienzan con el seguimiento de datos ad-hoc: un script bash que ejecuta c\u00e1lculos en secuencia, con los resultados copiados en un directorio <code>results\/<\/code> y los n\u00fameros finales pegados en una hoja de Google. Esto funciona para peque\u00f1os proyectos. Se descompone cuando:<\/p>\n<ol>\n<li><strong>Re-Ejecuci\u00f3n con diferentes par\u00e1metros<\/strong> \u2014 Debe recordar qu\u00e9 archivo <code>params.yaml<\/code> se utiliz\u00f3 y volver a ejecutar s\u00f3lo las etapas modificadas<\/li>\n<li><strong>Errores de depuraci\u00f3n<\/strong>: debe saber si el error proviene de da\u00f1os de datos, cambios de c\u00f3digo o desajuste de par\u00e1metros<\/li>\n<li><strong>Pasa de equipo<\/strong> \u2014 Un nuevo estudiante no puede reconstruir la canalizaci\u00f3n a partir de un script <code>bash<\/code> y una carpeta de archivos hu\u00e9rfanos<\/li>\n<\/ol>\n<p>El archivo de definici\u00f3n de canalizaci\u00f3n de DVC (<code>dvc.yaml<\/code>) aborda esta brecha al declarar etapas con dependencias y salidas expl\u00edcitas. Cada etapa se vuelve a ejecutar solo cuando cambian sus dependencias (<code>dvc repro &lt;stage&gt;<\/code>), lo que hace que las campa\u00f1as de simulaci\u00f3n sean m\u00e1s eficientes al volver a ejecutar c\u00e1lculos con diferentes par\u00e1metros.<\/p>\n<h2>Construcci\u00f3n de tuber\u00edas de DVC para flujos de trabajo cient\u00edficos<\/h2>\n<p>Un archivo de canalizaci\u00f3n de DVC es un documento YAML declarativo que mapea c\u00f3mo sus pasos de simulaci\u00f3n dependen unos de otros. Aqu\u00ed hay un ejemplo concreto para un flujo de trabajo de ciencia de materiales computacionales:<\/p>\n<pre><code class=\"language-yaml\"># dvc.yaml \u2014 DFT relaxation and energy calculation pipeline\n\nstages:\n  relax:\n    cmd: python src\/relax.py\n    deps:\n    - data\/raw_crystal_structure.xyz\n    - src\/relax.py\n    params:\n    - params.yaml\n    outs:\n    - results\/relaxed_structure.xyz\n\n  energy:\n    cmd: python src\/energy.py\n    deps:\n    - results\/relaxed_structure.xyz\n    - src\/energy.py\n    params:\n    - params.yaml\n    outs:\n    - results\/energies.txt\n    metrics:\n    - results\/energies.txt\n\n  visualize:\n    cmd: python src\/plot.py\n    deps:\n    - results\/energies.txt\n    - src\/plot.py\n    outs:\n    - figures\/energy_plot.png\n<\/code><\/pre>\n<p>Cada etapa declara:<\/p>\n<ul>\n<li><strong><code>cmd<\/code><\/strong>: El comando que genera las salidas de esta etapa<\/li>\n<li><strong><code>deps<\/code><\/strong>: archivos que, si se cambia, activan la repetici\u00f3n de esta etapa<\/li>\n<li><strong><code>params<\/code><\/strong>: Archivos de par\u00e1metros que, si se cambia, activan la repetici\u00f3n de esta etapa.<\/li>\n<li><strong><code>outs<\/code><\/strong>: archivos producidos por esta etapa (seguido como versiones de datos)<\/li>\n<li><strong><code>metrics<\/code><\/strong>: archivos que DVC rastrea num\u00e9ricamente para la comparaci\u00f3n de experimentos<\/li>\n<\/ul>\n<h3>Por qu\u00e9 <code>params.yaml<\/code> importa<\/h3>\n<p>El archivo <code>params.yaml<\/code> a\u00edsla los par\u00e1metros de simulaci\u00f3n de los scripts de ejecuci\u00f3n. Esto es fundamental para los flujos de trabajo de Ciencias de Materiales donde el mismo c\u00f3digo de simulaci\u00f3n se ejecuta cientos de veces con diferentes par\u00e1metros:<\/p>\n<pre><code class=\"language-yaml\"># params.yaml\nsimulator:\n  cutoff_energy: 500  # eV\n  kpoints: [8, 8, 8]\n  tolerance: 1e-6\n  \noptimization:\n  max_steps: 200\n  algorithm: ionic\n<\/code><\/pre>\n<p>Cuando cambia <code>tolerance<\/code> de <code>1e-6<\/code> a <code>1e-8<\/code> y ejecuta <code>dvc repro<\/code>, DVC detecta el cambio de <code>params.yaml<\/code> y vuelve a ejecutar todas las etapas que dependen de \u00e9l. El archivo <code>relaxed_structure.xyz<\/code> resultante obtiene una nueva etiqueta de versi\u00f3n. La versi\u00f3n anterior permanece disponible en la memoria cach\u00e9: no pierdes carreras hist\u00f3ricas.<\/p>\n<p>Para los barridos de par\u00e1metros, puede usar <code>--set-param<\/code> para anular los valores sin modificar el archivo:<\/p>\n<pre><code class=\"language-bash\">dvc exp run --set-param sim.tolerance=1e-8 --set-param sim.cutoff_energy=450\n<\/code><\/pre>\n<p>Esto crea una nueva rama de experimento, que conserva tanto las ejecuciones originales como las modificadas en su historial de canalizaciones.<\/p>\n<h2>Reproducibilidad versionada: contribuci\u00f3n conceptual del DVC<\/h2>\n<p>El blog de DVC (diciembre de 2021) introdujo la \"reproducibilidad en versiones\" como la capacidad de recrear no solo un resultado, sino el <strong>estado experimental exacto<\/strong> que lo produjo. Esto distingue el DVC de la versi\u00f3n gen\u00e9rica:<\/p>\n<ul>\n<li><strong>Versionado est\u00e1ndar<\/strong> Realiza un seguimiento de los cambios en los archivos a lo largo del tiempo (prop\u00f3sito de Git)<\/li>\n<li><strong>Reproducibilidad versionada<\/strong> Realiza un seguimiento de qu\u00e9 versi\u00f3n de datos, confirmaci\u00f3n de c\u00f3digo y combinaci\u00f3n de archivos de par\u00e1metros espec\u00edficos produjo un resultado determinado (prop\u00f3sito de DVC)<\/li>\n<\/ul>\n<p>DVC logra esto al vincular tres artefactos versionados independientemente:<\/p>\n<table>\n<thead>\n<tr>\n<th>Artefacto<\/th>\n<th>Sistema de versiones<\/th>\n<th>lo que rastrea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.dvc<\/code> Archivos de puntero<\/td>\n<td>dvc<\/td>\n<td>Versi\u00f3n del archivo de datos + ubicaci\u00f3n remota + suma de verificaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>GIT comete<\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n de c\u00f3digo + mensaje de confirmaci\u00f3n + diferencial<\/td>\n<\/tr>\n<tr>\n<td><code>params.yaml<\/code><\/td>\n<td>descifrador<\/td>\n<td>Versi\u00f3n del archivo de par\u00e1metros + cambios en el nivel del campo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La combinaci\u00f3n de estos tres crea una unidad reproducible: un \"experimento versionado\" que se puede reconstruir de forma aislada. Esto importa para la simulaci\u00f3n porque los experimentos se refinan iterativamente. Los investigadores necesitan saber \"qu\u00e9 funcion\u00f3\" y poder reproducirlo sin volver a ejecutar cada paso intermedio.<\/p>\n<h3>Implicaciones pr\u00e1cticas<\/h3>\n<p>Cuando un revisor solicita los datos detr\u00e1s de una figura publicada, puede proporcionar:<\/p>\n<ol>\n<li>El hash de confirmaci\u00f3n de Git (versi\u00f3n de c\u00f3digo)<\/li>\n<li>La referencia del archivo de puntero <code>.dvc<\/code> (versi\u00f3n de datos)<\/li>\n<li>El archivo <code>params.yaml<\/code> en ese compromiso (versi\u00f3n de par\u00e1metro)<\/li>\n<\/ol>\n<p>Combinados, estos tres artefactos son suficientes para reproducir el resultado en cualquier m\u00e1quina. Este es el est\u00e1ndar de oro para la reproducibilidad de la simulaci\u00f3n: mucho m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) o los repositorios de Git desnudos (que no pueden manejar datos de gran tama\u00f1o).<\/p>\n<h2>Colas de experimentos y gesti\u00f3n<\/h2>\n<p>La gesti\u00f3n de experimentos de DVC (<code>dvc exp<\/code>) extiende el modelo de canalizaci\u00f3n para admitir experimentos concurrentes y en cola:<\/p>\n<pre><code class=\"language-bash\"># Run a single experiment with custom parameters\ndvc exp run -S sim.tolerance=1e-8\n\n# Queue multiple experiments\ndvc exp run --queue -S sim.tolerance=1e-8\ndvc exp run --queue -S sim.tolerance=1e-6\ndvc exp run --queue -S sim.tolerance=1e-5\n\n# Execute queued experiments\ndvc exp run\n<\/code><\/pre>\n<p>El indicador <code>--queue<\/code> difiere la ejecuci\u00f3n, lo que le permite preparar m\u00faltiples experimentos y ejecutarlos por lotes de forma secuencial. Esto es valioso para los experimentos computacionales que se ejecutan durante horas o d\u00edas; puede poner en cola un barrido de par\u00e1metros durante la noche sin iniciar manualmente cada ejecuci\u00f3n.<\/p>\n<p>Para la comparaci\u00f3n de experimentos, DVClive proporciona seguimiento de m\u00e9tricas en tiempo real:<\/p>\n<pre><code class=\"language-python\"># src\/metrics.py \u2014 DVCLive integration\nfrom dvclive import Live\n\nwith Live() as live:\n    for step in range(n_iterations):\n        result = run_step(step)\n        live.step = step\n        live.log(\"energy\", result[\"total_energy\"])\n        live.log(\"forces\", result[\"max_force\"])\n<\/code><\/pre>\n<p>Esto produce un panel de comparaci\u00f3n interactivo donde puede ver c\u00f3mo evolucionan la energ\u00eda y las fuerzas a trav\u00e9s de los barridos de par\u00e1metros.<\/p>\n<h2>Ejecuci\u00f3n de canalizaciones de DVC en cl\u00fasteres de HPC<\/h2>\n<p>La mayor\u00eda de los cient\u00edficos computacionales no ejecutan tuber\u00edas en computadoras port\u00e1tiles. Los ejecutan en cl\u00fasteres con SLURM, PBS o programadores LSF. DVC se integra con SLURM a trav\u00e9s de la envoltura <code>srun<\/code>, permitiendo la ejecuci\u00f3n de canalizaci\u00f3n nativa de cl\u00faster:<\/p>\n<pre><code class=\"language-bash\"># Run a single pipeline stage with SLURM resource allocation\nsrun dvc repro -n relax --job slurm-job.sh\n\n# Run all pipeline stages on the cluster\nsrun dvc repro\n<\/code><\/pre>\n<p>El indicador <code>--job<\/code> le dice a DVC que ejecute cada etapa a trav\u00e9s del programador de trabajo de SLURM, manejando autom\u00e1ticamente:<\/p>\n<ul>\n<li>Asignaci\u00f3n de recursos espec\u00edficos del cl\u00faster (memoria, CPU, nodos GPU)<\/li>\n<li>Ejecuci\u00f3n en modo por lotes sin intervenci\u00f3n manual<\/li>\n<li>Cola de trabajo autom\u00e1tica para etapas de tuber\u00eda<\/li>\n<li>Integraci\u00f3n con sistemas de archivos y almacenamiento espec\u00edficos de cl\u00faster (lustre, GPFS, BEEGFS)<\/li>\n<\/ul>\n<p>ARXIV 2505.06558v2 (septiembre de 2025) demuestra esta integraci\u00f3n para los flujos de trabajo de materiales-ciencia que ejecutan c\u00e1lculos DFT en cl\u00fasteres HPC. La ventaja clave es que <code>dvc repro<\/code> se vuelve consciente del cl\u00faster: si una etapa falla o sus dependencias cambian, SLURM maneja la asignaci\u00f3n de recursos para volver a ejecutar solo las etapas necesarias.<\/p>\n<h3>Consideraciones de almacenamiento en cl\u00faster<\/h3>\n<p>El almacenamiento remoto de DVC funciona bien con sistemas de archivos de cl\u00faster. Puede configurar DVC para utilizar el sistema de archivos GPFS Lustre o GPFS como un DVC Remote:<\/p>\n<pre><code class=\"language-bash\"># Configure a cluster storage remote\ndvc remote modify cluster_storage token_url \"https:\/\/cluster-storage.example.com\"\n<\/code><\/pre>\n<p>Esto evita la sobrecarga de copiar datos hacia\/desde el almacenamiento en la nube externo y mantiene la canalizaci\u00f3n autocontenida dentro de la jerarqu\u00eda de almacenamiento del cl\u00faster.<\/p>\n<h2>Seguimiento de procedencia W3C Prov-JSON<\/h2>\n<p>Si bien DVC rastrea las etapas de la canalizaci\u00f3n y las versiones de datos, no produce de forma nativa un gr\u00e1fico de procedencia accionable por m\u00e1quina. Para eso, necesita un est\u00e1ndar de procedencia, y el formato emergente es W3C Prov-JSON.<\/p>\n<p>YPROV4ML (ARXIV julio de 2025) implementa la procedencia W3C Prov-JSON con modificaciones m\u00ednimas de c\u00f3digo. captura:<\/p>\n<ul>\n<li><strong>Qui\u00e9n<\/strong> ejecut\u00f3 el experimento (identidad de usuario)<\/li>\n<li><strong>Qu\u00e9<\/strong> se utilizaron los datos y el c\u00f3digo (origen de origen)<\/li>\n<li><strong>c\u00f3mo<\/strong> corri\u00f3 el experimento (procedencia de ejecuci\u00f3n)<\/li>\n<li><strong>Por qu\u00e9<\/strong> (motivaci\u00f3n opcional, vinculada a los objetivos de la investigaci\u00f3n)<\/li>\n<\/ul>\n<p>La salida es un gr\u00e1fico Prov-JSON: un gr\u00e1fico dirigido donde los nodos representan entidades (archivos, par\u00e1metros, confirmaciones de c\u00f3digo) y los bordes representan relaciones (derivado, producido por, usado por). Este formato permite:<\/p>\n<ul>\n<li><strong>Interoperabilidad entre sistemas de procedencia<\/strong>: Prov-JSON es legible por m\u00e1quina y se puede consultar con bases de datos SPARQL o Graph<\/li>\n<li><strong>Cumplimiento de datos justos<\/strong>: los gr\u00e1ficos Prov-JSON cumplen los principios justos al documentar las condiciones de linaje y reutilizaci\u00f3n de datos<\/li>\n<li><strong>Colaboraci\u00f3n interinstitucional<\/strong>: Prov-JSON es un est\u00e1ndar W3C, por lo que los gr\u00e1ficos de procedencia de diferentes instituciones son compatibles<\/li>\n<\/ul>\n<h3>Prov-JSON vs Ro-Crate<\/h3>\n<p>Es \u00fatil distinguir Prov-JSON de RO-Crate, ya que ambos aparecen en discusiones de reproducibilidad:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aspecto<\/th>\n<th>caja de cambio<\/th>\n<th>Promoci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Prop\u00f3sito<\/td>\n<td>Formato de paquete para metadatos enriquecidos<\/td>\n<td>Formato de datos para gr\u00e1ficos de procedencia<\/td>\n<\/tr>\n<tr>\n<td>Alcance<\/td>\n<td>Conjunto de datos completo + recursos asociados<\/td>\n<td>Ejecuci\u00f3n de linaje y dependencias<\/td>\n<\/tr>\n<tr>\n<td>Formato<\/td>\n<td>JSON-LD<\/td>\n<td>JSON (est\u00e1ndar PROV)<\/td>\n<\/tr>\n<tr>\n<td>interoperabilidad<\/td>\n<td>Paquete aut\u00f3nomo<\/td>\n<td>Basado en gr\u00e1ficos, consultable<\/td>\n<\/tr>\n<tr>\n<td>Relaci\u00f3n<\/td>\n<td>Complementaria, no compitiendo<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Abordan diferentes capas de reproducibilidad. RO-Crate empaqueta su conjunto de datos con metadatos. Prov-JSON rastrea el linaje computacional de c\u00f3mo se produjo ese conjunto de datos. El uso de ambos proporciona una reproducibilidad completa: \"Aqu\u00ed est\u00e1n los datos\" (ro-Crate) m\u00e1s \"As\u00ed es como se produjo\" (Prov-JSON).<\/p>\n<h2>Cu\u00e1ndo usar DVC vs Datalad vs Bibliotecas compatibles con Prov<\/h2>\n<p>Elegir entre DVC, Datalad y bibliotecas compatibles con Prov depende de sus patrones de flujo de trabajo:<\/p>\n<table>\n<thead>\n<tr>\n<th>Criterio<\/th>\n<th>dvc<\/th>\n<th>drogadicto<\/th>\n<th>Bibliotecas de PRO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Caso de uso principal<\/td>\n<td>Experimentos orientados a tuber\u00edas<\/td>\n<td>Curaci\u00f3n de datos a largo plazo<\/td>\n<td>procedencia accionable a m\u00e1quina<\/td>\n<\/tr>\n<tr>\n<td>Tama\u00f1o de los datos<\/td>\n<td>Archivos grandes (modelos, simulaciones)<\/td>\n<td>Grandes conjuntos de datos distribuidos<\/td>\n<td>N\/A (enfocado en metadatos)<\/td>\n<\/tr>\n<tr>\n<td>Modelo de ejecuci\u00f3n<\/td>\n<td>Pipeline basado en etapas (<code>dvc repro<\/code>)<\/td>\n<td>Basado en comandos (<code>datalad run<\/code>)<\/td>\n<td>Basado en decorador<\/td>\n<\/tr>\n<tr>\n<td>Integraci\u00f3n HPC<\/td>\n<td><code>srun dvc repro<\/code><\/td>\n<td>Git-anexo nativo + SSH<\/td>\n<td>configurable<\/td>\n<\/tr>\n<tr>\n<td>Salida de procedencia<\/td>\n<td><code>.dvc<\/code> Archivos + Historial de Git<\/td>\n<td>Enlaces simb\u00f3licos de Git-Anex + registro de Git<\/td>\n<td>Gr\u00e1fico Provincia JSON<\/td>\n<\/tr>\n<tr>\n<td>mejor para<\/td>\n<td>Materiales-Ciencias de Ciencias, Barridos de Par\u00e1metros<\/td>\n<td>Curaci\u00f3n de repositorios a largo plazo, cumplimiento de ofertas<\/td>\n<td>Datos justos, procedencia interinstitucional<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>DVC es adecuado para usted si:<\/h3>\n<ul>\n<li>Su flujo de trabajo tiene varias etapas dependientes (relajaci\u00f3n \u2192 c\u00e1lculo de propiedades \u2192 visualizaci\u00f3n)<\/li>\n<li>Necesita barridos de par\u00e1metros con repetici\u00f3n autom\u00e1tica<\/li>\n<li>Desea realizar un seguimiento de qu\u00e9 combinaci\u00f3n de par\u00e1metros produjo el resultado de energ\u00eda m\u00e1s baja<\/li>\n<\/ul>\n<h3>Datalad es adecuado para usted si:<\/h3>\n<ul>\n<li>Est\u00e1s curando un repositorio de conjunto de datos a largo plazo<\/li>\n<li>Necesita enlaces simb\u00f3licos de Git-Anex para un manejo eficiente de archivos grandes<\/li>\n<li>Est\u00e1s trabajando con conjuntos de datos distribuidos en todas las instituciones<\/li>\n<li>Necesitas Cumplimiento de Ofertas (Com\u00fan en Neuroimagen)<\/li>\n<\/ul>\n<h3>Las bibliotecas que cumplen con Prov son adecuadas para usted si:<\/h3>\n<ul>\n<li>Necesita procedencia accionable a m\u00e1quina para un cumplimiento justo<\/li>\n<li>Desea un gr\u00e1fico de procedencia consultable para el linaje de datos<\/li>\n<li>Est\u00e1s colaborando entre instituciones con diferentes sistemas de procedencia<\/li>\n<li>Est\u00e1s publicando en un repositorio de datos justo<\/li>\n<\/ul>\n<h2>Poni\u00e9ndolo en com\u00fan, un flujo de trabajo pr\u00e1ctico<\/h2>\n<p>Aqu\u00ed hay un patr\u00f3n de flujo de trabajo pr\u00e1ctico que combina todos los conceptos anteriores:<\/p>\n<pre><code class=\"language-bash\"># 1. Initialize the repository\ngit init\ndvc init\n\n# 2. Add the data\ndvc add data\/raw_crystal_structure.xyz\n\n# 3. Run the pipeline\ndvc repro\n\n# 4. Check the results\ndvc metrics show results\/energies.txt\n\n# 5. Run experiments with different parameters\ndvc exp run -S sim.tolerance=1e-8 --set-param sim.cutoff_energy=550\n\n# 6. Push data and experiments to remote\ndvc push\ndvc exp push\ngit push origin main\n\n# 7. (Optional) Generate PROV-JSON provenance\npython src\/provenance.py --output provenance.json\n<\/code><\/pre>\n<p>Este patr\u00f3n garantiza que cada resultado de la simulaci\u00f3n se pueda rastrear hasta su versi\u00f3n de datos exacta, confirmaci\u00f3n de c\u00f3digo y archivo de par\u00e1metros. La salida Prov-JSON (paso 7) agrega una capa de procedencia accionable por m\u00e1quina en la parte superior de la tuber\u00eda de DVC.<\/p>\n<h2>Errores comunes: qu\u00e9 evitar<\/h2>\n<p><strong>Error 1: Versiones de todo<\/strong> \u2014 No ejecute <code>dvc add<\/code> en cada archivo de salida. Solo realice un seguimiento de los archivos que son entradas a etapas posteriores o que representan los resultados finales. Los archivos intermedios (como los arreglos de fuerza sin procesar) deben permanecer en Git o ser excluidos por completo. La adici\u00f3n excesiva crea ruido de tuber\u00eda.<\/p>\n<p><strong>Error 2: Rutas de codificaci\u00f3n dura<\/strong> \u2014 No utilice rutas absolutas en <code>dvc.yaml<\/code>. Utilice rutas relativas para que la canalizaci\u00f3n funcione en diferentes m\u00e1quinas y configuraciones de cl\u00faster.<\/p>\n<p><strong>Error 3: Mezcla de tipos de datos<\/strong> \u2014 No coloque los par\u00e1metros de simulaci\u00f3n y los puntos de control del modelo en el mismo archivo <code>.dvc<\/code>. Mantenga los tipos de datos separados para evitar conflictos de cach\u00e9.<\/p>\n<p><strong>Error 4: Ignorar la procedencia<\/strong> \u2014 Los archivos DVC por s\u00ed solos no son suficientes para el cumplimiento justo. Si su instituci\u00f3n requiere gr\u00e1ficos de procedencia, empareje DVC con salida Prov-JSON (YPROV4ML) o RO-Crate Package.<\/p>\n<p><strong>Error 5: Olvidar <code>params.yaml<\/code><\/strong> \u2014 Si los par\u00e1metros de c\u00f3digo r\u00edgido en sus scripts en lugar de aislarlos en <code>params.yaml<\/code>, el seguimiento de par\u00e1metros de DVC se vuelve in\u00fatil. Utilice siempre <code>params.yaml<\/code> para los par\u00e1metros de simulaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>DVC transforma los flujos de trabajo cient\u00edficos de procesos fr\u00e1giles y dependientes de la memoria en canalizaciones deterministas y conscientes de la dependencia. La informaci\u00f3n clave es que <code>dvc.yaml<\/code> archivos de canalizaci\u00f3n y <code>params.yaml<\/code> aislamiento de par\u00e1metros crean \"reproducibilidad en versi\u00f3n\": la capacidad de reconstruir no solo un resultado, sino el estado experimental exacto (versi\u00f3n de datos + code commit + archivo de par\u00e1metros) que lo produjo. Esto va m\u00e1s all\u00e1 de los contenedores (que congelan los entornos de c\u00f3digo) y m\u00e1s all\u00e1 de Git (que no pueden manejar grandes conjuntos de datos).<\/p>\n<p>Para la integraci\u00f3n de HPC, el envoltorio <code>srun<\/code> de SLURM permite la ejecuci\u00f3n de canalizaci\u00f3n nativa del cl\u00faster sin intervenci\u00f3n manual. Para la procedencia, W3C Prov-JSON (YPROPR4ML) surge como un formato interoperable complementario al empaque de RO-Crate, lo que permite un linaje de datos accionable por m\u00e1quina que satisface los requisitos de cumplimiento justo.<\/p>\n<p>La elecci\u00f3n entre DVC, Datalad y bibliotecas compatibles con ProV depende de sus patrones de flujo de trabajo: DVC para experimentos orientados a canalizaciones, Datalad para curaci\u00f3n de datos a largo plazo y bibliotecas PROP para gr\u00e1ficos de procedencia accionables por m\u00e1quina. La mayor\u00eda de los equipos de simulaci\u00f3n se benefician del uso de DVC para la ejecuci\u00f3n de la canalizaci\u00f3n y Prov-JSON para el seguimiento de procedencias: las dos herramientas son complementarias, no compiten.<\/p>\n<hr>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"\/reproducibility-workflows-beyond-containers-data-versioning-and-provenance-tracking\/\">Reproducibilidad m\u00e1s all\u00e1 de los contenedores<\/a> \u2014 Cubre los conceptos b\u00e1sicos de DVC, el envase de procedencia de caja RO-Crate y los patrones de reproducibilidad basados en contenedores<\/li>\n<li><a href=\"https:\/\/matforge.org\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">Gesti\u00f3n de problemas de PDE a gran escala<\/a> \u2014 Discute la gesti\u00f3n de recursos de cl\u00faster y Flujos de trabajo de HPC<\/li>\n<li><a href=\"https:\/\/matforge.org\/verification-vs-validation-in-scientific-simulations-a-practical-guide\/\">Verificaci\u00f3n vs validaci\u00f3n en simulaciones cient\u00edficas<\/a> \u2014 explica la reproducibilidad m\u00e1s amplia Contexto para los resultados de simulaci\u00f3n<\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 20<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 combinaci\u00f3n espec\u00edfica de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo [&hellip;]<\/p>\n","protected":false,"raw":""},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=1058","iawp_total_views":1,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1103","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  20 minutesVersiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 combinaci\u00f3n espec\u00edfica de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-19T09:48:38+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos\",\"datePublished\":\"2026-08-19T09:48:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/\"},\"wordCount\":5950,\"commentCount\":0,\"articleSection\":[\"Simulaci\u00f3n &amp; Proyectos de modelado\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/\",\"name\":\"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-19T09:48:38+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"caption\":\"steven\"},\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/steven\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/","og_locale":"es_ES","og_type":"article","og_title":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org","og_description":"Reading Time:  20 minutesVersiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos El control de versiones de datos en la simulaci\u00f3n cient\u00edfica no se trata de rastrear los cambios de c\u00f3digo: Git ya lo maneja perfectamente bien. Se trata de rastrear qu\u00e9 combinaci\u00f3n espec\u00edfica de archivo de datos, confirmaci\u00f3n de c\u00f3digo y archivo [&hellip;]","og_url":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/","og_site_name":"matforge.org","article_published_time":"2026-08-19T09:48:38+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"steven","Tiempo de lectura":"34 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos","datePublished":"2026-08-19T09:48:38+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/"},"wordCount":5950,"commentCount":0,"articleSection":["Simulaci\u00f3n &amp; Proyectos de modelado"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/","url":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/","name":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-19T09:48:38+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/python-data-versioning-and-provenance-dvc-dvc-and-scientific-workflows\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Versiones y procedencias de datos de Python: DVC, DVC y flujos de trabajo cient\u00edficos"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","caption":"steven"},"url":"https:\/\/matforge.org\/author\/steven\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1103"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1103\/revisions"}],"predecessor-version":[{"id":1153,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1103\/revisions\/1153"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}