File size: 5,479 Bytes
8fb6272
 
 
 
 
3374810
534b64d
8fb6272
 
 
 
 
 
 
 
cd2dff3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3374810
 
274148b
cd2dff3
 
 
 
 
 
274148b
cd2dff3
 
 
 
 
274148b
 
cd2dff3
 
274148b
 
 
 
 
cd2dff3
 
274148b
cd2dff3
 
 
 
 
 
 
 
 
 
274148b
 
cd2dff3
274148b
 
 
cd2dff3
3374810
8fb6272
 
 
 
 
 
 
 
 
 
cd2dff3
8fb6272
 
 
cd2dff3
8fb6272
 
 
 
 
 
cd2dff3
 
 
3374810
8fb6272
 
 
274148b
 
8fb6272
cd2dff3
8fb6272
 
3374810
 
8fb6272
cd2dff3
 
8fb6272
 
 
3374810
 
8fb6272
 
 
 
 
 
 
 
 
 
 
 
 
 
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import os
from dotenv import load_dotenv
from src.presentation.web.gradio_interface import GradioInterface
import logging
import torch
import gc
from src.domain.factories.detector_factory import force_gpu_init, is_gpu_available

# Configurar logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def check_cuda_environment():
    """Verifica e configura o ambiente CUDA."""
    try:
        # Verificar variáveis de ambiente CUDA
        cuda_path = os.getenv('CUDA_HOME') or os.getenv('CUDA_PATH')
        if not cuda_path:
            logger.warning("Variáveis de ambiente CUDA não encontradas")
            return False
            
        # Verificar se CUDA está disponível no PyTorch
        if not torch.cuda.is_available():
            logger.warning("PyTorch não detectou CUDA")
            return False
            
        # Tentar obter informações da GPU
        try:
            device_count = torch.cuda.device_count()
            if device_count > 0:
                device_name = torch.cuda.get_device_name(0)
                logger.info(f"GPU detectada: {device_name}")
                return True
        except Exception as e:
            logger.warning(f"Erro ao obter informações da GPU: {str(e)}")
            
        return False
    except Exception as e:
        logger.error(f"Erro ao verificar ambiente CUDA: {str(e)}")
        return False

def setup_zero_gpu():
    """Configurações otimizadas para Zero-GPU."""
    try:
        # Verificar ambiente CUDA primeiro
        if not check_cuda_environment():
            logger.warning("Ambiente CUDA não está configurado corretamente")
            return False
            
        # Tentar inicializar GPU
        if is_gpu_available():
            # Configurar ambiente
            os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID'
            os.environ['CUDA_VISIBLE_DEVICES'] = '0'
            
            # Limpar memória
            torch.cuda.empty_cache()
            gc.collect()
            
            # Configurações de memória e performance
            os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'
            torch.backends.cuda.matmul.allow_tf32 = True
            torch.backends.cudnn.benchmark = True
            torch.backends.cudnn.allow_tf32 = True
            
            # Configurar fração de memória
            torch.cuda.set_per_process_memory_fraction(0.9)
            
            # Verificar se a configuração foi bem sucedida
            try:
                device = torch.device('cuda')
                dummy = torch.zeros(1, device=device)
                del dummy
                logger.info(f"Configurações Zero-GPU aplicadas com sucesso na GPU: {torch.cuda.get_device_name(0)}")
                return True
            except Exception as e:
                logger.error(f"Erro ao configurar GPU: {str(e)}")
                return False
        else:
            logger.warning("GPU não disponível para configuração Zero-GPU. O sistema operará em modo CPU.")
            return False
    except Exception as e:
        logger.error(f"Erro ao configurar Zero-GPU: {str(e)}")
        logger.warning("Fallback para modo CPU devido a erro na configuração da GPU.")
        return False

def main():
    """Função principal que inicia a aplicação."""
    try:
        # Verificar se está rodando no Hugging Face
        IS_HUGGINGFACE = os.getenv('SPACE_ID') is not None
        
        # Carregar configurações do ambiente apropriado
        if IS_HUGGINGFACE:
            load_dotenv('.env.huggingface')
            logger.info("Ambiente HuggingFace detectado")
            gpu_available = setup_zero_gpu()
        else:
            load_dotenv('.env')
            logger.info("Ambiente local detectado")
            gpu_available = False
        
        # Criar e configurar interface
        interface = GradioInterface()
        demo = interface.create_interface()
        
        if IS_HUGGINGFACE:
            # Configurar com base na disponibilidade da GPU
            if gpu_available:
                gpu_mem = torch.cuda.get_device_properties(0).total_memory / (1024**3)
                max_concurrent = 1  # Forçar single worker para Zero-GPU
                logger.info(f"GPU Memory: {gpu_mem:.1f}GB, Max Concurrent: {max_concurrent}")
            else:
                max_concurrent = 1
                logger.warning("GPU não disponível. O sistema está operando em modo CPU. " +
                             "Todas as funcionalidades estão disponíveis, mas o processamento será mais lento.")
            
            # Configurar fila
            demo = demo.queue(
                api_open=False,
                status_update_rate="auto",
                max_size=5  # Reduzir tamanho da fila para economizar memória
            )
            
            # Launch
            demo.launch(
                server_name="0.0.0.0",
                server_port=7860,
                share=False,
                max_threads=2  # Reduzir número de threads
            )
        else:
            demo.launch(
                server_name="0.0.0.0",
                server_port=7860,
                share=True
            )
            
    except Exception as e:
        logger.error(f"Erro ao iniciar aplicação: {str(e)}")
        raise

if __name__ == "__main__":
    main()