009 — Entornos Python, Git y experimentos reproducibles

← Clase anterior · Índice de la parte · Clase siguiente →

Parte: 00 — Fundamentos, historia y método científico
Nivel: fundamentos · Horas estimadas: 4
Laboratorio: observability · Estado: EXECUTABLE_CORE

🎯 Propósito

Comprender entornos python, git y experimentos reproducibles dentro de la evolución de la inteligencia artificial, implementar un experimento mínimo verificable y distinguir qué parte constituye evidencia frente a una afirmación todavía no comprobada.

📚 Resultados de aprendizaje

Al finalizar podrás:

  1. Explicar entornos python, git y experimentos reproducibles usando los conceptos Python, Git, semillas, entornos.
  2. Ejecutar el laboratorio con una semilla explícita y revisar su contrato JSON.
  3. Identificar al menos un supuesto, una limitación y un riesgo de aplicación.
  4. Comparar el enfoque con la etapa anterior de la ruta de aprendizaje.
  5. Producir una evidencia reproducible y una conclusión que no exceda los datos.

🧩 Conceptos centrales

Python, Git, semillas, entornos

🗺️ Ubicación en el mapa de la IA

Si la clase 008 estableció que un claim sin experimento reproducible es una anécdota, esta clase da la infraestructura para que los experimentos sean reproducibles: entornos de Python aislados y declarados, control de versiones con Git, y gestión explícita de la aleatoriedad con semillas. Es la caja de herramientas silenciosa detrás de cada laboratorio del programa (todos aceptan seed y devuelven un JSON verificable) y de cualquier práctica seria de ML, donde "funciona en mi máquina" es el modo de fallo más caro.

📖 Fundamentos

🎚️ Los cuatro niveles de reproducibilidad

Nivel 0 — Repetibilidad:    yo, en mi máquina, hoy → mismo resultado.
Nivel 1 — Reproducibilidad: otra persona, con mi código y datos → mismo resultado.
Nivel 2 — Replicabilidad:   otro equipo, con SU implementación → misma conclusión.
Nivel 3 — Generalización:   la conclusión sobrevive con otros datos/dominios.

Esta clase asegura los niveles 0-1. Requieren fijar cinco cosas: código (Git), dependencias (entorno declarado), datos (versión e integridad), aleatoriedad (semillas) y configuración (parámetros registrados, no hardcodeados a medias).

🐍 Entornos virtuales de Python

Un entorno virtual (venv) es un directorio con un intérprete y un site-packages propios: aísla las dependencias de un proyecto de las del sistema y de otros proyectos.

python -m venv .venv                    # crear
.venv\Scripts\activate                  # activar (Windows)
source .venv/bin/activate               # activar (Unix)
pip install -e .                        # instalar el proyecto en modo editable
pip freeze > requirements-lock.txt      # congelar versiones exactas

Distinción crítica: requirements.txt/pyproject.toml declaran dependencias directas con rangos ("numpy>=1.26"); un lockfile (pip freeze, uv lock, poetry.lock) congela el grafo completo con versiones exactas. La reproducibilidad exige el lockfile: dos instalaciones con el mismo rango en fechas distintas pueden resolver versiones diferentes y cambiar resultados numéricos.

🌱 Aleatoriedad y semillas

Los generadores pseudoaleatorios (PRNG) son deterministas: una semilla fija toda la secuencia. random.seed(42) y numpy.random.default_rng(42) hacen el experimento repetible. Advertencias honestas:

🌳 Git: instantáneas verificables del código

Git guarda commits: instantáneas inmutables del árbol de archivos, identificadas por un hash SHA que depende del contenido y de la historia. Para experimentos:

git init / clone          # crear u obtener el repositorio
git add -p                # revisar QUÉ se incluye, fragmento a fragmento
git commit -m "..."       # instantánea con mensaje que explica el porqué
git tag exp-2026-07-29    # marcar el estado exacto de un experimento
git diff / log / show     # auditar qué cambió entre dos resultados

