Spaces:
Paused
Paused
| # api/gpu_manager.py | |
| import os | |
| import torch | |
| class GPUManager: | |
| """ | |
| Gerencia e aloca GPUs disponíveis para diferentes serviços (LTX, SeedVR). | |
| """ | |
| def __init__(self): | |
| self.total_gpus = torch.cuda.device_count() | |
| self.ltx_gpus = [] | |
| self.seedvr_gpus = [] | |
| self._allocate_gpus() | |
| def _allocate_gpus(self): | |
| """ | |
| Divide as GPUs disponíveis entre os serviços LTX e SeedVR. | |
| """ | |
| print("="*50) | |
| print("🤖 Gerenciador de GPUs inicializado.") | |
| print(f" > Total de GPUs detectadas: {self.total_gpus}") | |
| if self.total_gpus == 0: | |
| print(" > Nenhuma GPU detectada. Operando em modo CPU.") | |
| elif self.total_gpus == 1: | |
| print(" > 1 GPU detectada. Modo de compartilhamento de memória será usado.") | |
| # Ambos usarão a GPU 0, mas precisarão gerenciar a memória | |
| self.ltx_gpus = [0] | |
| self.seedvr_gpus = [0] | |
| else: | |
| # Divide as GPUs entre os dois serviços | |
| mid_point = self.total_gpus // 2 | |
| self.ltx_gpus = list(range(0, mid_point)) | |
| self.seedvr_gpus = list(range(mid_point, self.total_gpus)) | |
| print(f" > Alocação: LTX usará GPUs {self.ltx_gpus}, SeedVR usará GPUs {self.seedvr_gpus}.") | |
| print("="*50) | |
| def get_ltx_device(self): | |
| """Retorna o dispositivo principal para o LTX.""" | |
| if not self.ltx_gpus: | |
| return torch.device("cpu") | |
| # Por padrão, o modelo principal do LTX roda na primeira GPU do seu grupo | |
| return torch.device(f"cuda:{self.ltx_gpus[0]}") | |
| def get_seedvr_devices(self) -> list: | |
| """Retorna a lista de IDs de GPU para o SeedVR.""" | |
| return self.seedvr_gpus | |
| def requires_memory_swap(self) -> bool: | |
| """Verifica se é necessário mover modelos entre CPU e GPU.""" | |
| return self.total_gpus < 2 | |
| # Instância global para ser importada por outros módulos | |
| gpu_manager = GPUManager() |