File size: 4,704 Bytes
abf3a92
 
 
 
75c6930
abf3a92
 
75c6930
abf3a92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75c6930
abf3a92
 
 
 
 
75c6930
abf3a92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import torch
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
import logging
import os

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class ModelManager:
    def __init__(self):
        self.dialo_model = None
        self.code_model = None
        self.dialo_tokenizer = None
        self.code_tokenizer = None
        self.loaded = False
        self.config = {}
    
    def load_models(self):
        """Carga los modelos locales en CPU optimizado para HF"""
        try:
            logger.info('Cargando modelos locales en CPU (HF Optimizado)...')
            
            # Cargar DialoGPT-small - m谩s r谩pido y liviano
            self.dialo_model = pipeline(
                'text-generation',
                model='microsoft/DialoGPT-small',
                device='cpu',
                torch_dtype=torch.float32,
                model_kwargs={'low_cpu_mem_usage': True}
            )
            logger.info('DialoGPT-small cargado')
            
            # Cargar CodeGPT-small-py para c贸digo
            self.code_tokenizer = AutoTokenizer.from_pretrained(
                'microsoft/CodeGPT-small-py',
                trust_remote_code=True
            )
            self.code_model = AutoModelForCausalLM.from_pretrained(
                'microsoft/CodeGPT-small-py',
                device_map='cpu',
                torch_dtype=torch.float32,
                low_cpu_mem_usage=True,
                trust_remote_code=True
            )
            logger.info('CodeGPT-small-py cargado')
            
            self.loaded = True
            logger.info('Todos los modelos locales cargados exitosamente')
            return True
            
        except Exception as e:
            logger.error(f'Error cargando modelos locales: {e}')
            # Fallback a modelos m谩s simples si falla
            try:
                logger.info('Intentando carga alternativa...')
                self.dialo_model = pipeline(
                    'text-generation',
                    model='microsoft/DialoGPT-small',
                    device='cpu'
                )
                self.loaded = True
                logger.info('Carga alternativa exitosa')
                return True
            except Exception as e2:
                logger.error(f'Carga alternativa fallida: {e2}')
                self.loaded = False
                return False
    
    def set_config(self, config):
        """Configuraci贸n para APIs externas"""
        self.config = config or {}
    
    def generate_local_response(self, prompt, is_code=False, max_length=150):
        """Genera respuesta usando modelos locales optimizados"""
        if not self.loaded:
            if not self.load_models():
                return 'Error: No se pudieron cargar los modelos locales'
        
        try:
            if is_code and self.code_model and self.code_tokenizer:
                # Usar CodeGPT para generaci贸n de c贸digo
                inputs = self.code_tokenizer.encode(prompt, return_tensors='pt')
                attention_mask = torch.ones_like(inputs)
                
                with torch.no_grad():
                    outputs = self.code_model.generate(
                        inputs,
                        attention_mask=attention_mask,
                        max_length=max_length,
                        num_return_sequences=1,
                        temperature=0.7,
                        do_sample=True,
                        pad_token_id=self.code_tokenizer.eos_token_id,
                        early_stopping=True
                    )
                
                response = self.code_tokenizer.decode(outputs[0], skip_special_tokens=True)
                
            else:
                # Usar DialoGPT para conversaci贸n general
                result = self.dialo_model(
                    prompt,
                    max_length=max_length,
                    num_return_sequences=1,
                    temperature=0.7,
                    do_sample=True,
                    pad_token_id=self.dialo_model.tokenizer.eos_token_id,
                    early_stopping=True
                )
                response = result[0]['generated_text']
            
            # Limpiar la respuesta
            if response.startswith(prompt):
                response = response[len(prompt):].strip()
            
            return response if response else 'No pude generar una respuesta. Intenta reformular tu pregunta.'
            
        except Exception as e:
            logger.error(f'Error en generaci贸n local: {e}')
            return f'Error temporal: {str(e)}. Intenta nuevamente.'