El hash del commit es el eslabón que une un número en un informe con el código exacto que lo produjo: un resultado sin commit asociado no es auditable. Las ramas permiten aislar experimentos; .gitignore mantiene fuera datos pesados, secretos y artefactos derivados (los datos se versionan con herramientas dedicadas o con checksums registrados).

🧾 El contrato experimental mínimo

Todo experimento del programa registra, como mínimo:

{commit, entorno (lockfile), semilla(s), parámetros, datos+versión, métrica, fecha}

El laboratorio de esta clase (run_lab("observability", seed=...)) implementa la versión mínima: mismo seed → mismo JSON, y el resultado incluye la evidencia y las limitaciones declaradas. Ese contrato es lo que en la clase 008 convierte una corrida en evidencia.

🧮 Ejemplo trabajado

Reconstruyamos "por qué cambió la métrica" con el contrato completo. Estado A (reportado en un informe) y estado B (corrida de hoy):

Componente Estado A Estado B ¿Explica el cambio?
Commit a1b2c3d a1b2c3d No (código idéntico)
Lockfile numpy 1.26.4 numpy 2.1.0 Candidato (cambio mayor de versión)
Semilla 42 42 No
Datos ventas_2025Q4.csv, sha256 9f3e... mismo hash No
Métrica MAE = 12.3 MAE = 14.1

Diagnóstico en tres pasos reproducibles:

1. git diff A..B                      → vacío: el código no cambió
2. diff requirements-lock (A vs B)    → numpy 1.26.4 → 2.1.0
3. recrear venv con el lockfile de A  → MAE vuelve a 12.3  ∎ causa aislada

Sin lockfile, este diagnóstico habría sido imposible: la diferencia se habría atribuido al modelo, a los datos o al azar. Nótese el método: cambiar una variable por vez, igual que en cualquier experimento.

📊 Propiedades y comparación

Herramienta Qué fija Qué NO fija Costo de adopción
venv + lockfile Versiones exactas de paquetes Python Versión de Python, libs de sistema Minutos
pyenv / instaladores Versión del intérprete Paquetes, SO Minutos
Git (commit + tag) Código y configuración versionada Datos pesados, entorno Horas de hábito
Semillas explícitas Secuencia del PRNG Validez estadística, no-determinismo GPU Minutos
Contenedores (Docker) SO + libs de sistema + Python + paquetes Hardware, drivers Días
flowchart LR
    subgraph Contrato["Contrato de reproducibilidad"]
        C["📌 Código<br/>commit a1b2c3d"] --> R["🧪 Corrida del experimento"]
        E["📦 Entorno<br/>lockfile congelado"] --> R
        S["🌱 Semilla(s)<br/>PRNG por biblioteca"] --> R
        D["🗃️ Datos<br/>versión + checksum"] --> R
        P["⚙️ Parámetros<br/>config registrada"] --> R
    end
    R --> J["📄 Resultado JSON<br/>métrica + evidence + limitations"]
    J --> V{"¿Otra persona obtiene<br/>lo mismo desde cero?"}
    V -- "Sí" --> OK["Nivel 1 alcanzado:<br/>el resultado es evidencia"]
    V -- "No" --> BUG["Falta un componente del contrato:<br/>diagnosticar cambiando UNO por vez"]

⚠️ Errores conceptuales frecuentes

  1. "Fijé la semilla, mi resultado es válido." La semilla da repetibilidad, no validez: si la conclusión cambia con otras semillas, lo reproducible era el ruido.
  2. "requirements.txt con rangos basta." Los rangos resuelven distinto según la fecha de instalación; sin lockfile, dos máquinas "iguales" no lo son.
  3. "Git es una carpeta de backups." Commits atómicos con mensajes explicativos y tags por experimento son metadatos científicos; un solo commit gigante "cambios" destruye la auditabilidad.
  4. "El notebook es el experimento." Un notebook ejecutado fuera de orden con estado oculto no es reproducible; la lógica estable vive en módulos importables (como ai_evolution.labs) y el notebook solo orquesta y narra.
  5. "Versionar datos = meterlos en Git." Git degrada con binarios grandes; lo correcto es registrar versión y checksum, y usar almacenamiento de datos dedicado.

