Spaces:
Runtime error
Runtime error
Commit
·
4e991ba
1
Parent(s):
fe0707a
app logs
Browse files
app.py
CHANGED
|
@@ -35,7 +35,7 @@ except FileNotFoundError:
|
|
| 35 |
# Função para carregar modelo e tokenizer
|
| 36 |
def get_model():
|
| 37 |
if not hasattr(get_model, "model_data"):
|
| 38 |
-
logger.info("
|
| 39 |
start_time = time.time()
|
| 40 |
try:
|
| 41 |
tokenizer = AutoTokenizer.from_pretrained(
|
|
@@ -43,41 +43,19 @@ def get_model():
|
|
| 43 |
legacy=False,
|
| 44 |
clean_up_tokenization_spaces=True
|
| 45 |
)
|
| 46 |
-
logger.info(f"Tokenizer carregado em {time.time() - start_time:.2f} segundos.")
|
| 47 |
model = T5ForConditionalGeneration.from_pretrained(
|
| 48 |
"unicamp-dl/ptt5-small-portuguese-vocab"
|
| 49 |
)
|
| 50 |
-
logger.info(f"Modelo carregado em {time.time() - start_time:.2f} segundos.")
|
| 51 |
get_model.model_data = {"tokenizer": tokenizer, "model": model}
|
|
|
|
| 52 |
except Exception as e:
|
| 53 |
logger.error(f"Erro ao carregar modelo ou tokenizer: {e}")
|
| 54 |
get_model.model_data = None
|
|
|
|
| 55 |
return get_model.model_data
|
| 56 |
|
| 57 |
-
# Função para gerar e exibir simulado
|
| 58 |
-
def generate_simulado():
|
| 59 |
-
simulado = []
|
| 60 |
-
for i in range(5):
|
| 61 |
-
example = examples[i % len(examples)] if examples else None
|
| 62 |
-
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
| 63 |
-
simulado.append(question_data)
|
| 64 |
-
logger.info(f"Questão {i + 1}: {question_data['question']}")
|
| 65 |
-
for opt in question_data['options']:
|
| 66 |
-
logger.info(f" {opt}")
|
| 67 |
-
logger.info(f" Gabarito: {question_data['answer']}")
|
| 68 |
-
logger.info(f" Explicação: {question_data['explanation']}")
|
| 69 |
-
return {"simulado": simulado}
|
| 70 |
-
|
| 71 |
-
# Força carregamento inicial
|
| 72 |
-
logger.info("Testando carregamento inicial do modelo...")
|
| 73 |
-
start_time = time.time()
|
| 74 |
-
model_data = get_model()
|
| 75 |
-
if model_data:
|
| 76 |
-
logger.info(f"Modelo e tokenizer inicializados em {time.time() - start_time:.2f} segundos.")
|
| 77 |
-
generate_simulado()
|
| 78 |
-
else:
|
| 79 |
-
logger.error("Falha na inicialização do modelo.")
|
| 80 |
-
|
| 81 |
def parse_model_output(response):
|
| 82 |
pattern = r"Enunciado clínico: (.*?)\s*Alternativas: (.*?)\s*Gabarito: (.*?)\s*Explicação: (.*)"
|
| 83 |
match = re.match(pattern, response, re.DOTALL)
|
|
@@ -97,11 +75,14 @@ def parse_model_output(response):
|
|
| 97 |
|
| 98 |
def generate_question_from_prompt(theme, difficulty, example_question=None):
|
| 99 |
model_data = get_model()
|
|
|
|
| 100 |
if not model_data or not model_data["tokenizer"] or not model_data["model"]:
|
|
|
|
| 101 |
return {"question": "Erro: Modelo ou tokenizer não carregado.", "options": [], "answer": "", "explanation": "Por favor, verifique os logs."}
|
| 102 |
|
| 103 |
tokenizer = model_data["tokenizer"]
|
| 104 |
model = model_data["model"]
|
|
|
|
| 105 |
|
| 106 |
if example_question:
|
| 107 |
example_text = (
|
|
@@ -126,12 +107,42 @@ def generate_question_from_prompt(theme, difficulty, example_question=None):
|
|
| 126 |
outputs = model.generate(**inputs, max_new_tokens=256, temperature=0.7, top_p=0.9)
|
| 127 |
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 128 |
result = parse_model_output(response)
|
|
|
|
| 129 |
gc.collect()
|
| 130 |
return result
|
| 131 |
except Exception as e:
|
|
|
|
| 132 |
gc.collect()
|
| 133 |
return {"question": f"Erro na geração: {e}", "options": [], "answer": "", "explanation": "Tente novamente."}
|
| 134 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
@app.get("/generate")
|
| 136 |
async def generate_question(theme: str, difficulty: str):
|
| 137 |
valid_difficulties = ["fácil", "médio", "difícil"]
|
|
|
|
| 35 |
# Função para carregar modelo e tokenizer
|
| 36 |
def get_model():
|
| 37 |
if not hasattr(get_model, "model_data"):
|
| 38 |
+
logger.info("Iniciando carregamento de modelo e tokenizer...")
|
| 39 |
start_time = time.time()
|
| 40 |
try:
|
| 41 |
tokenizer = AutoTokenizer.from_pretrained(
|
|
|
|
| 43 |
legacy=False,
|
| 44 |
clean_up_tokenization_spaces=True
|
| 45 |
)
|
| 46 |
+
logger.info(f"Tokenizer baixado e carregado em {time.time() - start_time:.2f} segundos.")
|
| 47 |
model = T5ForConditionalGeneration.from_pretrained(
|
| 48 |
"unicamp-dl/ptt5-small-portuguese-vocab"
|
| 49 |
)
|
| 50 |
+
logger.info(f"Modelo baixado e carregado em {time.time() - start_time:.2f} segundos.")
|
| 51 |
get_model.model_data = {"tokenizer": tokenizer, "model": model}
|
| 52 |
+
logger.info("Modelo e tokenizer armazenados com sucesso em model_data.")
|
| 53 |
except Exception as e:
|
| 54 |
logger.error(f"Erro ao carregar modelo ou tokenizer: {e}")
|
| 55 |
get_model.model_data = None
|
| 56 |
+
logger.debug(f"Retornando model_data: {get_model.model_data is not None}")
|
| 57 |
return get_model.model_data
|
| 58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
def parse_model_output(response):
|
| 60 |
pattern = r"Enunciado clínico: (.*?)\s*Alternativas: (.*?)\s*Gabarito: (.*?)\s*Explicação: (.*)"
|
| 61 |
match = re.match(pattern, response, re.DOTALL)
|
|
|
|
| 75 |
|
| 76 |
def generate_question_from_prompt(theme, difficulty, example_question=None):
|
| 77 |
model_data = get_model()
|
| 78 |
+
logger.debug(f"Verificando model_data: {model_data is not None}")
|
| 79 |
if not model_data or not model_data["tokenizer"] or not model_data["model"]:
|
| 80 |
+
logger.error("Modelo ou tokenizer não disponível.")
|
| 81 |
return {"question": "Erro: Modelo ou tokenizer não carregado.", "options": [], "answer": "", "explanation": "Por favor, verifique os logs."}
|
| 82 |
|
| 83 |
tokenizer = model_data["tokenizer"]
|
| 84 |
model = model_data["model"]
|
| 85 |
+
logger.info(f"Gerando questão com tema: {theme}, dificuldade: {difficulty}")
|
| 86 |
|
| 87 |
if example_question:
|
| 88 |
example_text = (
|
|
|
|
| 107 |
outputs = model.generate(**inputs, max_new_tokens=256, temperature=0.7, top_p=0.9)
|
| 108 |
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 109 |
result = parse_model_output(response)
|
| 110 |
+
logger.debug(f"Questão gerada com sucesso: {result}")
|
| 111 |
gc.collect()
|
| 112 |
return result
|
| 113 |
except Exception as e:
|
| 114 |
+
logger.error(f"Erro na geração da questão: {e}")
|
| 115 |
gc.collect()
|
| 116 |
return {"question": f"Erro na geração: {e}", "options": [], "answer": "", "explanation": "Tente novamente."}
|
| 117 |
|
| 118 |
+
# Função para gerar e exibir simulado
|
| 119 |
+
def generate_simulado():
|
| 120 |
+
logger.info("Iniciando geração de simulado...")
|
| 121 |
+
simulado = []
|
| 122 |
+
for i in range(5):
|
| 123 |
+
example = examples[i % len(examples)] if examples else None
|
| 124 |
+
logger.debug(f"Processando questão {i + 1} com exemplo: {example is not None}")
|
| 125 |
+
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
| 126 |
+
simulado.append(question_data)
|
| 127 |
+
logger.info(f"Questão {i + 1}: {question_data['question']}")
|
| 128 |
+
for opt in question_data['options']:
|
| 129 |
+
logger.info(f" {opt}")
|
| 130 |
+
logger.info(f" Gabarito: {question_data['answer']}")
|
| 131 |
+
logger.info(f" Explicação: {question_data['explanation']}")
|
| 132 |
+
logger.info("Geração de simulado concluída.")
|
| 133 |
+
return {"simulado": simulado}
|
| 134 |
+
|
| 135 |
+
# Força carregamento inicial
|
| 136 |
+
logger.info("Testando carregamento inicial do modelo...")
|
| 137 |
+
start_time = time.time()
|
| 138 |
+
model_data = get_model()
|
| 139 |
+
if model_data:
|
| 140 |
+
logger.info(f"Modelo e tokenizer inicializados em {time.time() - start_time:.2f} segundos.")
|
| 141 |
+
time.sleep(1) # Adiciona delay de 1 segundo para garantir estabilidade
|
| 142 |
+
generate_simulado()
|
| 143 |
+
else:
|
| 144 |
+
logger.error("Falha na inicialização do modelo.")
|
| 145 |
+
|
| 146 |
@app.get("/generate")
|
| 147 |
async def generate_question(theme: str, difficulty: str):
|
| 148 |
valid_difficulties = ["fácil", "médio", "difícil"]
|