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

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

Browse files
src/domain/factories/detector_factory.py CHANGED
@@ -34,13 +34,19 @@ logger = logging.getLogger(__name__)
34
  def force_gpu_init():
35
  """Força a inicialização da GPU."""
36
  try:
37
- # Forçar inicialização do CUDA
38
- torch.cuda.init()
39
- # Alocar e liberar um tensor pequeno para garantir que CUDA está funcionando
40
- dummy = torch.cuda.FloatTensor(1)
41
- del dummy
42
- torch.cuda.empty_cache()
43
- return True
 
 
 
 
 
 
44
  except Exception as e:
45
  logger.warning(f"Erro ao forçar inicialização da GPU: {str(e)}")
46
  return False
@@ -48,22 +54,38 @@ def force_gpu_init():
48
  def is_gpu_available():
49
  """Verifica se a GPU está disponível de forma mais robusta."""
50
  try:
 
51
  if not torch.cuda.is_available():
 
52
  return False
53
 
54
  # Tentar forçar inicialização
55
  if not force_gpu_init():
 
56
  return False
57
 
58
- # Verificar se memória disponível
59
- gpu_memory = torch.cuda.get_device_properties(0).total_memory
60
- if gpu_memory < 4 * (1024**3): # Mínimo de 4GB
61
- logger.warning("GPU encontrada mas com memória insuficiente")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  return False
63
 
64
- return True
65
  except Exception as e:
66
- logger.warning(f"Erro ao verificar GPU: {str(e)}")
67
  return False
68
 
69
  class BaseCache:
@@ -342,9 +364,11 @@ class DetectorFactory:
342
  logger.info("GPU disponível e inicializada com sucesso")
343
  return WeaponDetectorGPU()
344
  else:
345
- logger.warning("GPU não disponível ou com problemas, usando CPU")
 
346
  return WeaponDetectorCPU()
347
  except Exception as e:
348
  logger.error(f"Erro ao criar detector: {str(e)}")
349
- logger.warning("Fallback para CPU devido a erro")
 
350
  return WeaponDetectorCPU()
 
34
  def force_gpu_init():
35
  """Força a inicialização da GPU."""
36
  try:
37
+ # Verificar se CUDA está disponível
38
+ if not torch.cuda.is_available():
39
+ return False
40
+
41
+ # Tentar alocar um tensor na GPU
42
+ try:
43
+ dummy = torch.cuda.FloatTensor(1)
44
+ del dummy
45
+ torch.cuda.empty_cache()
46
+ return True
47
+ except RuntimeError:
48
+ return False
49
+
50
  except Exception as e:
51
  logger.warning(f"Erro ao forçar inicialização da GPU: {str(e)}")
52
  return False
 
54
  def is_gpu_available():
55
  """Verifica se a GPU está disponível de forma mais robusta."""
56
  try:
57
+ # Verificar CUDA primeiro
58
  if not torch.cuda.is_available():
59
+ logger.warning("CUDA não está disponível")
60
  return False
61
 
62
  # Tentar forçar inicialização
63
  if not force_gpu_init():
64
+ logger.warning("Não foi possível inicializar a GPU")
65
  return False
66
 
67
+ # Tentar obter informações da GPU
68
+ try:
69
+ device_count = torch.cuda.device_count()
70
+ if device_count == 0:
71
+ logger.warning("Nenhuma GPU encontrada")
72
+ return False
73
+
74
+ # Verificar se podemos realmente usar a GPU
75
+ device = torch.device('cuda')
76
+ dummy_tensor = torch.zeros(1, device=device)
77
+ del dummy_tensor
78
+ torch.cuda.empty_cache()
79
+
80
+ logger.info(f"GPU disponível: {torch.cuda.get_device_name(0)}")
81
+ return True
82
+
83
+ except Exception as e:
84
+ logger.warning(f"Erro ao verificar GPU: {str(e)}")
85
  return False
86
 
 
87
  except Exception as e:
88
+ logger.warning(f"Erro ao verificar disponibilidade da GPU: {str(e)}")
89
  return False
90
 
91
  class BaseCache:
 
364
  logger.info("GPU disponível e inicializada com sucesso")
365
  return WeaponDetectorGPU()
366
  else:
367
+ logger.warning("GPU não disponível ou com problemas. ATENÇÃO: O sistema funcionará em modo CPU, " +
368
+ "que é mais lento mas igualmente funcional. Performance será reduzida.")
369
  return WeaponDetectorCPU()
370
  except Exception as e:
371
  logger.error(f"Erro ao criar detector: {str(e)}")
372
+ logger.warning("Fallback para CPU devido a erro. O sistema continuará funcionando, " +
373
+ "mas com performance reduzida.")
374
  return WeaponDetectorCPU()
src/main.py CHANGED
@@ -15,21 +15,30 @@ logger = logging.getLogger(__name__)
15
 
16
  def setup_zero_gpu():
17
  """Configurações otimizadas para Zero-GPU."""
18
- # Forçar inicialização da GPU
19
- if is_gpu_available():
20
- force_gpu_init()
21
- # Limpar cache CUDA
22
- torch.cuda.empty_cache()
23
- gc.collect()
24
-
25
- # Configurações para otimizar memória
26
- os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'
27
- torch.backends.cuda.matmul.allow_tf32 = True
28
- torch.backends.cudnn.benchmark = True
29
- torch.backends.cudnn.allow_tf32 = True
30
- logger.info("Configurações Zero-GPU aplicadas com sucesso")
31
- else:
32
- logger.warning("GPU não disponível para configuração Zero-GPU")
 
 
 
 
 
 
 
 
 
33
 
34
  def main():
35
  """Função principal que inicia a aplicação."""
@@ -58,7 +67,8 @@ def main():
58
  logger.info(f"GPU Memory: {gpu_mem:.1f}GB, Max Concurrent: {max_concurrent}")
59
  else:
60
  max_concurrent = 1
61
- logger.warning("GPU não disponível, usando configuração mínima")
 
62
 
63
  # Primeiro configurar a fila
64
  demo = demo.queue(
 
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."""
 
67
  logger.info(f"GPU Memory: {gpu_mem:.1f}GB, Max Concurrent: {max_concurrent}")
68
  else:
69
  max_concurrent = 1
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(