File size: 5,191 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
#!/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())