Adapter pattern y mi propio Logger

Hace poco descubrí Weights & Bias para trackear experimentos, y me pareció maravilloso. Y entonces dejó de funcionarme en Colab, el principal lugar donde corro experimentos (aún no entiendo por qué). Pero no estaba dispuesta a renunciar a la posibilidad de guardar mis experimentos, así que hice mi propio Logger.

Hace poco descubrí que existían herramientas para poder tener un mayor control de los experimentos (MLflow, Comet, Neptune). Un conocido que trabaja en Machine Learning en la industria me recomendó Weights & Bias, y una vez que aprendí a usarlo me encantó. Y entonces dejó de funcionar en Colab, el único lugar por ahora donde tengo acceso a GPUs para correr mis experimentos. No logré entender qué fallaba, así que me rendí y dejé de intentar arreglarlo. Pero la forma en que guardaban los experimentos me pareció súper inspiradora, así que, puesto que Colab se negaba a dejarme usar W&B, decidí crear mi propio módulo lunar logger con juegos de azar y mujerzuelas.

Registro de los experimentos

Mi forma de trabajo antes de tener un logger. Cómo llegué a saber de tracking de experimentos. Empecé a usar WnB, y hay un tutorial muy sencillo. Como es framework agnostico, podía usarlo con jax. Bastaba con agregar una inicialización donde fuera necesario, añadir al código las zonas donde se calculan las métricas, los artefactos que quiero guardar, etc. Luego falló (descrubir el error y tratar de entender qué pasaba). Pero me gustaba la idea del logger, quería volver a usar WnB eventualmente, y no quería perder el logging.

Puesto que estoy trabajando con Jax puro, en lugar de usar las redes neuronales implementadas en las librerías como Keras o PyTorch, no tengo un logger out of the box que registre cada vez que entreno un modelo. Mi forma de regustrar los resultados consistía en guardar un diccionario con los resultados de cada vez que corría el modelo, y usar un nombre de archivo que incluyera los hiperparámetros que usados. Como es de imaginarse, eso pronto se volvió un problema; cuando tenía que variar un hiperparámetro que no había considerado antes necesitaba cambiar la función que nombraba los archivos, era muy fácil reescribir un entrenamiento y perderlo completamente, y ni siquiera voy a comenzar a hablar de la tortura de tener postprocesar o calcular métricas a partir de un archivos guardados en distintas carpetas.

##