FlameF0X commited on
Commit
e38b1c0
·
verified ·
1 Parent(s): e1a9cb7

Create client.py

Browse files
Files changed (1) hide show
  1. client.py +166 -0
client.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import time
3
+ from typing import Dict, Any, Optional
4
+ import os
5
+
6
+ class MLTracker:
7
+ """Python client for ML Tracker - Free W&B Alternative"""
8
+
9
+ def __init__(self, api_key: str, base_url: str = "https://your-space-url.hf.space"):
10
+ self.api_key = api_key
11
+ self.base_url = base_url.rstrip('/')
12
+ self.current_experiment = None
13
+ self.step = 0
14
+
15
+ def init(self, experiment_name: str, config: Optional[Dict[str, Any]] = None):
16
+ self.current_experiment = experiment_name
17
+ self.step = 0
18
+ if config:
19
+ self.log_config(experiment_name, config)
20
+
21
+ def log_config(self, experiment_name: str, config: Dict[str, Any]):
22
+ try:
23
+ response = requests.post(
24
+ f"{self.base_url}/api/log",
25
+ json={
26
+ "api_key": self.api_key,
27
+ "experiment": experiment_name,
28
+ "step": 0,
29
+ "metrics": {},
30
+ "config": config,
31
+ "timestamp": time.time()
32
+ }
33
+ )
34
+ response.raise_for_status()
35
+ return response.json()
36
+ except Exception as e:
37
+ print(f"Warning: Failed to log config: {e}")
38
+ return None
39
+
40
+ def log(self, metrics: Dict[str, Any], step: Optional[int] = None):
41
+ if not self.current_experiment:
42
+ raise ValueError("No experiment initialized. Call init() first.")
43
+ if step is None:
44
+ self.step += 1
45
+ step = self.step
46
+ else:
47
+ self.step = max(self.step, step)
48
+ try:
49
+ response = requests.post(
50
+ f"{self.base_url}/api/log",
51
+ json={
52
+ "api_key": self.api_key,
53
+ "experiment": self.current_experiment,
54
+ "step": step,
55
+ "metrics": metrics,
56
+ "timestamp": time.time()
57
+ }
58
+ )
59
+ response.raise_for_status()
60
+ return response.json()
61
+ except Exception as e:
62
+ print(f"Warning: Failed to log metrics: {e}")
63
+ return None
64
+
65
+ def delete_experiment(self, experiment_name: str):
66
+ try:
67
+ response = requests.delete(
68
+ f"{self.base_url}/api/experiment/{experiment_name}",
69
+ params={"api_key": self.api_key}
70
+ )
71
+ response.raise_for_status()
72
+ return response.json()
73
+ except Exception as e:
74
+ print(f"Error deleting experiment: {e}")
75
+ return None
76
+
77
+ def get_experiments(self):
78
+ try:
79
+ response = requests.get(
80
+ f"{self.base_url}/api/experiments",
81
+ params={"api_key": self.api_key}
82
+ )
83
+ response.raise_for_status()
84
+ return response.json().get("experiments", [])
85
+ except Exception as e:
86
+ print(f"Error fetching experiments: {e}")
87
+ return []
88
+
89
+ def get_experiment(self, experiment_name: str):
90
+ try:
91
+ response = requests.get(
92
+ f"{self.base_url}/api/experiment/{experiment_name}",
93
+ params={"api_key": self.api_key}
94
+ )
95
+ response.raise_for_status()
96
+ return response.json()
97
+ except Exception as e:
98
+ print(f"Error fetching experiment: {e}")
99
+ return None
100
+
101
+ def finish(self):
102
+ self.current_experiment = None
103
+ self.step = 0
104
+
105
+
106
+ # Global tracker and convenience functions
107
+ _global_tracker = None
108
+
109
+ def init(experiment_name: str, config: Optional[Dict[str, Any]] = None,
110
+ api_key: Optional[str] = None, base_url: Optional[str] = None):
111
+ global _global_tracker
112
+ if api_key is None:
113
+ api_key = os.environ.get("ML_TRACKER_API_KEY")
114
+ if not api_key:
115
+ raise ValueError("API key not provided and ML_TRACKER_API_KEY not set")
116
+ if base_url is None:
117
+ base_url = os.environ.get("ML_TRACKER_BASE_URL", "https://your-space-url.hf.space")
118
+ _global_tracker = MLTracker(api_key, base_url)
119
+ _global_tracker.init(experiment_name, config)
120
+
121
+ def log(metrics: Dict[str, Any], step: Optional[int] = None):
122
+ if _global_tracker is None:
123
+ raise ValueError("No experiment initialized. Call init() first.")
124
+ return _global_tracker.log(metrics, step)
125
+
126
+ def finish():
127
+ global _global_tracker
128
+ if _global_tracker:
129
+ _global_tracker.finish()
130
+ _global_tracker = None
131
+
132
+
133
+ if __name__ == "__main__":
134
+ # Example usage
135
+ tracker = MLTracker(
136
+ api_key="your-api-key-here",
137
+ base_url="https://your-space-url.hf.space"
138
+ )
139
+ tracker.init("my_experiment", config={
140
+ "model": "ResNet50",
141
+ "dataset": "CIFAR-10",
142
+ "learning_rate": 0.001,
143
+ "batch_size": 32
144
+ })
145
+ for epoch in range(10):
146
+ loss = 2.0 * (0.9 ** epoch) + 0.1
147
+ accuracy = 1.0 - (0.9 ** epoch)
148
+ tracker.log({
149
+ "loss": loss,
150
+ "accuracy": accuracy,
151
+ "epoch": epoch
152
+ })
153
+ tracker.finish()
154
+
155
+ init("another_experiment", config={"model": "BERT"})
156
+ for step in range(5):
157
+ log({"loss": 1.0 / (step + 1), "step": step})
158
+ finish()
159
+
160
+ experiments = tracker.get_experiments()
161
+ print(f"Found {len(experiments)} experiments")
162
+
163
+ if experiments:
164
+ exp_data = tracker.get_experiment(experiments[0]["experiment"])
165
+ if exp_data:
166
+ print(f"Experiment has {len(exp_data.get('metrics', []))} metric entries")