-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger.py
More file actions
123 lines (93 loc) · 3.7 KB
/
Copy pathlogger.py
File metadata and controls
123 lines (93 loc) · 3.7 KB
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
"""
Logging system for LLM Developer
Provides training progress logging, error/warning tracking, and performance metrics recording.
"""
import logging
import sys
from datetime import datetime
from typing import Optional
from pathlib import Path
class FormattedLogger:
"""Custom logger with formatted output for LLM Developer"""
def __init__(self, name: str, log_dir: str = 'logs'):
self.log_dir = Path(log_dir)
self.log_dir.mkdir(exist_ok=True)
self.logger = logging.getLogger(name)
self.logger.setLevel(logging.DEBUG)
# Clear existing handlers
self.logger.handlers.clear()
# Create formatters
detailed_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
simple_formatter = logging.Formatter('%(levelname)s - %(message)s')
# File handler (detailed)
log_file = self.log_dir / f"{name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(detailed_formatter)
self.logger.addHandler(file_handler)
# Console handler (simple)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(simple_formatter)
self.logger.addHandler(console_handler)
self.log_file = log_file
def debug(self, msg: str, *args, **kwargs):
self.logger.debug(msg, *args, **kwargs)
def info(self, msg: str, *args, **kwargs):
self.logger.info(msg, *args, **kwargs)
def warning(self, msg: str, *args, **kwargs):
self.logger.warning(msg, *args, **kwargs)
def error(self, msg: str, *args, **kwargs):
self.logger.error(msg, *args, **kwargs)
def critical(self, msg: str, *args, **kwargs):
self.logger.critical(msg, *args, **kwargs)
class TrainingMetrics:
"""Track training metrics"""
def __init__(self):
self.metrics = {
'iterations': [],
'losses': [],
'learning_rates': [],
'validation_losses': []
}
def log_iteration(self, iteration: int, loss: float, lr: float = None):
"""Log iteration metrics"""
self.metrics['iterations'].append(iteration)
self.metrics['losses'].append(loss)
if lr is not None:
self.metrics['learning_rates'].append(lr)
def log_validation(self, validation_loss: float):
"""Log validation metrics"""
self.metrics['validation_losses'].append(validation_loss)
def get_latest_loss(self) -> Optional[float]:
"""Get latest loss value"""
if self.metrics['losses']:
return self.metrics['losses'][-1]
return None
def get_metrics(self):
"""Get all collected metrics"""
return self.metrics
def reset(self):
"""Reset all metrics"""
self.metrics = {
'iterations': [],
'losses': [],
'learning_rates': [],
'validation_losses': []
}
# Global logger instance
_logger: Optional[FormattedLogger] = None
def get_logger(name: str = 'llm_studio') -> FormattedLogger:
"""Get or create a logger instance"""
global _logger
if _logger is None:
_logger = FormattedLogger(name)
return _logger
def initialize_logger(name: str = 'llm_studio', log_dir: str = 'logs') -> FormattedLogger:
"""Initialize a new logger instance"""
global _logger
_logger = FormattedLogger(name, log_dir)
return _logger