des-abrasileirador / README.md
github-actions[bot]
chore: use Space README
f2b5d62
|
Raw
History Blame Contribute Delete
3.68 kB
---
title: Des-abrasileirador pt-PT
emoji: ✍️
colorFrom: green
colorTo: red
sdk: gradio
sdk_version: 6.19.0
app_file: app.py
hardware: zero-a10g
---
# 🇵🇹 Des-abrasileirador (pt-PT)
Reescreve texto em **português europeu** correto com o modelo
[AMALIA-9B](https://hf.co/amalia-llm/AMALIA-9B-0626-SFT) e mede a
"portugalidade" do resultado com um índice determinístico.
## O que faz
1. **Corrigir** — envia o texto ao AMALIA-9B (com *streaming*) e devolve a versão
em pt-PT, com o IPT antes/depois. Opção de "modo explicado" que lista as
alterações a partir de JSON, e botão para interromper a geração.
2. **Comparar modelos (IPT)** — corre o mesmo texto por vários modelos e ordena-os
pelo **Índice de Portugalidade**.
3. **Analisar (IPT)** — mede a portugalidade de qualquer texto instantaneamente
(determinístico, sem GPU) e lista os marcadores brasileiros encontrados.
## Índice de Portugalidade (IPT)
Métrica determinística, sem GPU, definida em [`portugality.py`](portugality.py):
```
IPT = 100 * exp(-6 * densidade_ponderada_de_marcadores)
```
Conta marcadores brasileiros (léxico, ortografia pré-AO90, gerúndio, tratamento
`você`/`a gente`, próclise inicial), pondera-os e normaliza pelo número de
palavras. `0` marcadores → `100`; muito pt-BR → valor baixo. Como não usa nenhum
LLM como juiz, é auditável e não é circular.
O **delta** de cada modelo é calculado contra a **referência** (por omissão o
`EuroLLM-9B`): mesma base e dimensão do AMALIA mas sem afinação pt-PT, pelo que a
diferença de IPT isola o efeito dessa afinação.
## Ficheiros
| Ficheiro | Papel |
| --- | --- |
| `app.py` | Interface Gradio (correção + comparação) |
| `inference.py` | Registo de modelos e geração (cache de um modelo de cada vez) |
| `portugality.py` | Cálculo do IPT (determinístico) |
| `system_prompt.txt` | Instruções do revisor pt-PT |
## Hardware
Um modelo de 9B **não** corre no Space CPU grátis. Este Space usa **ZeroGPU**
(`@spaces.GPU`, `hardware: zero-a10g`), que requer conta HF PRO. Vários 9B não
cabem em simultâneo num A10G (24 GB), por isso o `inference.py` mantém apenas
**um modelo carregado de cada vez** e a comparação corre-os em série.
O `inference.py` deteta o hardware automaticamente:
| Ambiente | Modo |
| --- | --- |
| GPU com ≥ 20 GB VRAM (A10G/ZeroGPU) | bf16 (fp16 em placas pré-Ampere) |
| GPU com < 20 GB VRAM (ex.: RTX 2060 6 GB) | 4-bit nf4 + *offload* do excedente para RAM |
| Sem CUDA | CPU float32 (apenas modelos pequenos) |
Podes forçar com `LOAD_IN_4BIT=1` ou `LOAD_IN_4BIT=0`.
## Correr localmente (Windows/Linux com GPU NVIDIA)
```bash
python -m venv .venv
.venv\Scripts\activate # Linux: source .venv/bin/activate
pip install -r requirements.txt
# o torch do PyPI é CPU-only; troca pela build CUDA:
pip install torch --index-url https://download.pytorch.org/whl/cu126
python app.py # http://127.0.0.1:7860
```
Numa GPU de 6 GB os modelos de 9B **não cabem** (mesmo em 4-bit precisam de
~6,3 GB só de pesos — a app recusa com uma mensagem clara em vez de rebentar).
Usa o **Qwen2.5-3B** (~2 GB em 4-bit) como modelo de correção local; o
Tucano-2B serve apenas de baseline pt-BR no benchmark.
## Modelos *gated*
`meta-llama/Llama-3.1-8B-Instruct` e `google/gemma-2-9b-it` exigem aceitar a
licença no Hugging Face. Define o segredo `HF_TOKEN` no Space (Settings →
Secrets) para os poderes usar; caso contrário, esses modelos são ignorados na
comparação com um aviso.
## Teste local rápido
```bash
python portugality.py # imprime um ranking de exemplo, sem descarregar modelos
```