Marcus Vinicius Zerbini Canhaço commited on
Commit
cd2dff3
·
1 Parent(s): 274148b

feat: atualização do detector com otimizações para GPU T4

Browse files
Files changed (1) hide show
  1. src/main.py +64 -16
src/main.py CHANGED
@@ -13,32 +13,79 @@ logging.basicConfig(
13
  )
14
  logger = logging.getLogger(__name__)
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  def setup_zero_gpu():
17
  """Configurações otimizadas para Zero-GPU."""
18
  try:
19
- # Forçar inicialização da GPU
 
 
 
 
 
20
  if is_gpu_available():
21
- force_gpu_init()
22
- # Limpar cache CUDA
 
 
 
23
  torch.cuda.empty_cache()
24
  gc.collect()
25
-
26
- # Configurações para otimizar memória
27
  os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'
28
  torch.backends.cuda.matmul.allow_tf32 = True
29
  torch.backends.cudnn.benchmark = True
30
  torch.backends.cudnn.allow_tf32 = True
31
 
32
- # Configurar device map para melhor utilização da memória
33
- os.environ['CUDA_VISIBLE_DEVICES'] = '0'
34
- torch.cuda.set_per_process_memory_fraction(0.9) # Usar 90% da memória disponível
35
 
36
- logger.info(f"Configurações Zero-GPU aplicadas com sucesso na GPU: {torch.cuda.get_device_name(0)}")
 
 
 
 
 
 
 
 
 
37
  else:
38
  logger.warning("GPU não disponível para configuração Zero-GPU. O sistema operará em modo CPU.")
 
39
  except Exception as e:
40
  logger.error(f"Erro ao configurar Zero-GPU: {str(e)}")
41
  logger.warning("Fallback para modo CPU devido a erro na configuração da GPU.")
 
42
 
43
  def main():
44
  """Função principal que inicia a aplicação."""
@@ -50,19 +97,20 @@ def main():
50
  if IS_HUGGINGFACE:
51
  load_dotenv('.env.huggingface')
52
  logger.info("Ambiente HuggingFace detectado")
53
- setup_zero_gpu()
54
  else:
55
  load_dotenv('.env')
56
  logger.info("Ambiente local detectado")
 
57
 
58
  # Criar e configurar interface
59
  interface = GradioInterface()
60
  demo = interface.create_interface()
61
 
62
  if IS_HUGGINGFACE:
63
- # Calcular número ideal de workers baseado na GPU
64
- if is_gpu_available():
65
- gpu_mem = torch.cuda.get_device_properties(0).total_memory / (1024**3) # em GB
66
  max_concurrent = 1 # Forçar single worker para Zero-GPU
67
  logger.info(f"GPU Memory: {gpu_mem:.1f}GB, Max Concurrent: {max_concurrent}")
68
  else:
@@ -70,13 +118,14 @@ def main():
70
  logger.warning("GPU não disponível. O sistema está operando em modo CPU. " +
71
  "Todas as funcionalidades estão disponíveis, mas o processamento será mais lento.")
72
 
73
- # Primeiro configurar a fila
74
  demo = demo.queue(
75
  api_open=False,
76
  status_update_rate="auto",
77
  max_size=5 # Reduzir tamanho da fila para economizar memória
78
  )
79
- # Depois fazer o launch
 
80
  demo.launch(
81
  server_name="0.0.0.0",
82
  server_port=7860,
@@ -84,7 +133,6 @@ def main():
84
  max_threads=2 # Reduzir número de threads
85
  )
86
  else:
87
- # Ambiente local - apenas launch direto
88
  demo.launch(
89
  server_name="0.0.0.0",
90
  server_port=7860,
 
13
  )
14
  logger = logging.getLogger(__name__)
15
 
