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 ```
182 lines
5.6 KiB
Python
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()
|