Système de journalisation dans DragGAN : Suivi du débogage et des performances

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

Étiquettes: DragGAN StyleGAN PyTorch TensorBoard logging

Publié le 19 août à 17h40