Files
egutierrez 7cdb8e1eb2 feat(datascience): GLiNER entity extractor (zero-shot NER) drop-in con LLM
Funciones nuevas en python/functions/datascience/:
- gliner_load_model: carga + cachea modelo GLiNER por (name, device).
  device='auto' resuelve a cuda/cpu segun torch.cuda.is_available, sin
  fallar si torch no esta instalado. ImportError claro si falta gliner.
- extract_entities_gliner: contrato drop-in de extract_entities_llm
  (mismo entity_schema, mismo list[EntityCandidate]). El caller inyecta
  el modelo (cargado UNA vez por proceso). Anota offsets start/end en
  attributes para reconciliar con extract_iocs (issue 0040).

Diferencias vs LLM extractor:
- 50-200x mas rapido en GPU, 0 USD/token.
- Malo con IoCs tecnicos (lo cubre 0037).
- Threshold y flat_ner ajustables por dominio.

pyproject.toml: gliner como extra opcional `[nlp]` para no inflar el
.venv de quien no use NER. Instalacion: `uv pip install -e '.[nlp]'`.

Refs #0038 — Desbloquea 0039 (GLiREL) y 0040 (pipeline hibrido).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 16:41:30 +02:00

2.5 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
gliner_load_model function py datascience 1.0.0 impure def gliner_load_model(model_name: str = 'urchade/gliner_multi-v2.1', device: str = 'auto') -> Any Carga (y cachea por (model_name, device)) un modelo GLiNER zero-shot NER. La primera llamada descarga ~200 MB desde HuggingFace; sucesivas devuelven la instancia cacheada. device='auto' usa CUDA si esta disponible, o CPU.
gliner
ner
nlp
model
huggingface
zero-shot
datascience
python
false error_go_core
name desc
model_name ID del modelo en HuggingFace Hub (defecto: urchade/gliner_multi-v2.1, multilingue ES/EN)
name desc
device 'auto' (CUDA si disponible, sino CPU), 'cpu', 'cuda', 'cuda:N'
instancia GLiNER lista para predict_entities, cacheada por (model_name, device) true
ImportError si gliner no esta instalado
Cache devuelve la misma instancia con los mismos parametros
device='auto' resuelve a cpu o cuda segun torch.cuda.is_available
python/functions/datascience/tests/test_extract_entities_gliner.py python/functions/datascience/gliner_load_model.py

Ejemplo

from python.functions.datascience import gliner_load_model

# Primera llamada descarga el modelo (~200 MB, una vez)
model = gliner_load_model(device="auto")

# Llamadas sucesivas con mismos params devuelven el cache
model_again = gliner_load_model(device="auto")
assert model is model_again

Instalacion

GLiNER no esta en las dependencias principales del registry. Para usarlo:

cd python && uv pip install gliner            # solo gliner
cd python && uv pip install -e '.[nlp]'       # extra completo

Tamaño y latencia

  • urchade/gliner_multi-v2.1: ~210 MB en disco (modelo + tokenizer).
  • Primera carga: 5-15 s en CPU, depende del disco y red.
  • Inferencia CPU: 1-5 KB texto/s con 8 labels (Apple M2 / i7 moderno).
  • Inferencia GPU (CUDA T4): 50-200 KB texto/s — 50-200x mas rapido.

Notas

  • El cache es por (model_name, device): cargar el mismo modelo en CPU y CUDA crea dos instancias. Es intencional para permitir A/B.
  • Si torch no esta instalado y device='auto', cae a 'cpu' sin error.
  • Para limpiar el cache (memoria GPU): borrar entradas de _MODEL_CACHE directamente o reiniciar el proceso.
  • impure: lee disco/red la primera vez y mantiene estado en _MODEL_CACHE.