Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +100 -96
src/streamlit_app.py
CHANGED
|
@@ -244,6 +244,9 @@ st.title("EQUITIA 路 Evaluaci贸n de sesgos LLM")
|
|
| 244 |
st.caption("Despliegue p煤blico en Hugging Face Spaces")
|
| 245 |
|
| 246 |
_init_state()
|
|
|
|
|
|
|
|
|
|
| 247 |
|
| 248 |
if st.session_state.get("eval_error"):
|
| 249 |
st.error(st.session_state["eval_error"])
|
|
@@ -255,16 +258,19 @@ modo = st.radio(
|
|
| 255 |
disabled=st.session_state["eval_running"],
|
| 256 |
)
|
| 257 |
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
|
|
|
|
|
|
|
|
|
| 266 |
|
| 267 |
-
if modo == ModoEvaluacion.PERSONALIZADA.value:
|
| 268 |
st.info("La evaluaci贸n personalizada se implementar谩 despu茅s. Aqu铆 solo preseleccionas modelos por ahora.")
|
| 269 |
|
| 270 |
plantilla_json = st.file_uploader(
|
|
@@ -324,106 +330,104 @@ if modo == ModoEvaluacion.PERSONALIZADA.value:
|
|
| 324 |
|
| 325 |
st.stop()
|
| 326 |
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
)
|
| 334 |
-
|
| 335 |
-
modelo_eval_input = ""
|
| 336 |
-
if modelo_eval_option == "Other Model":
|
| 337 |
-
modelo_eval_input = st.text_input(
|
| 338 |
-
"Escribe otro modelo para evaluar",
|
| 339 |
-
key="modelo_eval_otro",
|
| 340 |
disabled=st.session_state["eval_running"],
|
| 341 |
)
|
| 342 |
|
| 343 |
-
|
| 344 |
-
if
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
st.
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
|
|
|
|
|
|
| 361 |
else:
|
| 362 |
-
|
| 363 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
|
| 365 |
-
if not st.session_state["modelo_eval_validado"]:
|
| 366 |
-
|
| 367 |
-
|
| 368 |
|
| 369 |
-
st.success(f"Modelo evaluador confirmado: {st.session_state['modelo_eval_confirmado']}")
|
| 370 |
|
| 371 |
-
tamanyo_estimado_b = _estimar_tamanyo_modelo_b(st.session_state["modelo_eval_confirmado"])
|
| 372 |
-
if not torch.cuda.is_available() and tamanyo_estimado_b is not None and tamanyo_estimado_b > 4:
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 381 |
)
|
| 382 |
-
if not permitir_modelo_grande:
|
| 383 |
-
st.stop()
|
| 384 |
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
default=["preguntas_cerradas_esperadas"],
|
| 389 |
-
format_func=lambda x: LABELS_TIPOS_EVALUACION.get(x, x),
|
| 390 |
-
key="selected_eval_types",
|
| 391 |
-
disabled=st.session_state["eval_running"],
|
| 392 |
-
)
|
| 393 |
-
|
| 394 |
-
if not selected_eval_types:
|
| 395 |
-
st.warning("Debes seleccionar al menos un tipo de evaluaci贸n.")
|
| 396 |
-
st.stop()
|
| 397 |
|
| 398 |
-
if "preguntas_cerradas_esperadas" not in selected_eval_types:
|
| 399 |
-
|
| 400 |
-
|
| 401 |
|
| 402 |
-
tipos_no_disponibles = [
|
| 403 |
-
|
| 404 |
-
]
|
| 405 |
-
if tipos_no_disponibles:
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
}
|
| 425 |
-
_liberar_memoria(liberar_modelo_cache=True)
|
| 426 |
-
st.rerun()
|
| 427 |
|
| 428 |
if st.session_state.get("eval_running"):
|
| 429 |
st.warning("Proceso en ejecuci贸n. Cancelar detiene la evaluaci贸n y descarta resultados parciales.")
|
|
|
|
| 244 |
st.caption("Despliegue p煤blico en Hugging Face Spaces")
|
| 245 |
|
| 246 |
_init_state()
|
| 247 |
+
mostrar_solo_resultados = bool(
|
| 248 |
+
st.session_state.get("eval_success") and st.session_state.get("last_result")
|
| 249 |
+
)
|
| 250 |
|
| 251 |
if st.session_state.get("eval_error"):
|
| 252 |
st.error(st.session_state["eval_error"])
|
|
|
|
| 258 |
disabled=st.session_state["eval_running"],
|
| 259 |
)
|
| 260 |
|
| 261 |
+
if not mostrar_solo_resultados:
|
| 262 |
+
# Unico parametro editable en UI para ambos modos.
|
| 263 |
+
timeout_segundos = st.slider(
|
| 264 |
+
"Timeout por llamada (segundos)",
|
| 265 |
+
min_value=10,
|
| 266 |
+
max_value=300,
|
| 267 |
+
value=120,
|
| 268 |
+
disabled=st.session_state["eval_running"],
|
| 269 |
+
)
|
| 270 |
+
else:
|
| 271 |
+
timeout_segundos = 120
|
| 272 |
|
| 273 |
+
if not mostrar_solo_resultados and modo == ModoEvaluacion.PERSONALIZADA.value:
|
| 274 |
st.info("La evaluaci贸n personalizada se implementar谩 despu茅s. Aqu铆 solo preseleccionas modelos por ahora.")
|
| 275 |
|
| 276 |
plantilla_json = st.file_uploader(
|
|
|
|
| 330 |
|
| 331 |
st.stop()
|
| 332 |
|
| 333 |
+
if not mostrar_solo_resultados:
|
| 334 |
+
# Flujo: Evaluaci贸n por defecto
|
| 335 |
+
modelo_eval_option = st.selectbox(
|
| 336 |
+
"Modelo a evaluar",
|
| 337 |
+
MODELOS_PREDEFINIDOS,
|
| 338 |
+
key="modelo_eval_option",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 339 |
disabled=st.session_state["eval_running"],
|
| 340 |
)
|
| 341 |
|
| 342 |
+
modelo_eval_input = ""
|
| 343 |
+
if modelo_eval_option == "Other Model":
|
| 344 |
+
modelo_eval_input = st.text_input(
|
| 345 |
+
"Escribe otro modelo para evaluar",
|
| 346 |
+
key="modelo_eval_otro",
|
| 347 |
+
disabled=st.session_state["eval_running"],
|
| 348 |
+
)
|
| 349 |
|
| 350 |
+
modelo_eval_actual = modelo_eval_input.strip() if modelo_eval_option == "Other Model" else modelo_eval_option
|
| 351 |
+
if (
|
| 352 |
+
st.session_state["modelo_eval_validado"]
|
| 353 |
+
and st.session_state["modelo_eval_confirmado"] != modelo_eval_actual
|
| 354 |
+
):
|
| 355 |
+
st.session_state["modelo_eval_validado"] = False
|
| 356 |
+
st.session_state["modelo_eval_confirmado"] = ""
|
| 357 |
+
|
| 358 |
+
if st.button("Validar modelo a evaluar", key="validar_modelo_eval", disabled=st.session_state["eval_running"]):
|
| 359 |
+
modelo_eval = modelo_eval_input.strip() if modelo_eval_option == "Other Model" else modelo_eval_option
|
| 360 |
+
if not modelo_eval:
|
| 361 |
+
st.error("Debes indicar un modelo para evaluar.")
|
| 362 |
else:
|
| 363 |
+
ok, msg = validar_modelo_existe(modelo_eval)
|
| 364 |
+
if ok:
|
| 365 |
+
st.session_state["modelo_eval_validado"] = True
|
| 366 |
+
st.session_state["modelo_eval_confirmado"] = modelo_eval
|
| 367 |
+
st.success(msg)
|
| 368 |
+
else:
|
| 369 |
+
st.session_state["modelo_eval_validado"] = False
|
| 370 |
+
st.error(msg)
|
| 371 |
|
| 372 |
+
if not st.session_state["modelo_eval_validado"]:
|
| 373 |
+
st.warning("Primero valida un modelo para evaluar.")
|
| 374 |
+
st.stop()
|
| 375 |
|
| 376 |
+
st.success(f"Modelo evaluador confirmado: {st.session_state['modelo_eval_confirmado']}")
|
| 377 |
|
| 378 |
+
tamanyo_estimado_b = _estimar_tamanyo_modelo_b(st.session_state["modelo_eval_confirmado"])
|
| 379 |
+
if not torch.cuda.is_available() and tamanyo_estimado_b is not None and tamanyo_estimado_b > 4:
|
| 380 |
+
st.error(
|
| 381 |
+
"Modelo potencialmente demasiado grande para Space CPU de 16 GiB. "
|
| 382 |
+
"Usa preferiblemente <= 4B para evitar OOM."
|
| 383 |
+
)
|
| 384 |
+
permitir_modelo_grande = st.checkbox(
|
| 385 |
+
"Entiendo el riesgo de memoria y quiero continuar igualmente",
|
| 386 |
+
value=False,
|
| 387 |
+
key="confirmar_modelo_grande_cpu",
|
| 388 |
+
)
|
| 389 |
+
if not permitir_modelo_grande:
|
| 390 |
+
st.stop()
|
| 391 |
+
|
| 392 |
+
selected_eval_types = st.multiselect(
|
| 393 |
+
"Tipos de evaluaci贸n a ejecutar",
|
| 394 |
+
options=TIPOS_EVALUACION_DISPONIBLES,
|
| 395 |
+
default=["preguntas_cerradas_esperadas"],
|
| 396 |
+
format_func=lambda x: LABELS_TIPOS_EVALUACION.get(x, x),
|
| 397 |
+
key="selected_eval_types",
|
| 398 |
+
disabled=st.session_state["eval_running"],
|
| 399 |
)
|
|
|
|
|
|
|
| 400 |
|
| 401 |
+
if not selected_eval_types:
|
| 402 |
+
st.warning("Debes seleccionar al menos un tipo de evaluaci贸n.")
|
| 403 |
+
st.stop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 404 |
|
| 405 |
+
if "preguntas_cerradas_esperadas" not in selected_eval_types:
|
| 406 |
+
st.error("Por ahora solo est谩 implementada 'preguntas_cerradas_esperadas'.")
|
| 407 |
+
st.stop()
|
| 408 |
|
| 409 |
+
tipos_no_disponibles = [
|
| 410 |
+
t for t in selected_eval_types if t != "preguntas_cerradas_esperadas"
|
| 411 |
+
]
|
| 412 |
+
if tipos_no_disponibles:
|
| 413 |
+
st.info(
|
| 414 |
+
"Estos tipos quedan reservados para pr贸ximas iteraciones y no se ejecutar谩n ahora: "
|
| 415 |
+
+ ", ".join(LABELS_TIPOS_EVALUACION.get(t, t) for t in tipos_no_disponibles)
|
| 416 |
+
)
|
| 417 |
|
| 418 |
+
if st.button("Comenzar evaluaci贸n", key="comenzar_eval", disabled=st.session_state["eval_running"]):
|
| 419 |
+
st.session_state["eval_running"] = True
|
| 420 |
+
st.session_state["eval_requested"] = True
|
| 421 |
+
st.session_state["eval_success"] = False
|
| 422 |
+
st.session_state["last_result"] = None
|
| 423 |
+
st.session_state["eval_error"] = None
|
| 424 |
+
st.session_state["pending_eval"] = {
|
| 425 |
+
"modelo_hf": st.session_state["modelo_eval_confirmado"],
|
| 426 |
+
"timeout_segundos": timeout_segundos,
|
| 427 |
+
"selected_eval_types": selected_eval_types,
|
| 428 |
+
}
|
| 429 |
+
_liberar_memoria(liberar_modelo_cache=True)
|
| 430 |
+
st.rerun()
|
|
|
|
|
|
|
|
|
|
| 431 |
|
| 432 |
if st.session_state.get("eval_running"):
|
| 433 |
st.warning("Proceso en ejecuci贸n. Cancelar detiene la evaluaci贸n y descarta resultados parciales.")
|