16
+ def check_cuda_environment():
17
+ """Verifica e configura o ambiente CUDA."""
18
+ try:
19
+ # Verificar variáveis de ambiente CUDA
20
+ cuda_path = os.getenv('CUDA_HOME') or os.getenv('CUDA_PATH')
21
+ if not cuda_path:
22
+ logger.warning("Variáveis de ambiente CUDA não encontradas")
23
+ return False
24
+
25
+ # Verificar se CUDA está disponível no PyTorch
26
+ if not torch.cuda.is_available():
27
+ logger.warning("PyTorch não detectou CUDA")
28
+ return False
29
+
30
+ # Tentar obter informações da GPU
31
+ try:
32
+ device_count = torch.cuda.device_count()
33
+ if device_count > 0:
34
+ device_name = torch.cuda.get_device_name(0)
35
+ logger.info(f"GPU detectada: {device_name}")
36
+ return True
37
+ except Exception as e:
38
+ logger.warning(f"Erro ao obter informações da GPU: {str(e)}")
39
+
40
+ return False
41
+ except Exception as e:
42
+ logger.error(f"Erro ao verificar ambiente CUDA: {str(e)}")
43
+ return False
44
+
45
  def setup_zero_gpu():
46
  """Configurações otimizadas para Zero-GPU."""
47
  try:
48
+ # Verificar ambiente CUDA primeiro
49
+ if not check_cuda_environment():
50
+ logger.warning("Ambiente CUDA não está configurado corretamente")
51
+ return False
52
+
53
+ # Tentar inicializar GPU
54
  if is_gpu_available():
55
+ # Configurar ambiente
56
+ os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID'
57
+ os.environ['CUDA_VISIBLE_DEVICES'] = '0'
58
+
59
+ # Limpar memória
60
  torch.cuda.empty_cache()
61
  gc.collect()
62
+
63
+ # Configurações de memória e performance
64
  os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'
65
  torch.backends.cuda.matmul.allow_tf32 = True
66
  torch.backends.cudnn.benchmark = True
67
  torch.backends.cudnn.allow_tf32 = True
68
 
69
+ # Configurar fração de memória
70
+ torch.cuda.set_per_process_memory_fraction(0.9)
 
71
 
72
+ # Verificar se a configuração foi bem sucedida
73
+ try:
74
+ device = torch.device('cuda')
75
+ dummy = torch.zeros(1, device=device)
76
+ del dummy
77
+ logger.info(f"Configurações Zero-GPU aplicadas com sucesso na GPU: {torch.cuda.get_device_name(0)}")
78
+ return True
79
+ except Exception as e:
80
+ logger.error(f"Erro ao configurar GPU: {str(e)}")
81
+ return False
82
  else:
83
  logger.warning("GPU não disponível para configuração Zero-GPU. O sistema operará em modo CPU.")
84
+ return False
85
  except Exception as e:
86
  logger.error(f"Erro ao configurar Zero-GPU: {str(e)}")
87
  logger.warning("Fallback para modo CPU devido a erro na configuração da GPU.")
88
+ return False
89
 
90
  def main():
91
  """Função principal que inicia a aplicação."""
 
97
  if IS_HUGGINGFACE:
98
  load_dotenv('.env.huggingface')
99
  logger.info("Ambiente HuggingFace detectado")
100
+ gpu_available = setup_zero_gpu()
101
  else:
102
  load_dotenv('.env')
103
  logger.info("Ambiente local detectado")
104
+ gpu_available = False
105
 
106
  # Criar e configurar interface
107
  interface = GradioInterface()
108
  demo = interface.create_interface()
109
 
110
  if IS_HUGGINGFACE:
111
+ # Configurar com base na disponibilidade da GPU
112
+ if gpu_available:
113
+ gpu_mem = torch.cuda.get_device_properties(0).total_memory / (1024**3)
114
  max_concurrent = 1 # Forçar single worker para Zero-GPU
115
  logger.info(f"GPU Memory: {gpu_mem:.1f}GB, Max Concurrent: {max_concurrent}")
116
  else:
 
118
  logger.warning("GPU não disponível. O sistema está operando em modo CPU. " +
119
  "Todas as funcionalidades estão disponíveis, mas o processamento será mais lento.")
120
 
121
+ # Configurar fila
122
  demo = demo.queue(
123
  api_open=False,
124
  status_update_rate="auto",
125
  max_size=5 # Reduzir tamanho da fila para economizar memória
126
  )
127
+
128
+ # Launch
129
  demo.launch(
130
  server_name="0.0.0.0",
131
  server_port=7860,
 
133
  max_threads=2 # Reduzir número de threads
134
  )
135
  else:
 
136
  demo.launch(
137
  server_name="0.0.0.0",
138
  server_port=7860,