| |
| import torch |
| import matplotlib.pyplot as plt |
| import matplotlib.animation as animation |
| from datetime import datetime |
| import subprocess |
| import time |
| import psutil |
| import re |
| from collections import deque |
| import threading |
|
|
| class GPUBenchmark: |
| def __init__(self): |
| self.max_temp = 85 |
| self.temperatures = deque(maxlen=100) |
| self.tflops_history = deque(maxlen=100) |
| self.times = deque(maxlen=100) |
| self.peak_tflops = 0 |
| self.running = True |
| self.stress_size = 8192 |
| self.fig, (self.ax1, self.ax2) = plt.subplots(2, 1, figsize=(12, 8)) |
| self.fig.suptitle('Benchmark TFLOPS - Radeon Pro VII', fontsize=16) |
| |
| def get_gpu_temp(self): |
| try: |
| result = subprocess.run(['sensors'], capture_output=True, text=True, timeout=1) |
| for line in result.stdout.split('\n'): |
| if 'edge:' in line.lower(): |
| match = re.search(r'([+-]?\d+\.?\d*)\s*°C', line) |
| if match: |
| return float(match.group(1)) |
| except: |
| return 0 |
| return 0 |
|
|
| def check_system_responsiveness(self): |
| try: |
| start = time.time() |
| _ = psutil.cpu_percent(interval=0.1) |
| return (time.time() - start) < 0.5 |
| except: |
| return False |
|
|
| def calculate_tflops(self, matrix_size, elapsed_time): |
| operations = 2 * (matrix_size ** 3) |
| return (operations / elapsed_time) / 1e12 |
|
|
| def stress_gpu(self): |
| device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') |
| if device.type == 'cpu': |
| print("ERRO: GPU não detectada!") |
| self.running = False |
| return |
| |
| print(f"GPU detectada: {torch.cuda.get_device_name(0)}") |
| print("Iniciando benchmark...\n") |
| |
| while self.running: |
| temp = self.get_gpu_temp() |
| if temp >= self.max_temp: |
| print(f"\n⚠ TEMPERATURA LIMITE: {temp}°C") |
| self.running = False |
| break |
| |
| if not self.check_system_responsiveness(): |
| print("\n⚠ SISTEMA TRAVANDO") |
| self.running = False |
| break |
| |
| try: |
| torch.cuda.synchronize() |
| start = time.time() |
| a = torch.randn(self.stress_size, self.stress_size, device=device) |
| b = torch.randn(self.stress_size, self.stress_size, device=device) |
| c = torch.mm(a, b) |
| torch.cuda.synchronize() |
| elapsed = time.time() - start |
| |
| tflops = self.calculate_tflops(self.stress_size, elapsed) |
| self.temperatures.append(temp) |
| self.tflops_history.append(tflops) |
| self.times.append(datetime.now()) |
| |
| if tflops > self.peak_tflops: |
| self.peak_tflops = tflops |
| |
| print(f"TFLOPS: {tflops:.2f} | Temp: {temp}°C | Peak: {self.peak_tflops:.2f}", end='\r') |
| |
| if temp < 75 and tflops < self.peak_tflops * 0.9: |
| self.stress_size = min(self.stress_size + 256, 16384) |
| elif temp > 80: |
| self.stress_size = max(self.stress_size - 256, 4096) |
| |
| time.sleep(0.1) |
| except Exception as e: |
| print(f"\n⚠ ERRO: {e}") |
| self.running = False |
| break |
|
|
| def update_plot(self, frame): |
| if not self.running and len(self.tflops_history) == 0: |
| return |
| |
| self.ax1.clear() |
| self.ax2.clear() |
| |
| if len(self.tflops_history) > 0: |
| self.ax1.plot(list(self.tflops_history), 'b-', linewidth=2, label='TFLOPS atual') |
| self.ax1.axhline(y=self.peak_tflops, color='g', linestyle='--', |
| label=f'Peak: {self.peak_tflops:.2f} TFLOPS') |
| self.ax1.set_ylabel('TFLOPS', fontsize=12) |
| self.ax1.set_title('Desempenho em Tempo Real') |
| self.ax1.legend() |
| self.ax1.grid(True, alpha=0.3) |
| |
| if len(self.temperatures) > 0: |
| self.ax2.plot(list(self.temperatures), 'r-', linewidth=2, label='Temperatura') |
| self.ax2.axhline(y=self.max_temp, color='orange', linestyle='--', |
| label=f'Limite: {self.max_temp}°C') |
| self.ax2.set_ylabel('Temperatura (°C)', fontsize=12) |
| self.ax2.set_xlabel('Amostras', fontsize=12) |
| self.ax2.legend() |
| self.ax2.grid(True, alpha=0.3) |
| |
| if not self.running: |
| self.ax1.text(0.5, 0.5, f'PEAK TFLOPS: {self.peak_tflops:.2f}', |
| transform=self.ax1.transAxes, fontsize=20, |
| ha='center', color='green', weight='bold') |
|
|
| def run(self): |
| stress_thread = threading.Thread(target=self.stress_gpu) |
| stress_thread.daemon = True |
| stress_thread.start() |
| |
| ani = animation.FuncAnimation(self.fig, self.update_plot, |
| interval=500, cache_frame_data=False) |
| plt.tight_layout() |
| plt.show() |
| stress_thread.join(timeout=2) |
| |
| print(f"\n\n{'='*50}") |
| print(f"RESULTADO FINAL") |
| print(f"{'='*50}") |
| print(f"🏆 PEAK TFLOPS: {self.peak_tflops:.2f}") |
| print(f"🌡️ Temp máxima: {max(self.temperatures) if self.temperatures else 0:.1f}°C") |
| print(f"{'='*50}\n") |
|
|
| if __name__ == "__main__": |
| benchmark = GPUBenchmark() |
| benchmark.run() |
|
|