#!/usr/bin/env python3 """ Script pour créer un Space Trackio par projet de loss Utilise l'API Hugging Face Hub pour créer des Spaces séparés """ import trackio import pandas as pd import sys from pathlib import Path from huggingface_hub import HfApi, SpaceCard def get_project_space_id(project_name): """Génère un space_id unique pour chaque projet""" username = "tfrere" # Ton username Hugging Face space_name = f"loss-{project_name.replace('-', '-').lower()}" return f"{username}/{space_name}" def create_space_if_needed(space_id): """Crée un Space s'il n'existe pas déjà""" api = HfApi() try: # Vérifier si le Space existe api.space_info(space_id) print(f" ✅ Space existant: {space_id}") return space_id except Exception: # Créer le nouveau Space try: print(f" 🆕 Création du Space: {space_id}") # Le Space sera créé automatiquement par Trackio lors du premier init return space_id except Exception as e: print(f" ⚠️ Erreur lors de la création du Space: {e}") return space_id def log_loss_file_to_trackio(data_file, project_name=None): """Log un fichier de loss vers Trackio avec son propre Space""" 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 et son Space if project_name is None: # Extraire le nom du fichier et créer un nom de projet base_name = data_file.stem.replace('_loss', '').replace('_', '-') project_name = f"{base_name}-comparison" space_id = get_project_space_id(project_name) print(f"🎯 Projet Trackio: {project_name}") print(f"🌐 Space ID: {space_id}") # Créer le Space si nécessaire create_space_if_needed(space_id) # 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 mais son propre Space trackio.init( project=project_name, space_id=space_id, # Space unique pour ce projet name=run_name, resume="allow" ) # 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 dans Space {space_id}!") return True, space_id except Exception as e: print(f"❌ Erreur lors du logging de {data_file.name}: {e}") import traceback traceback.print_exc() return False, None def main(): print("🎯 Logger tous les fichiers de loss vers Trackio") print("=" * 60) print("🔄 Un Space Trackio par projet de loss") print("=" * 60) # Liste des fichiers à traiter data_dir = Path("src/content/assets/data") # Mapping fichier -> nom de projet 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 et stocker les space_ids results = {} space_ids = {} for filename, project_name in file_mappings.items(): data_file = data_dir / filename if data_file.exists(): success, space_id = log_loss_file_to_trackio(data_file, project_name) results[filename] = success if success: space_ids[project_name] = space_id else: print(f"\n⚠️ Fichier non trouvé: {filename}") results[filename] = False # Résumé avec les URLs des Spaces print("\n" + "=" * 60) print("📊 RÉSUMÉ") print("=" * 60) success_count = sum(1 for v in results.values() if v) total_count = len(results) print("\n✅ Projets créés avec leurs Spaces:") for filename, success in results.items(): if success: project_name = file_mappings[filename] space_id = space_ids.get(project_name, "N/A") status = "✅" print(f"{status} {filename:30s} → {space_id}") print(f"\n🎉 {success_count}/{total_count} fichiers loggés avec succès!") print(f"\n🌐 URLs des Spaces:") for project_name, space_id in space_ids.items(): print(f" - {project_name}: https://huggingface.co/spaces/{space_id}") return 0 if success_count == total_count else 1 if __name__ == "__main__": exit(main())