Files
aitbc/apps/miner-dashboard/miner_service.py
oib 9b9c5beb23 ```
chore: enhance .gitignore and remove obsolete documentation files

- Reorganize .gitignore with categorized sections for better maintainability
- Add comprehensive ignore patterns for Python, Node.js, databases, logs, and build artifacts
- Add project-specific ignore rules for coordinator, explorer, and deployment files
- Remove outdated documentation: BITCOIN-WALLET-SETUP.md, LOCAL_ASSETS_SUMMARY.md, README-CONTAINER-DEPLOYMENT.md, README-DOMAIN-DEPLOYMENT.md
```
2026-01-24 14:44:51 +01:00

182 lines
5.6 KiB
Python

#!/usr/bin/env python3
"""AITBC GPU Mining Service"""
import subprocess
import time
import json
import random
from datetime import datetime
import threading
class AITBCMiner:
def __init__(self):
self.running = False
self.jobs = []
self.stats = {
'total_jobs': 0,
'completed_jobs': 0,
'failed_jobs': 0,
'hash_rate': 0,
'uptime': 0
}
self.start_time = None
def start_mining(self):
"""Start the mining service"""
self.running = True
self.start_time = time.time()
print("🚀 AITBC Miner started")
# Start mining threads
mining_thread = threading.Thread(target=self._mining_loop)
mining_thread.daemon = True
mining_thread.start()
# Start status monitoring
monitor_thread = threading.Thread(target=self._monitor_gpu)
monitor_thread.daemon = True
monitor_thread.start()
def stop_mining(self):
"""Stop the mining service"""
self.running = False
print("⛔ AITBC Miner stopped")
def _mining_loop(self):
"""Main mining loop"""
while self.running:
# Simulate job processing
if random.random() > 0.7: # 30% chance of new job
job = self._create_job()
self.jobs.append(job)
self._process_job(job)
time.sleep(1)
def _create_job(self):
"""Create a new mining job"""
job_types = [
'Matrix Computation',
'Hash Validation',
'Block Verification',
'Transaction Processing',
'AI Model Training'
]
job = {
'id': f"job_{int(time.time())}_{random.randint(1000, 9999)}",
'name': random.choice(job_types),
'progress': 0,
'status': 'running',
'created_at': datetime.now().isoformat()
}
self.stats['total_jobs'] += 1
return job
def _process_job(self, job):
"""Process a mining job"""
processing_thread = threading.Thread(target=self._process_job_thread, args=(job,))
processing_thread.daemon = True
processing_thread.start()
def _process_job_thread(self, job):
"""Process job in separate thread"""
duration = random.randint(5, 30)
steps = 20
for i in range(steps + 1):
if not self.running:
break
job['progress'] = int((i / steps) * 100)
time.sleep(duration / steps)
if self.running:
job['status'] = 'completed' if random.random() > 0.05 else 'failed'
job['completed_at'] = datetime.now().isoformat()
if job['status'] == 'completed':
self.stats['completed_jobs'] += 1
else:
self.stats['failed_jobs'] += 1
def _monitor_gpu(self):
"""Monitor GPU status"""
while self.running:
try:
# Get GPU utilization
result = subprocess.run(['nvidia-smi', '--query-gpu=utilization.gpu', '--format=csv,noheader,nounits'],
capture_output=True, text=True)
if result.returncode == 0:
gpu_util = int(result.stdout.strip())
# Simulate hash rate based on GPU utilization
self.stats['hash_rate'] = round(gpu_util * 0.5 + random.uniform(-5, 5), 1)
except Exception as e:
print(f"GPU monitoring error: {e}")
self.stats['hash_rate'] = random.uniform(40, 60)
# Update uptime
if self.start_time:
self.stats['uptime'] = int(time.time() - self.start_time)
time.sleep(2)
def get_status(self):
"""Get current mining status"""
return {
'running': self.running,
'stats': self.stats.copy(),
'active_jobs': [j for j in self.jobs if j['status'] == 'running'],
'gpu_info': self._get_gpu_info()
}
def _get_gpu_info(self):
"""Get GPU information"""
try:
result = subprocess.run(['nvidia-smi', '--query-gpu=name,utilization.gpu,temperature.gpu,power.draw,memory.used,memory.total',
'--format=csv,noheader,nounits'],
capture_output=True, text=True)
if result.returncode == 0:
values = result.stdout.strip().split(', ')
return {
'name': values[0],
'utilization': int(values[1]),
'temperature': int(values[2]),
'power': float(values[3]),
'memory_used': float(values[4]),
'memory_total': float(values[5])
}
except:
pass
return {
'name': 'NVIDIA GeForce RTX 4060 Ti',
'utilization': 0,
'temperature': 43,
'power': 18,
'memory_used': 2902,
'memory_total': 16380
}
# Global miner instance
miner = AITBCMiner()
if __name__ == "__main__":
print("AITBC GPU Mining Service")
print("=" * 40)
try:
miner.start_mining()
# Keep running
while True:
time.sleep(10)
except KeyboardInterrupt:
print("\nShutting down...")
miner.stop_mining()