Resumen
En este episodio (120 de enCoders), Rodo presenta la tercera parte de una serie sobre un proyecto de ciencia de datos que pasó de un Jupyter Notebook a una estructura ordenada con pipelines, logs y salidas guardadas. El foco es la reproducibilidad: poder ejecutar el mismo proyecto en otro computador, servidor o sistema operativo con los mismos resultados. Se distinguen repetibilidad, reusabilidad, replicabilidad y reproducibilidad, y se aclara la diferencia entre archivos `.env` (variables de ambiente), ambientes virtuales, máquinas virtuales y Docker. Se demuestra recrear un ambiente virtual con `requirements.txt`, implementar un "modo de pruebas" que ejecuta el pipeline con una muestra de datos para iterar rápido, y luego instalar Docker Desktop con WSL2 en Windows. Finalmente se construye un Dockerfile, se crea una imagen, se levanta un contenedor y se desarrolla dentro de él con la extensión de Docker y Dev Containers de VS Code. La conclusión: las buenas prácticas toman tiempo y disciplina, pero evitan mucho dolor al traspasar o poner en producción un proyecto.
Capítulos
- 00:00IntroSe presenta el episodio sobre reproducibilidad, con demos de ambientes virtuales, Docker y un "modo de pruebas" para ejecutar código más rápido durante el desarrollo, además de contenedores de desarrollo.
- 00:33Repaso de lo que hemos hecho en el proyectoEl proyecto partió como un Jupyter Notebook y pasó a una estructura de carpetas (funciones, modelos, preprocessing, reports). En la segunda sesión se ligó todo en un flujo de datos con salidas intermedias en pkl, feather o parquet, y se habló de logs con la librería `logging` (episodios 113 y 115).
- 01:57Qué es e importancia de la ReproducibilidadSe diferencian repetibilidad (misma máquina, con semilla aleatoria), reusabilidad (aplicar lo de otros, como los papers), replicabilidad (mismo experimento en otro computador) y reproducibilidad (mismo experimento en otro setup, p. ej. servidor u otro sistema operativo). Es indispensable para automatizar y escalar a muchas copias de un servidor.
- 08:50Diferencias entre Docker, Ambientes Virtuales y Variables de AmbienteEl `.env` guarda variables de ambiente (usuarios, contraseñas), no ambientes virtuales. Un ambiente virtual fija versiones de librerías y lenguaje; Docker comparte el kernel del host y es mucho más liviano que una máquina virtual, que crea un kernel nuevo. Se cuenta el caso de un módulo con Whisper X, GPU y CUDA dockerizado que sobrevivió a formatear el computador.
- 15:35Demo: Recuperación de ambiente virtualSe borra y recrea la carpeta `.venv` con `python -m venv`, se activa con `source` y se instala con `pip install -r requirements.txt`. Se ejecuta el proyecto con el pipeline orquestador `p01`, y se comenta que `pywin32` y similares deben quitarse del requirements para Linux. Se discute conda/miniconda frente a pip y poetry.
- 23:38Qué es y qué utilidad tiene un "modo de pruebas"El botón Play de VS Code cierra la sesión al terminar, lo que es malo para código que tarda horas. El modo de pruebas usa una muestra de los datos solo para verificar que el código corre de principio a fin, sin importar el resultado del modelo. Se discute el riesgo de casos borde no cubiertos y que el QA/MLOps es una capa adicional.
- 30:18Demo: Qué precausiones tener al crear uno.Se agregan parámetros globales (booleano de modo de pruebas, cantidad de filas) y `argparse` para recibirlos por terminal, con la sugerencia de usar `type` para el booleano. Se reduce la grilla de hiperparámetros a un solo elemento, se toma la mediana de fechas como corte train/test y se fuerzan valores de clase para no quedar con una sola. Se mencionan alternativas: encapsular los `if` en funciones o guardar un dataset de prueba aparte.
- 45:33MemesMemes sobre pip, conda y poetry, donde se menciona que conda a veces falla con dependencias, y sobre Docker ("en mi computador funcionaba"). Se comenta que las imágenes Docker ocupan mucho disco y que se limpia con `docker prune`, además de comparar cantidades de RAM.
- 55:35Instanación de Docker Desktop en WindowsSe recomienda un video de instalación y se explica que Docker Desktop usa WSL2 para correr contenedores Linux en Windows. Se muestra cómo instalar Ubuntu desde la Microsoft Store, actualizar a WSL2 (`wsl --set-version`), activar virtualización en la BIOS, y usar Windows Terminal o la terminal de VS Code.
- 01:06:26Creación y visualización de imágenes DockerEn Docker Desktop se buscan y descargan imágenes (python, ubuntu, alpine), con diferencias de peso (Debian ~364 MB frente a Alpine ~16 MB). Se explica la diferencia entre imagen y contenedor, los volúmenes, y que Docker Desktop requiere licencia de pago para uso comercial.
- 01:13:21Demo: Creación de Dockerfile básico, construcción de una imagen y instanciamiento de un contenedorSe revisan `settings.json`, `launch.json`, `.dockerignore` y el `Dockerfile` (imagen base Python 3.10, variables de ambiente, instalación de Rust, `COPY` de requirements, venv, `pip install`, `EXPOSE`). Se construye con `docker build -t` y se ejecuta con `docker run --network host -it`, advirtiendo no copiar archivos `.env` con secretos.
- 01:26:10Qué es DevContainer y cómo usarlo para testear y desarrollar en un contenedorCon la extensión de Docker se hace "attach Visual Studio Code" al contenedor, se verifica el Python del venv y se ejecuta el proyecto completo desde cero dentro del contenedor. Los cambios se pueden commitear y la imagen se puede actualizar con un commit y nuevo tag.
- 01:28:43CierreSe menciona que próximamente se verá multilenguaje (R y Python) y herramientas como Great Expectations y MLflow. El repositorio estará en los comentarios, y se destaca que las buenas prácticas pagan a largo plazo.