Introduction au système de logs
DragGAN, un outil d'édition interactive d'images basé sur StyleGAN, utilise un mécanisme de journalisation pour faciliter le suivi des performances et le débogage. Cet article explore les composants clés du système de logging intégré à DragGAN.
Composants principaux de journalisation
Collecte des statistiques d'entraînement
Dans torch_utils/training_stats.py, une classe Collector centralise la récupération des métriques :
class Collector:
def __init__(self, regex='.*', keep_previous=True):
self._regex = re.compile(regex)
self._keep_previous = keep_previous
self._cumulative = {}
self._moments = {}
Affichage des indicateurs pendant l'entraînement
Le fichier training/training_loop.py génère périodiqueemnt un rapport détaillé :
status_fields = []
status_fields.append(f"itération {report_statistic('Progress/tick', current_iteration):<5d}")
status_fields.append(f"kimg {report_statistic('Progress/kimg', processed_images / 1e3):<8.1f}")
status_fields.append(f"durée {format_duration(report_statistic('Timing/total_sec', elapsed_time)):<12s}")
status_fields.append(f"s/itér {report_statistic('Timing/sec_per_tick', tick_duration):<7.1f}")
status_fields.append(f"s/kimg {report_statistic('Timing/sec_per_kimg', time_per_kimg):<7.2f}")
status_fields.append(f"maintenance {report_statistic('Timing/maintenance_sec', maintenance_duration):<6.1f}")
status_fields.append(f"mémoire_cpu {report_statistic('Resources/cpu_mem_gb', cpu_usage / 2**30):<6.2f}")
status_fields.append(f"mémoire_gpu {report_statistic('Resources/peak_gpu_mem_gb', gpu_peak_memory / 2**30):<6.2f}")
Jorunalisation en temps réel pour le débogage
Des messages utiles sont affichés lors des interactions utilisateur :
# Exemple depuis visualizer_drag_gradio.py
print(f'Fichiers dans le cache ({cache_dir}):')
print(os.listdir(cache_dir))
# Log des actions de drag
print(f'Origine: {source_coords}')
print(f'Destination: {target_coords}')
print(f'État actuel: {app_state["editing_state"]}')
Formats et destinations des journaux
Fichier JSON Lines
log_file = open(join(output_folder, 'metrics.jsonl'), 'wt')
# Format de sortie: {"Progress/kimg": 25.6, "Timing/total_sec": 45234, ...}
Intégration avec TensorBoard
try:
from torch.utils.tensorboard import SummaryWriter
tb_writer = SummaryWriter(output_folder)
except ImportError as e:
print("Export TensorBoard désactivé:", str(e))
Affichage console
itération 150 kimg 25.6 durée 12:34:56 s/itér 45.2 s/kimg 1.76
maintenance 12.3 mémoire_cpu 4.2 mémoire_gpu 8.7
Analyse des performances via les logs
Détection des goulets d'étranglement
for step in training_phases:
duration = []
if step.start_event and step.end_event:
step.end_event.synchronize()
duration = step.start_event.elapsed_time(step.end_event)
report_statistic('Timing/' + step.name, duration)
Suivi de l'utilisation mémoire
gpu_memory = report_statistic(
'Resources/peak_gpu_mem_gb',
torch.cuda.max_memory_allocated(device) / 2**30
)
Mode détaillé pour l'interface utilisateur
DEBUG_MODE = True
if DEBUG_MODE:
print("Paramètres courants:")
print(f" Point source: {source_coords}")
print(f" Point cible: {target_coords}")
Fonctionnalités avancées
Synchronisation multi-processus
def setup_multiprocess_logging(rank, device_sync):
global process_rank, sync_target
process_rank = rank
sync_target = device_sync
Rapports personnalisés
report_statistic('Custom/LossValue', computed_loss)
report_statistic('Custom/PrecisionRate', model_accuracy)
Résolution des problèmes fréquents
| Symptôme | Cause probable | Action corrective |
|---|---|---|
| Absence de logs | Niveau de verbosité mal configuré | Vérifier activation mode debug |
| Métriques incomplètes | Problème de synchronisation entre processus | Contrôler appel setup_multiprocess_logging |
| Mesure mémoire incorrecte | Contexte CUDA non approprié | Valider contexte GPU utilisé |
| Données temporelles aberrantes | Synchronisation événements CUDA défaillante | Vérifier ordonnancement des events |
Script d'analyse des logs
import json
import pandas as pd
def parse_training_logs(path_to_log):
with open(path_to_log, 'r') as log_data:
parsed_lines = [json.loads(entry) for entry in log_data]
dataframe = pd.DataFrame(parsed_lines)
summary_metrics = {
'temps_moyen_par_kimg': dataframe['Timing/sec_per_kimg'].mean(),
'pic_utilisation_gpu': dataframe['Resources/peak_gpu_mem_gb'].max(),
'temps_total_heures': dataframe['Timing/total_hours'].iloc[-1]
}
return summary_metrics