Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
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())
|