Para la gente leyendo este sitio de web, estoy seguro que ya entiende la importancia de metric logging para modelos de aprendizaje automático, pero en el caso de Libtorch, no es tan fácil como Pytorch. Claro que se puede guardar los metrics en un archivo de CSV y hacer visualizaciones después, pero sería mejor ver el progreso de los modelos durante el aprendizaje. No solo eso, pero también es muy util tener toda la información de los experimentos en un lugar.
Si se busca un poco, hay unos opciones, pero es un poco difícil decider cual es lo mejor. Cuando se trabaja con PyTorch, tipicamente hay unos APIs oficiales que los plataformas ofrecen, pero en C++ existen dos opciones (que yo conozco):
- Usar un libraria en un repo de Github
- Hacer su propio logger
Usando Un Repo de Github
Acá les muestro unos proyectos que se puede usar directamente. El beneficio de estos es que no hay que pensar demasiado. Solo hay que añadirlos al proyecto y seguir las instrucciones para empezar:
- Logging en Tensorboard con este logger de RustingSword
https://github.com/RustingSword/tensorboard_logger
- Logging en MLFlow con este Logger de Estshorter:
https://github.com/estshorter/mlflow.cpp
- Logging in Weights & Biases con este logger de yhisaki:
https://github.com/yhisaki/wandb-cpp
Y si los opciones encima no funcionan o si queres una alternativa en que podes conectar directamente a un API ofrecido por el plataforma de logging, también podes hacer tu propio logger.
Haciendo Tu Propio Logger
MLFlow ofrece un REST API además de los APIs para Python, R y Java. Esto significa que si tenés un libraria para requests, podes conectar directamente a MLFlow. (Imagino que esto sería muy útil para proyectos usando Boost, que contiene su propio libraria para requests)
MLFlow ofreces endpoints para hacer y buscar experimentos y runs, en adición a guardar metrics, asi que podes escribir un clase que hace un experimento y run para iniciar, y después incluir una funciona para guardar metrics. Acá es un ejemplo de un interfaz simple:
int main() {
MLFlowLogger logger{"mlflow:5050", "test2"};
std::vector<float> loss = {300.0, 100.0, 50.0, 10.0, 5.0, 1.0, 0.5};
int step = 0;
for(auto value : loss) {
logger.log_metric("loss", value, step);
step++;
}
}
Este clase obviamente solo guarda números que elegí por mi mismo, pero debe ser más o menos fácil para incorporar un clase como esto en tu loop de entrenamiento.
Me gustaría compartir la implementación entera acá, pero resultaría en un post demasiado grande, así que si queres ver un ejemplo simple de un logger que funciona (con MLFlow en un contenedor de docker) podes ver el mio acáUso los librarias restclient-cpp y simple json library para hacer un logger muy básico.
Conclusión
Hay muchos métodos de guardar metrics para un proyecto de Libtorch y lo que necesitás para tu proyecto va a depender en las restricciones que tu proyecto tiene. No hay una solución incorrecta, pero es importante considerar cual método sería más fácil para desarrollar y mantener.
Referencias
Para más información sobre el MLFlow REST API, podes ver la documentación de MLFlow acá.
Deja un comentario
Lo siento, tenés que estar conectado para publicar un comentario.
Connect with
Login with Linkedin