mulambo's picture
Initial commit
fea1bd1
# Superezio Enterprise - Arquitetura de Monitoramento de GPU
Este documento detalha a arquitetura do sistema de gerenciamento e monitoramento de hardware, focado em GPUs NVIDIA, implementado no projeto `superezio_enterprise`.
## 1. Visão Geral
O objetivo deste sistema é mover de uma simulação para um gerenciamento de hardware real e em tempo real. O `HardwareManager` agora interage diretamente com os drivers da NVIDIA para descobrir, monitorar e alocar recursos de GPU de forma inteligente. Isso é essencial para aplicações de IA e Machine Learning que dependem de uso eficiente de VRAM e poder computacional.
## 2. Dependência Principal
- **Biblioteca**: `nvidia-ml-py`
- **Descrição**: Este pacote fornece os bindings Python para a **NVIDIA Management Library (NVML)**, que é uma API C para monitorar e gerenciar GPUs NVIDIA. É a mesma biblioteca que alimenta a ferramenta `nvidia-smi`.
- **Instalação**: A dependência foi adicionada ao `requirements.txt`.
## 3. Arquitetura do `HardwareManager`
O `HardwareManager` foi completamente redesenhado e opera como um singleton thread-safe com os seguintes componentes:
### 3.1. Inicialização e Descoberta Automática
- Na inicialização, o `HardwareManager` chama `nvmlInit()`.
- Ele detecta automaticamente o número de GPUs NVIDIA disponíveis no sistema (`nvmlDeviceGetCount()`).
- Se nenhuma GPU for encontrada, ele emite um aviso e opera em um modo degradado onde nenhuma alocação pode ser feita.
- Para cada GPU descoberta, ele obtém e armazena um *handle*, que é um ponteiro para a GPU usado em todas as operações subsequentes.
### 3.2. Monitoramento em Background
- Para evitar que chamadas de monitoramento bloqueiem o loop de eventos principal da aplicação, o `HardwareManager` inicia uma **thread de monitoramento dedicada** (`_monitor_loop`).
- Esta thread executa um loop contínuo que, a cada `gpu_monitoring_interval_seconds` (configurável em `config.py`), chama a função `update_all_gpu_states()`.
- A função `update_all_gpu_states()` coleta as seguintes métricas para cada GPU:
- **Uso de Memória (VRAM)**: Total, livre e usada (em MB).
- **Utilização do Núcleo da GPU**: Em porcentagem (%).
- **Temperatura**: Em graus Celsius (°C).
- **Consumo de Energia**: Em Watts (W).
- Os dados coletados são armazenados em um dicionário de `GpuState` (um dataclass), que fornece um snapshot consistente e thread-safe do estado das GPUs.
### 3.3. Lógica de Alocação Inteligente
A função `assign_model_to_gpu` foi aprimorada para tomar decisões baseadas em dados reais:
- **Input**: Recebe o nome de um modelo e, crucialmente, a **VRAM estimada que ele requer** (`required_vram_mb`).
- **Processo de Decisão**:
1. Verifica se o modelo já está alocado.
2. Itera sobre os estados mais recentes de todas as GPUs (obtidos pela thread de monitoramento).
3. Filtra as GPUs que possuem **VRAM livre suficiente** para atender à requisição.
4. Dentre as candidatas, seleciona aquela com a **menor utilização de núcleo (%)** como critério de desempate.
5. Se nenhuma GPU puder atender à requisição, a alocação falha e um erro é logado.
- **Output**: Retorna o ID da GPU alocada ou `None` em caso de falha.
### 3.4. Liberação e Desligamento
- A função `release_model` remove um modelo das alocações, permitindo que outros modelos usem os recursos.
- A função `shutdown` é crucial: ela para a thread de monitoramento e chama `nvmlShutdown()` para liberar todos os recursos da NVML de forma limpa.
## 4. Integração com Outros Módulos
- **HealthManager**: Um novo health check (`gpu_status`) foi adicionado. Ele verifica se as GPUs estão acessíveis e se suas temperaturas estão dentro de limites seguros (atualmente < 90°C), marcando o sistema como `UNHEALTHY` em caso de superaquecimento.
- **main.py**: O fluxo de demonstração foi atualizado para refletir o novo sistema. Ele tenta alocar modelos com diferentes requisitos de VRAM e imprime um relatório ao vivo do estado das GPUs no console, mostrando a eficácia do monitoramento.
## 5. Como Usar
1. **Instale as dependências**: `pip install -r requirements.txt`.
2. **Execute a aplicação**: `python -m superezio_enterprise.main`.
3. **Observe o Console**: O log mostrará a descoberta das GPUs, o processo de alocação de modelos e um relatório de status ao vivo impresso a cada 5 segundos durante a demonstração.