🚀 Del aprendizaje a la operación

En equipos reales este contrato escala a: CI que reconstruye el entorno desde el lockfile y re-ejecuta los experimentos de humo en cada push; tracking de experimentos con herramientas dedicadas (MLflow, W&B) en lugar de hojas de cálculo; contenedores para fijar también el sistema operativo; y datos versionados con checksums verificados en el pipeline. La regla operativa no cambia: si un número no puede regenerarse desde commit + lockfile + semilla + datos, no entra en un informe.

🧪 Laboratorio

python lab.py

El laboratorio llama a ai_evolution.labs.run_lab("observability"). Esta decisión evita 183 implementaciones divergentes: cada clase tiene un entrypoint propio, pero los motores didácticos se prueban como una biblioteca común.

🔍 Evidencia esperada

📓 Notebooks

📝 Evaluación

Criterio Peso
Comprensión conceptual 25 %
Ejecución reproducible 25 %
Interpretación basada en evidencia 25 %
Riesgos, límites y mejora propuesta 25 %

Consulta assessment.md para preguntas y criterio de aceptación.

⚠️ Errores comunes

Síntoma Causa probable Corrección
El código corre, pero no hay conclusión Se confundió ejecución con aprendizaje Explica qué demuestra y qué no demuestra
El resultado cambia sin explicación No se registró semilla o configuración Conserva semilla, versión y parámetros
Se promete uso real Se extrapoló desde una demo educativa Declara entorno, datos, límites y revisión humana
Se copia una métrica aislada No existe baseline ni costo de error Añade comparación y criterio de decisión

❓ Preguntas frecuentes

¿Debo usar una API comercial?
No. El núcleo funciona localmente. Las extensiones LIVE se documentan por separado.

¿El laboratorio representa una implementación industrial?
No por sí solo. Enseña el contrato y el patrón; producción exige integración, seguridad, observabilidad, pruebas y operación.

¿Dónde profundizo?
Revisa las especializaciones enlazadas en el README raíz y la ruta siguiente.

🔗 Referencias


📜 Papers que fundamentan esta clase

Bloque generado por python scripts/link_papers_to_classes.py. La fuente es papers/catalog/papers.json.

Paper Año Qué desbloqueó Miniatura
P63 · Mejorar la reproducibilidad en la investigación en aprendizaje automático 2021 Convierte la reproducibilidad en un requisito operativo del proceso de publicación, con checklist, código y revisión. notebook

Cada ficha explica el problema anterior, la matemática mínima, los límites y los errores de atribución más frecuentes. Para leerlas con método: cómo leer un paper de IA · anexos matemáticos.


📚 Bibliografía de apoyo

Bloque generado por python scripts/link_sources_to_classes.py. Cada obra lleva su localizador verificado en sources/bibliography.json.

Los papers dicen de dónde salió el mecanismo. Estas obras lo desarrollan con el espacio que una clase no tiene: teoría completa, demostraciones y ejercicios.

Obra Edición Localizador Papel en esta clase
Russell, Stuart J. y Norvig, Peter — Artificial Intelligence: A Modern Approach 4.ª · 2020 ISBN 9780134610993 · web de la obra obra de referencia de la parte 00 · capítulos de introducción y de agentes racionales

⬅️ Clase anterior

008 — Datos, evidencia, hipótesis y falsabilidad

➡️ Siguiente clase

010 — Cómo leer papers, benchmarks y claims de IA


📝 Evaluación completa

❓ Preguntas

  1. Define entornos python, git y experimentos reproducibles sin usar una marca o framework como definición.
  2. Explica la relación entre Python, Git, semillas, entornos.
  3. Ejecuta lab.py dos veces con la misma semilla. ¿Qué debe conservarse?
  4. Identifica una afirmación permitida y una afirmación exagerada sobre el resultado.
  5. Propón una prueba negativa o un caso límite.

🏆 Reto verificable

Amplía el resultado del laboratorio con una clave student_extension que incluya:

✅ Criterio de aceptación