aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/servidores.sh
blob: 2e3b769702f4d11e09717650389ad83cde4c23c8 (plain)
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
#!/usr/bin/env bash
# Arranca o para los dos servidores por separado, sin el asistente.
#
# Útil para desarrollar: cargar los modelos cuesta más de un minuto y así se
# reinicia el binario de Rust las veces que haga falta sin volver a pagarlo.
# El asistente detecta que ya están escuchando y los reutiliza.
#
#   scripts/servidores.sh arrancar | parar | estado
set -euo pipefail
cd "$(dirname "$0")/.."

LOGS="${ASIST_LOGS:-logs}"
LLM_PUERTO="${ASIST_LLM_PUERTO:-8012}"
TTS_PUERTO="${ASIST_TTS_PUERTO:-8013}"
mkdir -p "$LOGS"

vivo() { curl -sf -m 2 "http://127.0.0.1:$1/health" >/dev/null 2>&1; }

esperar() { # puerto nombre segundos
  local fin=$(( SECONDS + $3 ))
  while [ $SECONDS -lt $fin ]; do
    vivo "$1" && { echo "  $2 listo"; return 0; }
    sleep 1
  done
  echo "  $2 NO respondió en $3 s; mira $LOGS/$2.log" >&2
  return 1
}

arrancar() {
  if vivo "$LLM_PUERTO"; then
    echo "  llama-server ya estaba arriba"
  else
    echo "  arrancando llama-server…"
    nohup vendor/llama.cpp/build/bin/llama-server \
      --model models/Qwen3.5-2B.Q5_K_M.gguf \
      --mmproj models/mmproj-BF16.gguf \
      --host 127.0.0.1 --port "$LLM_PUERTO" \
      --threads 10 --threads-batch 10 \
      --batch-size 512 --ubatch-size 256 \
      --gpu-layers 10 --split-mode layer --tensor-split 1 --main-gpu 0 \
      --no-mmap --ctx-size 8192 --parallel 2 --cache-ram 6144 \
      --rope-freq-base 1000000 --rope-freq-scale 0.25 \
      --jinja --chat-template-file config/qwen35-no-think.jinja \
      > "$LOGS/llama-server.log" 2>&1 &
  fi

  if vivo "$TTS_PUERTO"; then
    echo "  tts-server ya estaba arriba"
  else
    echo "  arrancando tts-server…"
    # --codec-chunk-dur 1.0 es lo que hace que el audio salga por bloques
    # según se genera en vez de todo al final. Ver docs/RENDIMIENTO.md.
    nohup vendor/qwentts.cpp/build/tts-server \
      --model models/qwen-talker-1.7b-base-Q8_0.gguf \
      --codec models/qwen-tokenizer-12hz-Q8_0.gguf \
      --host 127.0.0.1 --port "$TTS_PUERTO" \
      --lang spanish --codec-chunk-dur 1.0 \
      > "$LOGS/tts-server.log" 2>&1 &
  fi

  esperar "$LLM_PUERTO" llama-server 240
  esperar "$TTS_PUERTO" tts-server 240
}

parar() {
  # SIGTERM, no SIGKILL: hay que darles ocasión de soltar la GPU.
  pkill -TERM -f 'llama-server .*--port '"$LLM_PUERTO" 2>/dev/null && echo "  llama-server parado" || true
  pkill -TERM -f 'tts-server .*--port '"$TTS_PUERTO"   2>/dev/null && echo "  tts-server parado"   || true
}

estado() {
  vivo "$LLM_PUERTO" && echo "  llama-server  arriba  :$LLM_PUERTO" || echo "  llama-server  parado"
  vivo "$TTS_PUERTO" && echo "  tts-server    arriba  :$TTS_PUERTO" || echo "  tts-server    parado"
  command -v nvidia-smi >/dev/null && \
    nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader | sed 's/^/  GPU: /'
}

case "${1:-estado}" in
  arrancar|start) arrancar ;;
  parar|stop)     parar ;;
  estado|status)  estado ;;
  *) echo "uso: $0 {arrancar|parar|estado}" >&2; exit 1 ;;
esac