Spaces:
Sleeping
Sleeping
Transcendental-Programmer
commited on
Commit
Β·
90f73f6
1
Parent(s):
bd3da01
fix: streamlit error
Browse files
app.py
CHANGED
|
@@ -22,6 +22,13 @@ class SimulatedFederatedSystem:
|
|
| 22 |
self.active_clients = 0
|
| 23 |
self.clients_ready = 0
|
| 24 |
self.model_weights = [random.random() for _ in range(100)]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
|
| 26 |
def register_client(self, client_id, client_info):
|
| 27 |
self.clients[client_id] = {
|
|
@@ -31,6 +38,11 @@ class SimulatedFederatedSystem:
|
|
| 31 |
'status': 'active'
|
| 32 |
}
|
| 33 |
self.active_clients = len(self.clients)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
return True
|
| 35 |
|
| 36 |
def get_training_status(self):
|
|
@@ -46,6 +58,11 @@ class SimulatedFederatedSystem:
|
|
| 46 |
def start_training(self):
|
| 47 |
self.training_active = True
|
| 48 |
self.current_round = 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
def simulate_training_round(self):
|
| 51 |
if self.training_active and self.current_round < self.total_rounds:
|
|
@@ -54,6 +71,13 @@ class SimulatedFederatedSystem:
|
|
| 54 |
self.global_model_accuracy += random.uniform(0.01, 0.03)
|
| 55 |
self.global_model_accuracy = min(self.global_model_accuracy, 0.95)
|
| 56 |
self.clients_ready = random.randint(2, min(5, self.active_clients))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
def predict(self, features):
|
| 59 |
# Simulate model prediction
|
|
@@ -64,6 +88,10 @@ class SimulatedFederatedSystem:
|
|
| 64 |
base_score = sum(f * w for f, w in zip(features, self.model_weights[:32]))
|
| 65 |
noise = random.uniform(-50, 50)
|
| 66 |
credit_score = max(300, min(850, base_score * 100 + 500 + noise))
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
return credit_score
|
| 68 |
|
| 69 |
# Global simulated system
|
|
@@ -136,6 +164,8 @@ if 'training_history' not in st.session_state:
|
|
| 136 |
st.session_state.training_history = []
|
| 137 |
if 'debug_messages' not in st.session_state:
|
| 138 |
st.session_state.debug_messages = []
|
|
|
|
|
|
|
| 139 |
|
| 140 |
# System Status in sidebar
|
| 141 |
with st.sidebar.expander("System Status"):
|
|
@@ -157,6 +187,17 @@ with st.sidebar.expander("Debug Information"):
|
|
| 157 |
if st.button("Clear Debug Logs"):
|
| 158 |
st.session_state.debug_messages = []
|
| 159 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
# Sidebar educational content
|
| 161 |
with st.sidebar.expander("About Federated Learning"):
|
| 162 |
st.markdown("""
|
|
@@ -291,46 +332,87 @@ if st.session_state.client_simulator:
|
|
| 291 |
else:
|
| 292 |
st.sidebar.warning("Disconnected")
|
| 293 |
|
| 294 |
-
#
|
| 295 |
-
st.
|
| 296 |
-
st.
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 316 |
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
- π **Model Updates Only**: Only gradients/weights are shared
|
| 320 |
-
- π **No Central Database**: No single point of data collection
|
| 321 |
-
- π **Collaborative Learning**: Multiple banks improve the model together
|
| 322 |
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
- π³ **Docker Containers**: Containerized for easy deployment
|
| 326 |
-
- π **Monitoring**: Real-time training metrics and health checks
|
| 327 |
-
- π§ **Configuration**: Flexible config management
|
| 328 |
-
- π§ͺ **Testing**: Comprehensive test suite
|
| 329 |
|
| 330 |
-
|
| 331 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
|
| 333 |
# Auto-refresh for training simulation
|
| 334 |
if st.session_state.federated_system.training_active:
|
| 335 |
time.sleep(2)
|
| 336 |
-
st.
|
|
|
|
| 22 |
self.active_clients = 0
|
| 23 |
self.clients_ready = 0
|
| 24 |
self.model_weights = [random.random() for _ in range(100)]
|
| 25 |
+
# Kubernetes simulation data
|
| 26 |
+
self.k8s_pods = {
|
| 27 |
+
"fl-server": {"status": "Running", "cpu": "20%", "memory": "256MB"},
|
| 28 |
+
"fl-client-1": {"status": "Running", "cpu": "15%", "memory": "128MB"},
|
| 29 |
+
"fl-client-2": {"status": "Running", "cpu": "15%", "memory": "128MB"},
|
| 30 |
+
"fl-client-3": {"status": "Pending", "cpu": "0%", "memory": "0MB"}
|
| 31 |
+
}
|
| 32 |
|
| 33 |
def register_client(self, client_id, client_info):
|
| 34 |
self.clients[client_id] = {
|
|
|
|
| 38 |
'status': 'active'
|
| 39 |
}
|
| 40 |
self.active_clients = len(self.clients)
|
| 41 |
+
# Update Kubernetes simulation
|
| 42 |
+
if self.active_clients <= 3:
|
| 43 |
+
self.k8s_pods[f"fl-client-{self.active_clients}"]["status"] = "Running"
|
| 44 |
+
self.k8s_pods[f"fl-client-{self.active_clients}"]["cpu"] = "15%"
|
| 45 |
+
self.k8s_pods[f"fl-client-{self.active_clients}"]["memory"] = "128MB"
|
| 46 |
return True
|
| 47 |
|
| 48 |
def get_training_status(self):
|
|
|
|
| 58 |
def start_training(self):
|
| 59 |
self.training_active = True
|
| 60 |
self.current_round = 1
|
| 61 |
+
# Update Kubernetes simulation
|
| 62 |
+
self.k8s_pods["fl-server"]["cpu"] = "35%"
|
| 63 |
+
for i in range(1, min(4, self.active_clients + 1)):
|
| 64 |
+
if self.k8s_pods[f"fl-client-{i}"]["status"] == "Running":
|
| 65 |
+
self.k8s_pods[f"fl-client-{i}"]["cpu"] = "25%"
|
| 66 |
|
| 67 |
def simulate_training_round(self):
|
| 68 |
if self.training_active and self.current_round < self.total_rounds:
|
|
|
|
| 71 |
self.global_model_accuracy += random.uniform(0.01, 0.03)
|
| 72 |
self.global_model_accuracy = min(self.global_model_accuracy, 0.95)
|
| 73 |
self.clients_ready = random.randint(2, min(5, self.active_clients))
|
| 74 |
+
# Update Kubernetes simulation
|
| 75 |
+
self.k8s_pods["fl-server"]["cpu"] = f"{30 + random.randint(5, 15)}%"
|
| 76 |
+
self.k8s_pods["fl-server"]["memory"] = f"{256 + self.current_round * 10}MB"
|
| 77 |
+
for i in range(1, min(4, self.active_clients + 1)):
|
| 78 |
+
if self.k8s_pods[f"fl-client-{i}"]["status"] == "Running":
|
| 79 |
+
self.k8s_pods[f"fl-client-{i}"]["cpu"] = f"{20 + random.randint(5, 15)}%"
|
| 80 |
+
self.k8s_pods[f"fl-client-{i}"]["memory"] = f"{128 + self.current_round * 5}MB"
|
| 81 |
|
| 82 |
def predict(self, features):
|
| 83 |
# Simulate model prediction
|
|
|
|
| 88 |
base_score = sum(f * w for f, w in zip(features, self.model_weights[:32]))
|
| 89 |
noise = random.uniform(-50, 50)
|
| 90 |
credit_score = max(300, min(850, base_score * 100 + 500 + noise))
|
| 91 |
+
|
| 92 |
+
# Update Kubernetes simulation for prediction
|
| 93 |
+
self.k8s_pods["fl-server"]["cpu"] = f"{30 + random.randint(5, 10)}%"
|
| 94 |
+
|
| 95 |
return credit_score
|
| 96 |
|
| 97 |
# Global simulated system
|
|
|
|
| 164 |
st.session_state.training_history = []
|
| 165 |
if 'debug_messages' not in st.session_state:
|
| 166 |
st.session_state.debug_messages = []
|
| 167 |
+
if 'kubernetes_view' not in st.session_state:
|
| 168 |
+
st.session_state.kubernetes_view = False
|
| 169 |
|
| 170 |
# System Status in sidebar
|
| 171 |
with st.sidebar.expander("System Status"):
|
|
|
|
| 187 |
if st.button("Clear Debug Logs"):
|
| 188 |
st.session_state.debug_messages = []
|
| 189 |
|
| 190 |
+
# Kubernetes monitoring in sidebar
|
| 191 |
+
with st.sidebar.expander("Kubernetes Monitoring"):
|
| 192 |
+
st.write("**Simulated Kubernetes Cluster**")
|
| 193 |
+
|
| 194 |
+
if st.button("Toggle Kubernetes View"):
|
| 195 |
+
st.session_state.kubernetes_view = not st.session_state.kubernetes_view
|
| 196 |
+
|
| 197 |
+
st.success("β
Kubernetes Cluster Running")
|
| 198 |
+
st.info(f"Namespace: federated-learning")
|
| 199 |
+
st.info(f"Pods Running: {system.active_clients + 1}") # Clients + Server
|
| 200 |
+
|
| 201 |
# Sidebar educational content
|
| 202 |
with st.sidebar.expander("About Federated Learning"):
|
| 203 |
st.markdown("""
|
|
|
|
| 332 |
else:
|
| 333 |
st.sidebar.warning("Disconnected")
|
| 334 |
|
| 335 |
+
# Kubernetes visualization (if enabled)
|
| 336 |
+
if st.session_state.kubernetes_view:
|
| 337 |
+
st.header("Kubernetes Cluster Visualization")
|
| 338 |
+
|
| 339 |
+
# Create a simple visualization of the Kubernetes cluster
|
| 340 |
+
st.markdown("""
|
| 341 |
+
```
|
| 342 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 343 |
+
β Kubernetes Cluster (Simulated) β
|
| 344 |
+
β β
|
| 345 |
+
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
|
| 346 |
+
β β fl-server β β fl-client-1 β β fl-client-2 β β
|
| 347 |
+
β β Pod β β Pod β β Pod β β
|
| 348 |
+
β β Running β
β β Running β
β β Running β
β β
|
| 349 |
+
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
|
| 350 |
+
β β
|
| 351 |
+
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
| 352 |
+
β β fl-server-service β β
|
| 353 |
+
β β Type: ClusterIP β β
|
| 354 |
+
β β Port: 8080:8000 β β
|
| 355 |
+
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
| 356 |
+
β β
|
| 357 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 358 |
+
```
|
| 359 |
+
""")
|
| 360 |
+
|
| 361 |
+
# Show simulated Kubernetes metrics
|
| 362 |
+
col1, col2 = st.columns(2)
|
| 363 |
+
|
| 364 |
+
with col1:
|
| 365 |
+
st.subheader("Pod Status")
|
| 366 |
+
pod_status = {}
|
| 367 |
+
for pod_name, pod_data in system.k8s_pods.items():
|
| 368 |
+
pod_status[pod_name] = pod_data["status"]
|
| 369 |
+
st.json(pod_status)
|
| 370 |
+
|
| 371 |
+
with col2:
|
| 372 |
+
st.subheader("Resource Usage")
|
| 373 |
+
resource_usage = {
|
| 374 |
+
pod_name: {
|
| 375 |
+
"CPU": pod_data["cpu"],
|
| 376 |
+
"Memory": pod_data["memory"]
|
| 377 |
+
} for pod_name, pod_data in system.k8s_pods.items()
|
| 378 |
+
}
|
| 379 |
+
st.json(resource_usage)
|
| 380 |
+
|
| 381 |
+
# Kubernetes commands
|
| 382 |
+
st.subheader("Kubernetes Commands")
|
| 383 |
+
with st.expander("Available Commands"):
|
| 384 |
+
st.code("""
|
| 385 |
+
# View all pods
|
| 386 |
+
kubectl get pods -n federated-learning
|
| 387 |
|
| 388 |
+
# View all services
|
| 389 |
+
kubectl get services -n federated-learning
|
|
|
|
|
|
|
|
|
|
| 390 |
|
| 391 |
+
# View pod logs
|
| 392 |
+
kubectl logs -f deployment/fl-server -n federated-learning
|
|
|
|
|
|
|
|
|
|
|
|
|
| 393 |
|
| 394 |
+
# Scale deployment
|
| 395 |
+
kubectl scale deployment/fl-client --replicas=5 -n federated-learning
|
| 396 |
+
""")
|
| 397 |
+
|
| 398 |
+
# Kubernetes deployment visualization
|
| 399 |
+
st.subheader("Deployment Architecture")
|
| 400 |
+
st.markdown("""
|
| 401 |
+
```mermaid
|
| 402 |
+
graph TD
|
| 403 |
+
A[Kubernetes Cluster] --> B[federated-learning Namespace]
|
| 404 |
+
B --> C[fl-server Deployment]
|
| 405 |
+
B --> D[fl-client Deployment]
|
| 406 |
+
B --> E[fl-server-service Service]
|
| 407 |
+
C --> F[fl-server Pod]
|
| 408 |
+
D --> G[fl-client-1 Pod]
|
| 409 |
+
D --> H[fl-client-2 Pod]
|
| 410 |
+
D --> I[fl-client-3 Pod]
|
| 411 |
+
E --> F
|
| 412 |
+
```
|
| 413 |
+
""")
|
| 414 |
|
| 415 |
# Auto-refresh for training simulation
|
| 416 |
if st.session_state.federated_system.training_active:
|
| 417 |
time.sleep(2)
|
| 418 |
+
st.rerun()
|