Pikeras commited on
Commit
274ba7a
verified
1 Parent(s): 5c0c688

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. 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
- # Unico parametro editable en UI para ambos modos.
259
- timeout_segundos = st.slider(
260
- "Timeout por llamada (segundos)",
261
- min_value=10,
262
- max_value=300,
263
- value=120,
264
- disabled=st.session_state["eval_running"],
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
- # Flujo: Evaluaci贸n por defecto
328
- modelo_eval_option = st.selectbox(
329
- "Modelo a evaluar",
330
- MODELOS_PREDEFINIDOS,
331
- key="modelo_eval_option",
332
- disabled=st.session_state["eval_running"],
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
- modelo_eval_actual = modelo_eval_input.strip() if modelo_eval_option == "Other Model" else modelo_eval_option
344
- if (
345
- st.session_state["modelo_eval_validado"]
346
- and st.session_state["modelo_eval_confirmado"] != modelo_eval_actual
347
- ):
348
- st.session_state["modelo_eval_validado"] = False
349
- st.session_state["modelo_eval_confirmado"] = ""
350
 
351
- if st.button("Validar modelo a evaluar", key="validar_modelo_eval", disabled=st.session_state["eval_running"]):
352
- modelo_eval = modelo_eval_input.strip() if modelo_eval_option == "Other Model" else modelo_eval_option
353
- if not modelo_eval:
354
- st.error("Debes indicar un modelo para evaluar.")
355
- else:
356
- ok, msg = validar_modelo_existe(modelo_eval)
357
- if ok:
358
- st.session_state["modelo_eval_validado"] = True
359
- st.session_state["modelo_eval_confirmado"] = modelo_eval
360
- st.success(msg)
 
 
361
  else:
362
- st.session_state["modelo_eval_validado"] = False
363
- st.error(msg)
 
 
 
 
 
 
364
 
365
- if not st.session_state["modelo_eval_validado"]:
366
- st.warning("Primero valida un modelo para evaluar.")
367
- st.stop()
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
- st.error(
374
- "Modelo potencialmente demasiado grande para Space CPU de 16 GiB. "
375
- "Usa preferiblemente <= 4B para evitar OOM."
376
- )
377
- permitir_modelo_grande = st.checkbox(
378
- "Entiendo el riesgo de memoria y quiero continuar igualmente",
379
- value=False,
380
- key="confirmar_modelo_grande_cpu",
 
 
 
 
 
 
 
 
 
 
 
381
  )
382
- if not permitir_modelo_grande:
383
- st.stop()
384
 
385
- selected_eval_types = st.multiselect(
386
- "Tipos de evaluaci贸n a ejecutar",
387
- options=TIPOS_EVALUACION_DISPONIBLES,
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
- st.error("Por ahora solo est谩 implementada 'preguntas_cerradas_esperadas'.")
400
- st.stop()
401
 
402
- tipos_no_disponibles = [
403
- t for t in selected_eval_types if t != "preguntas_cerradas_esperadas"
404
- ]
405
- if tipos_no_disponibles:
406
- st.info(
407
- "Estos tipos quedan reservados para pr贸ximas iteraciones y no se ejecutar谩n ahora: "
408
- + ", ".join(LABELS_TIPOS_EVALUACION.get(t, t) for t in tipos_no_disponibles)
409
- )
410
 
411
- mostrar_boton_comenzar = not (
412
- st.session_state.get("eval_success") and st.session_state.get("last_result")
413
- )
414
- if mostrar_boton_comenzar and st.button("Comenzar evaluaci贸n", key="comenzar_eval", disabled=st.session_state["eval_running"]):
415
- st.session_state["eval_running"] = True
416
- st.session_state["eval_requested"] = True
417
- st.session_state["eval_success"] = False
418
- st.session_state["last_result"] = None
419
- st.session_state["eval_error"] = None
420
- st.session_state["pending_eval"] = {
421
- "modelo_hf": st.session_state["modelo_eval_confirmado"],
422
- "timeout_segundos": timeout_segundos,
423
- "selected_eval_types": selected_eval_types,
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.")