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>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
---
|
||||
name: gliner_load_model
|
||||
kind: function
|
||||
lang: py
|
||||
domain: datascience
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "def gliner_load_model(model_name: str = 'urchade/gliner_multi-v2.1', device: str = 'auto') -> Any"
|
||||
description: "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."
|
||||
tags: [gliner, ner, nlp, model, huggingface, zero-shot, datascience, python]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: []
|
||||
params:
|
||||
- name: model_name
|
||||
desc: "ID del modelo en HuggingFace Hub (defecto: urchade/gliner_multi-v2.1, multilingue ES/EN)"
|
||||
- name: device
|
||||
desc: "'auto' (CUDA si disponible, sino CPU), 'cpu', 'cuda', 'cuda:N'"
|
||||
output: "instancia GLiNER lista para predict_entities, cacheada por (model_name, device)"
|
||||
tested: true
|
||||
tests:
|
||||
- "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"
|
||||
test_file_path: "python/functions/datascience/tests/test_extract_entities_gliner.py"
|
||||
file_path: "python/functions/datascience/gliner_load_model.py"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
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:
|
||||
|
||||
```bash
|
||||
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`.
|
||||
Reference in New Issue
Block a user