S76 como recurso LLM local — cuidado y manejo

ESTADO 2026-09-11: S76 FUERA DE SERVICIO (apagones térmicos, repaste pendiente). No considerar en ningún flujo por el momento. Default de triage: localhost.

Fecha: 2026-09-08. Máquina: Serval WS serw12 (Ryzen 8c/16t, 16 GB RAM, GTX 1660 Ti 6 GB), [HOST][IP] por ethernet. Plan repaste aparte: 2026-09-08-s76-repaste-plan.md.

Acceso

  • PASS_76 exportado en ~/.zshrc. Patrón: export SSHPASS='Pichardo20'
    • sshpass -e ssh -o StrictHostKeyChecking=no [HOST][IP] <cmd>.
  • Ojo zsh: no usar echo ===... en comandos remotos (=x dispara expansión de =cmd y falla). Comandos simples, uno por llamada.
  • Aliases: s76-qwen → modelo surtido; s76-deepseek → deepseek-r1:8b. (s76-mistral eliminado: ollama run re-descarga solo lo que falte.)

Inventario Ollama (2026-09-08)

modelorol
deepseek-r1:8b (5.2 GB)default triage ES + todo lo chino (traducción y pinyin)
surtido (custom, base qwen2.5:7b-instruct, temp 0.3, ctx 8192)interactivo, reportes, scraping
qwen2.5:7b-instruct-q4_K_Mbase de surtido, no tocar
qwen2.5-coder:7b, deepseek-coder:6.7bcódigo
nomic-embed-textembeddings
  • Borrados por inútiles (JSON inválido en triage): qwen:latest, qwen2.5:0.5b, mistral.
  • Receta surtido: /tmp/Surtidomodelfile → ollama create surtido -f (reusa capas, sin disco extra).
  • keep_alive NO es parámetro de Modelfile (solo por request o env).

Reglas de operación (anti-sobrecalentamiento)

  • VRAM techo: deepseek ocupa ~5/6 GB. Un modelo a la vez; Ollama descarga solo a los 5 min idle.
  • deepseek sostenido = riesgo térmico (2 apagones el 2026-09-08). Batch con pausas de enfriamiento 20–30 s cada 5 candidatas + nvidia-smi -pl 45 hasta el repaste.
  • Ritmos medidos: triage deepseek ~42 s/cand (3000 chars);batch 38 ≈ 26 min (con pausas ~40 min). Chino: ~15 s/frase.
  • Monitoreo: scripts/s76_termico.sh --segundos 300 durante carga. ROJO: CPU≥95 / GPU≥87 / throttle>0 / apagones. Verde carga: CPU<85, GPU<80.

Pipeline: qué corre dónde

  • Mac: prensa_noche.py (cron 03:00, verificar que la Mac despierte), feed.py, traducciones HN (ollama local gemma4), radio parrilla (Google TTS), TTS chino.
  • S76: SOLO triage_rapido.py (Ollama remoto) + interactivo.
  • Fallback sin S76: LLM_BACKEND=gateway|deepseek o pausa del triage.

triage_rapido.py — gotchas

  • Transcript recortado a 3000 chars (9000 triplicaba el prefill). Mismo veredicto.
  • ESCRIBE EL JSON SOLO AL FINAL del archivo: matar el proceso = perder lo avanzado. Siempre respaldo previo (/tmp/candidatas-*.respaldo.json) + nohup + log en /tmp.
  • Timeout 240 s, strip defensivo de <think>, default --model deepseek-r1:8b.
  • candidatas/ está en .gitignore: no se commitea, se respalda.

Sustituto temporal: Linode (2026-09-10)

  • Box: 2 vCPU, 3.8 GB RAM, 69 GB libres; sirve radio (liquidsoap+icecast, no tocar).
  • Ollama CPU instalado + qwen2.5:3b (1.9 GB) + wrapper triage (temp 0.3, num_thread 1 = 50% CPU, ctx 4096; capas compartidas, sin disco extra).
  • Medido: triage válido (PASA correcto) a 143 s/cand con 1 hilo; backlog 38 ≈ 90 min. Radio intacta durante la prueba (liquidsoap 7.1%, icecast 200).
  • Acceso SOLO por túnel (UFW cerrado, ollama en localhost — no abrir 11434): ssh -i ~/.ssh/linode_root -f -N -L 11435:localhost:11434 [HOST][IP]
    • OLLAMA_URL=http://localhost:11435 triage_rapido.py --model triage.
  • Modelos chicos (0.5b, qwen:latest 2.3 GB) dan JSON inválido: no usar.
  • 2026-09-10: backlog 38 drenado en Linode (90 min). qwen3b permisivo (todo PASA, a veces omite la llave veredicto → reintentar con instrucción explícita). REGLA: ollama stop al terminar el batch (llama-server quedó al 94% colgado).

Suspensión

  • sleep.target deshabilitado (static): no se duerme solo, SSH siempre disponible.
  • WoL no viable (NIC sin reporte Wake-on). rtcwake existe pero acopla relojes Mac+S76. Decisión: no suspender; idle real medido 0.14 (16 cores), GPU 0%.