#!/usr/bin/env python3 """ Script générique pour logger n'importe quel fichier de loss vers Trackio Un projet Trackio par fichier de loss """ import trackio import pandas as pd import sys from pathlib import Path def get_project_name_from_file(filename): """Convertit un nom de fichier en nom de projet Trackio""" # Enlever l'extension et les tirets, remplacer par des tirets simples project = filename.replace('_loss.csv', '').replace('_', '-').replace('.csv', '') return f"{project}-comparison" def log_loss_file_to_trackio(data_file, project_name=None): """Log un fichier de loss vers Trackio""" print(f"\n🚀 Traitement de: {data_file.name}") if not data_file.exists(): print(f"❌ Fichier non trouvé: {data_file}") return False try: # Charger les données df = pd.read_csv(data_file) print(f"📁 Données chargées: {len(df)} lignes") # Obtenir les runs uniques if 'run_name' not in df.columns: print(f"❌ Pas de colonne 'run_name' dans {data_file.name}") return False runs = df['run_name'].unique() print(f"🔍 Runs à créer ({len(runs)}):") for run in runs: count = len(df[df['run_name'] == run]) print(f' - "{run}": {count} points') # Déterminer le nom du projet if project_name is None: project_name = get_project_name_from_file(data_file.name) print(f"🎯 Projet Trackio: {project_name}") # Logger chaque run dans le MÊME projet for i, run_name in enumerate(runs): print(f"\n🌐 Création du run: \"{run_name}\"") # Initialiser Trackio avec le même projet trackio.init( project=project_name, space_id="tfrere/loss-experiment", name=run_name, resume="allow" # Permettre de reprendre ou créer un nouveau run ) # Filtrer les données pour ce run run_data = df[df['run_name'] == run_name] print(f"📊 Logging de {len(run_data)} points...") # Logger les données de ce run for j, (_, row) in enumerate(run_data.iterrows()): log_data = { "loss": float(row['loss']) } # Utiliser tokens comme axe X principal si disponible if 'tokens' in row: log_data["tokens"] = float(row['tokens']) else: # Sinon utiliser un compteur de step log_data["step"] = j trackio.log(log_data) if j % 100 == 0 and j > 0: print(f" ✅ Étape {j}/{len(run_data)}") # Finaliser ce run trackio.finish() print(f"✅ Run \"{run_name}\" terminé!") print(f"\n🎉 Projet {project_name} créé avec {len(runs)} runs!") return True except Exception as e: print(f"❌ Erreur lors du logging de {data_file.name}: {e}") import traceback traceback.print_exc() return False def main(): print("🎯 Logger tous les fichiers de loss vers Trackio") print("=" * 60) print("🔄 Un projet Trackio par fichier de loss") print("=" * 60) # Liste des fichiers à traiter data_dir = Path("src/content/assets/data") # Mapping fichier -> nom de projet (optionnel, sinon généré automatiquement) file_mappings = { "attention_loss.csv": "attention-loss-comparison", "batch-size_loss.csv": "batch-size-loss-comparison", "doc-masking_loss.csv": "doc-masking-loss-comparison", "lr_loss.csv": "lr-loss-comparison", "nope_loss.csv": "nope-loss-comparison", "spike_loss.csv": "spike-loss-comparison", "tied-embeddings_loss.csv": "tied-embeddings-loss-comparison", "tp_debug_fix_loss.csv": "tp-debug-fix-loss-comparison", "wsd_loss.csv": "wsd-loss-comparison", } # Traiter chaque fichier results = {} for filename, project_name in file_mappings.items(): data_file = data_dir / filename if data_file.exists(): results[filename] = log_loss_file_to_trackio(data_file, project_name) else: print(f"\n⚠️ Fichier non trouvé: {filename}") results[filename] = False # Résumé print("\n" + "=" * 60) print("📊 RÉSUMÉ") print("=" * 60) success_count = sum(1 for v in results.values() if v) total_count = len(results) for filename, success in results.items(): status = "✅" if success else "❌" print(f"{status} {filename}") print(f"\n🎉 {success_count}/{total_count} fichiers loggés avec succès!") print(f"📊 Consultez votre dashboard: https://huggingface.co/spaces/tfrere/loss-experiment") return 0 if success_count == total_count else 1 if __name__ == "__main__": exit(main())