File size: 1,441 Bytes
3470339
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# hardware_manager.py
# Gerencia a detecção e alocação de GPUs para os especialistas.
# Copyright (C) 2025 Carlos Rodrigues dos Santos

import torch
import logging

logger = logging.getLogger(__name__)

class HardwareManager:
    def __init__(self):
        self.gpus = []
        self.allocated_gpus = set()
        if torch.cuda.is_available():
            self.gpus = [f'cuda:{i}' for i in range(torch.cuda.device_count())]
        logger.info(f"Hardware Manager: Encontradas {len(self.gpus)} GPUs disponíveis: {self.gpus}")

    def allocate_gpus(self, specialist_name: str, num_required: int) -> list[str]:
        if not self.gpus or num_required == 0:
            logger.warning(f"Nenhuma GPU disponível ou solicitada para '{specialist_name}'. Alocando para CPU.")
            return ['cpu']

        available_gpus = [gpu for gpu in self.gpus if gpu not in self.allocated_gpus]
        
        if len(available_gpus) < num_required:
            error_msg = f"Recursos de GPU insuficientes para '{specialist_name}'. Solicitado: {num_required}, Disponível: {len(available_gpus)}."
            logger.error(error_msg)
            raise RuntimeError(error_msg)

        allocated = available_gpus[:num_required]
        self.allocated_gpus.update(allocated)
        logger.info(f"Hardware Manager: Alocando GPUs {allocated} para o especialista '{specialist_name}'.")
        return allocated

hardware_manager = HardwareManager()