File size: 5,119 Bytes
45b7009
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Despliegue en HuggingFace Spaces (Demo / MVP)

Despliegue gratuito para la demo del proyecto de grado, ejecutando el modelo
`pysentimiento/robertuito-sentiment-analysis` directamente en el contenedor.

## Requisitos previos

- Cuenta en [huggingface.co](https://huggingface.co)
- Git instalado localmente
- Repo `sentiment-analysis-service` en local

## Por qué Spaces y no Render

| Recurso | Render free | HF Spaces free |
|---|---|---|
| RAM | 512 MB | **16 GB** |
| Disco | ~512 MB | 50 GB (no persistente) |
| Sleep | 15 min sin tráfico | 48 h sin tráfico |
| Modelo local con `transformers` | No entra (OOM) | Entra cómodo |

El modelo RoBERTuito ocupa ~440 MB en disco y ~1.5–2 GB de RAM una vez cargado.
En Render free no entra; en Spaces free sobra.

---

## Paso 1 — Crear el Space

1. Entrar a [huggingface.co/new-space](https://huggingface.co/new-space)
2. Configurar:
   - **Space name**: `sentiment-analysis-service` (o el que prefieras)
   - **License**: la que aplique (MIT recomendado para proyectos de grado)
   - **Select the Space SDK**: **Docker****Blank**
   - **Space hardware**: **CPU basic — Free**
   - **Visibility**: **Public**
3. Clic en **Create Space**

Esto crea un repo git en `https://huggingface.co/spaces/<tu-usuario>/sentiment-analysis-service`.

---

## Paso 2 — Obtener token de write para empujar al Space

1. En HuggingFace: **Settings → Access Tokens → New token**
2. Nombre: `spaces-deploy`, Role: **Write**
3. Copiar el token (empieza con `hf_...`)

---

## Paso 3 — Empujar el código al Space

Desde la raíz del proyecto (`sentiment-analysis-service`):

```bash
# 1. Agregar el remoto del Space
git remote add space https://<tu-usuario>:<hf_token>@huggingface.co/spaces/<tu-usuario>/sentiment-analysis-service

# 2. Empujar la rama main
git push space main
```

> Si tu rama local se llama distinto, ajusta: `git push space tu-rama:main`.

> Alternativa sin meter el token en la URL: clonar el repo del Space en otra carpeta,
> copiar los archivos y hacer commit+push usando las credenciales de git.

---

## Paso 4 — Esperar el build

1. Abrir `https://huggingface.co/spaces/<tu-usuario>/sentiment-analysis-service`
2. Pestaña **Logs → Build**: ver el `pip install` (5–10 min la primera vez por torch)
3. Pestaña **Logs → Container**: cuando aparezca `Uvicorn running on http://0.0.0.0:8000` está listo
4. La primera petición descarga el modelo del Hub (~30 s adicionales)

---

## Paso 5 — Probar

URL pública: `https://<tu-usuario>-sentiment-analysis-service.hf.space`

```bash
# Health check
curl https://<tu-usuario>-sentiment-analysis-service.hf.space/health

# Análisis básico
curl -X POST https://<tu-usuario>-sentiment-analysis-service.hf.space/analyze \
  -H "Content-Type: application/json" \
  -d '{"text": "Me siento muy bien hoy"}'

# Análisis enriquecido
curl -X POST https://<tu-usuario>-sentiment-analysis-service.hf.space/analyze/enhanced \
  -H "Content-Type: application/json" \
  -d '{"text": "Me siento muy bien hoy"}'
```

Respuesta esperada del `/health`:

```json
{
  "status": "healthy",
  "model_loaded": true,
  "model_name": "pysentimiento/robertuito-sentiment-analysis"
}
```

---

## Paso 6 — Conectar con el backend

En las variables de entorno del backend:

```
SENTIMENT_SERVICE_URL=https://<tu-usuario>-sentiment-analysis-service.hf.space
```

Si el frontend hace llamadas directas, agregar la URL del frontend a `CORS_ORIGINS`
en los **Settings → Variables and secrets** del Space.

---

## Variables de entorno opcionales en el Space

Configurar en **Settings → Variables and secrets**:

| Key | Valor sugerido | Notas |
|---|---|---|
| `MODEL_NAME` | `pysentimiento/robertuito-sentiment-analysis` | Default en `config.py` |
| `CORS_ORIGINS` | `https://tu-frontend.com` | Coma-separado si hay varios |
| `HF_API_TOKEN` | _no setear_ | Si se setea, intenta usar el router de HF; el modelo de la tesis no está soportado, así que **dejar vacío** |

---

## Notas sobre el free tier

- **Sleep**: 48 h sin tráfico → próxima petición tarda ~30–60 s en despertar (rebuild + carga de modelo).
- **Para la defensa de tesis**: hacer un curl al `/health` 1–2 minutos antes de la demo para tener el Space "warm".
- **Mantenerlo activo entre clases/iteraciones**: configurar [cron-job.org](https://cron-job.org) (gratis) con un GET a `/health` cada 6 h.
- **Disco no persistente**: si el contenedor se reinicia, vuelve a descargar el modelo del Hub (rápido, mismo datacenter).

---

## Tabla de funcionamiento por entorno

| Entorno | Modo | Cómo |
|---|---|---|
| Local (desarrollo) | Modelo local con `transformers` | `pip install -r requirements-local.txt` |
| Spaces (demo / MVP) | Modelo local dentro del contenedor | Push a Space; sin `HF_API_TOKEN` |
| Producción (AWS) | Modelo local dentro del servidor | Imagen Docker en ECS/EKS |

El `analyzer.py` selecciona el modo automáticamente:
- Sin `HF_API_TOKEN` → carga local con `transformers` (camino usado en Spaces).
- Con `HF_API_TOKEN` → usa el router `router.huggingface.co/hf-inference` (requiere modelo soportado).