File size: 6,624 Bytes
4cafdc3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/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())