nexpi 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nexpi-0.1.0/PKG-INFO +262 -0
- nexpi-0.1.0/README.md +224 -0
- nexpi-0.1.0/nexpi/__init__.py +16 -0
- nexpi-0.1.0/nexpi/__main__.py +3 -0
- nexpi-0.1.0/nexpi/api.py +249 -0
- nexpi-0.1.0/nexpi/cli.py +267 -0
- nexpi-0.1.0/nexpi/core/__init__.py +0 -0
- nexpi-0.1.0/nexpi/core/bench.py +95 -0
- nexpi-0.1.0/nexpi/core/camara.py +107 -0
- nexpi-0.1.0/nexpi/core/capas.py +157 -0
- nexpi-0.1.0/nexpi/core/descargas.py +184 -0
- nexpi-0.1.0/nexpi/core/device.py +217 -0
- nexpi-0.1.0/nexpi/core/formato.py +87 -0
- nexpi-0.1.0/nexpi/core/guion.py +228 -0
- nexpi-0.1.0/nexpi/core/motores.py +279 -0
- nexpi-0.1.0/nexpi/core/pipeline.py +305 -0
- nexpi-0.1.0/nexpi/core/profundidad.py +54 -0
- nexpi-0.1.0/nexpi/core/propagador.py +144 -0
- nexpi-0.1.0/nexpi/core/realce.py +47 -0
- nexpi-0.1.0/nexpi/core/salida.py +198 -0
- nexpi-0.1.0/nexpi/core/traduccion.py +95 -0
- nexpi-0.1.0/nexpi/web/index.html +156 -0
- nexpi-0.1.0/nexpi.egg-info/PKG-INFO +262 -0
- nexpi-0.1.0/nexpi.egg-info/SOURCES.txt +65 -0
- nexpi-0.1.0/nexpi.egg-info/dependency_links.txt +1 -0
- nexpi-0.1.0/nexpi.egg-info/entry_points.txt +3 -0
- nexpi-0.1.0/nexpi.egg-info/requires.txt +17 -0
- nexpi-0.1.0/nexpi.egg-info/top_level.txt +3 -0
- nexpi-0.1.0/nexpi_accel/__init__.py +49 -0
- nexpi-0.1.0/nexpi_accel/__main__.py +3 -0
- nexpi-0.1.0/nexpi_accel/agente.py +266 -0
- nexpi-0.1.0/nexpi_accel/auto.py +390 -0
- nexpi-0.1.0/nexpi_accel/cache.py +388 -0
- nexpi-0.1.0/nexpi_accel/capacidades.py +91 -0
- nexpi-0.1.0/nexpi_accel/chip.py +20 -0
- nexpi-0.1.0/nexpi_accel/cli.py +281 -0
- nexpi-0.1.0/nexpi_accel/contrato.py +472 -0
- nexpi-0.1.0/nexpi_accel/detector.py +284 -0
- nexpi-0.1.0/nexpi_accel/fabric.py +198 -0
- nexpi-0.1.0/nexpi_accel/ffmpeg_accel.py +167 -0
- nexpi-0.1.0/nexpi_accel/generador.py +181 -0
- nexpi-0.1.0/nexpi_accel/hardware.py +389 -0
- nexpi-0.1.0/nexpi_accel/hooks.py +299 -0
- nexpi-0.1.0/nexpi_accel/interpolacion.py +184 -0
- nexpi-0.1.0/nexpi_accel/juegos.py +200 -0
- nexpi-0.1.0/nexpi_accel/ltx_cpu.py +261 -0
- nexpi-0.1.0/nexpi_accel/nexpigramas.py +301 -0
- nexpi-0.1.0/nexpi_accel/ov_ltx.py +296 -0
- nexpi-0.1.0/nexpi_accel/ov_ltx_bloques.py +327 -0
- nexpi-0.1.0/nexpi_accel/ov_vae.py +134 -0
- nexpi-0.1.0/nexpi_accel/ov_video.py +328 -0
- nexpi-0.1.0/nexpi_accel/planner.py +283 -0
- nexpi-0.1.0/nexpi_accel/servicio.py +325 -0
- nexpi-0.1.0/nexpi_accel/superres.py +96 -0
- nexpi-0.1.0/nexpi_accel/t5_gguf.py +262 -0
- nexpi-0.1.0/nexpi_accel/ventanas.py +109 -0
- nexpi-0.1.0/nexpi_accel/ventanas_ltx.py +239 -0
- nexpi-0.1.0/nexpi_rutas.py +72 -0
- nexpi-0.1.0/pyproject.toml +66 -0
- nexpi-0.1.0/setup.cfg +4 -0
- nexpi-0.1.0/tests/test_accel.py +322 -0
- nexpi-0.1.0/tests/test_auto.py +156 -0
- nexpi-0.1.0/tests/test_contrato.py +203 -0
- nexpi-0.1.0/tests/test_fabric.py +130 -0
- nexpi-0.1.0/tests/test_juegos_ffmpeg.py +112 -0
- nexpi-0.1.0/tests/test_ltx.py +188 -0
- nexpi-0.1.0/tests/test_nexpi.py +191 -0
nexpi-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nexpi
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Chip virtual de generacion de video: anclas por difusion en la integrada, propagacion 2.5D en CPU y acelerador universal para modelos de video sin GPU dedicada
|
|
5
|
+
Author: Nexora Technology LLC
|
|
6
|
+
Maintainer: Nexora Technology LLC
|
|
7
|
+
Keywords: difusion,video,aceleracion,openvino,igpu,cpu,diffusers,inferencia,plazo,sla
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: Other/Proprietary License
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Multimedia :: Video
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: openvino>=2025.4.0
|
|
23
|
+
Requires-Dist: numpy>=2.0
|
|
24
|
+
Requires-Dist: opencv-python>=4.10
|
|
25
|
+
Requires-Dist: transformers>=4.50
|
|
26
|
+
Requires-Dist: sentencepiece>=0.2
|
|
27
|
+
Requires-Dist: diffusers>=0.30
|
|
28
|
+
Requires-Dist: torch>=2.4
|
|
29
|
+
Requires-Dist: huggingface_hub>=0.30
|
|
30
|
+
Requires-Dist: psutil>=5.9
|
|
31
|
+
Requires-Dist: typer>=0.12
|
|
32
|
+
Requires-Dist: rich>=13
|
|
33
|
+
Requires-Dist: fastapi>=0.110
|
|
34
|
+
Requires-Dist: uvicorn>=0.30
|
|
35
|
+
Requires-Dist: pydantic>=2
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
38
|
+
|
|
39
|
+
# NEXPI
|
|
40
|
+
|
|
41
|
+
Dos piezas que comparten una misma tesis: **el video es casi todo redundante, y
|
|
42
|
+
el hardware que la gente ya tiene esta desaprovechado.**
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
nexpi_accel/ ACELERADOR UNIVERSAL — hace que modelos de video de otros corran
|
|
46
|
+
en maquinas sin GPU dedicada (integrada, NPU o solo CPU)
|
|
47
|
+
nexpi/ GENERADOR PROPIO 2.5D — texto -> mp4 1080p con camara cinematografica
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 1. NEXPI Accel — acelerador universal de modelos de video
|
|
53
|
+
|
|
54
|
+
**El problema:** todo lo que existe para acelerar generacion de video esta hecho
|
|
55
|
+
para NVIDIA. FastVideo soporta NVIDIA y Apple Silicon, y nada mas. Las tecnicas
|
|
56
|
+
de atencion dispersa (SVG, VSA, Sliding Tile) exigen kernels CUDA o CK-Tile. Si
|
|
57
|
+
tienes un portatil con grafica integrada, no hay nada para ti.
|
|
58
|
+
|
|
59
|
+
**Lo que hace NEXPI:** se enchufa a un pipeline de difusion que ya tengas y
|
|
60
|
+
aplica cinco palancas que **se multiplican entre si**:
|
|
61
|
+
|
|
62
|
+
| # | Palanca | Coste | Ganancia |
|
|
63
|
+
|---|---|---|---|
|
|
64
|
+
| 1 | pasos (cache adaptativa) | lineal | 2-6x |
|
|
65
|
+
| 2 | pixeles (superresolucion) | **cuadratico** | 2-4x |
|
|
66
|
+
| 3 | fotogramas (interpolacion) | lineal | 2-4x |
|
|
67
|
+
| 4 | precision (fp16 / int8) | lineal | 2x |
|
|
68
|
+
| 5 | unidad de ejecucion | segun silicio | 2.5x |
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
python -m nexpi_accel hardware # que hay en esta maquina, MEDIDO
|
|
72
|
+
python -m nexpi_accel plan --segundos 60 # como repartir el computo
|
|
73
|
+
python -m nexpi_accel video "un gato en la ventana" --segundos 90
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from nexpi_accel import acelerar
|
|
78
|
+
with acelerar(pipe, presupuesto_error=0.03) as a: # cualquier pipeline de diffusers
|
|
79
|
+
video = pipe(prompt, num_frames=16).frames[0]
|
|
80
|
+
print(a.informe())
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### El chip se enchufa solo
|
|
84
|
+
|
|
85
|
+
No hace falta decirle a NEXPI que modelo es ni pasarle nada: lo identifica por lo
|
|
86
|
+
que ES (el modulo que evalua la difusion, sus parametros contados de verdad y lo
|
|
87
|
+
que admite su llamada) y le aplica el plan que salga del hardware ya medido.
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
import nexpi_accel.auto # una linea: todo lo que cargues despues sale acelerado
|
|
91
|
+
pipe = DiffusionPipeline.from_pretrained("Lightricks/LTX-Video")
|
|
92
|
+
video = pipe(prompt, num_frames=97).frames[0]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
O envolviendo por fuera un programa que ya tengas, sin abrirlo:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
python -m nexpi_accel detectar # que modelos hay ya en la maquina
|
|
99
|
+
python -m nexpi_accel auto mi_script.py # lo ejecuta con el chip puesto
|
|
100
|
+
python -m nexpi_accel auto mi_script.py --segundos 60 --calidad rapida
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Sin objetivo de tiempo solo tira de la palanca que **no cambia lo que pediste**:
|
|
104
|
+
la cache adaptativa (misma resolucion, mismos fotogramas, mismos pasos). Con
|
|
105
|
+
objetivo de tiempo entran las cinco: genera mas pequeno y sube con
|
|
106
|
+
superresolucion, genera menos fotogramas y los repone interpolando, recorta
|
|
107
|
+
pasos y reparte las etapas entre las unidades. Lo que quita, lo devuelve: si
|
|
108
|
+
pides 16 fotogramas de 512x512, recibes 16 de 512x512.
|
|
109
|
+
|
|
110
|
+
Funciona con lo que ya tengas descargado (cache de HuggingFace, ComfyUI, A1111):
|
|
111
|
+
no hay que convertir ni volver a bajar nada.
|
|
112
|
+
|
|
113
|
+
### Contrato de plazo: lo que no hace nadie
|
|
114
|
+
|
|
115
|
+
Todos los aceleradores del mercado te dan velocidad. Ninguno te da una
|
|
116
|
+
**garantia**. NEXPI si:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
nexpi-accel contrato "un faro al atardecer" --plazo 30 --certificado cert.json
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
from nexpi_accel import contrato
|
|
124
|
+
oferta = contrato.negocia(pipe, plazo=30, height=512, width=512) # antes de gastar un vatio
|
|
125
|
+
print(oferta.texto())
|
|
126
|
+
salida, cert = contrato.ejecuta(pipe, plazo=30, prompt="un faro", height=512, width=512)
|
|
127
|
+
print(cert.texto())
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Tres piezas:
|
|
131
|
+
|
|
132
|
+
1. **Negociacion**: dice SI o NO *antes* de empezar, y si no puede, dice cual es
|
|
133
|
+
el mejor tiempo alcanzable en esta maquina.
|
|
134
|
+
2. **Controlador**: dentro del bucle mide el ritmo real, aprieta o afloja la
|
|
135
|
+
cache y, si el siguiente paso no cabe en el plazo, **entrega lo que tiene**.
|
|
136
|
+
Un modelo de difusion siempre tiene una imagen a medio hacer utilizable: por
|
|
137
|
+
eso el plazo se puede cumplir siempre.
|
|
138
|
+
3. **Certificado**: que se prometio, que paso y con que se midio, con huella
|
|
139
|
+
para que no se pueda retocar sin que se note.
|
|
140
|
+
|
|
141
|
+
**Medido en SD1.5 a 512x512 (CPU, sin GPU dedicada):**
|
|
142
|
+
|
|
143
|
+
| plazo | real | |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| 240 s | 64,8 s | CUMPLIDO (previsto 68,1 s: 5% de error) |
|
|
146
|
+
| 90 s | 78,8 s | CUMPLIDO |
|
|
147
|
+
| 40 s | 29,9 s | CUMPLIDO, entregado al vencer (2 pasos; un tercero no cabia) |
|
|
148
|
+
| 25 s | 20,7 s | CUMPLIDO, entregado al vencer |
|
|
149
|
+
| 15 s | 10,2 s | CUMPLIDO, entregado al vencer |
|
|
150
|
+
|
|
151
|
+
La promesa **no sale de un modelo teorico**: sale de lo medido en esta maquina y
|
|
152
|
+
guardado en `cache/contratos.json`, escalado por pixeles cuando cambia la
|
|
153
|
+
resolucion. El certificado dice siempre de donde sale la cifra y con cuantas
|
|
154
|
+
ejecuciones se sostiene. Y lo que dice de la desviacion es lo que de verdad se
|
|
155
|
+
ha medido (el error de las verificaciones de la cache contra la red real), no la
|
|
156
|
+
distancia al resultado sin acelerar, que exigiria generarlo dos veces.
|
|
157
|
+
|
|
158
|
+
**Lo que aporta y no existe en ningun otro sitio:**
|
|
159
|
+
|
|
160
|
+
- **Presupuesto de error en lazo cerrado** en vez de umbral fijo calibrado a mano.
|
|
161
|
+
Medido: **33,5 dB con 28,7/30 evaluaciones** frente a **20,4 dB con 26/30** del
|
|
162
|
+
metodo publicado.
|
|
163
|
+
- **Coeficiente de extrapolacion aprendido** por minimos cuadrados en cada
|
|
164
|
+
verificacion. Extrapolar a ciegas hunde la calidad de 33,5 a 21,1 dB en
|
|
165
|
+
modelos destilados; NEXPI lo detecta y se comporta como copia cuando conviene.
|
|
166
|
+
- **Autocalibracion**: mide su propio fallo cada pocos saltos y corrige la
|
|
167
|
+
ganancia. Por eso funciona igual en cualquier modelo y en cualquier hardware.
|
|
168
|
+
- **Enganche universal**: envuelve `pipe.unet`/`pipe.transformer`, cuenta pasos
|
|
169
|
+
por cambio de timestep (acierta con CFG en lote y separado) y lleva una cache
|
|
170
|
+
por rama de guia. Vale para Wan, LTX, CogVideoX, AnimateDiff, SVD y pipelines
|
|
171
|
+
propios, sin una linea de codigo por modelo.
|
|
172
|
+
- **Runtime OpenVINO** que ejecuta modelos de diffusers en iGPU, NPU o CPU, con
|
|
173
|
+
captura automatica de las formas reales del modelo y respaldo por
|
|
174
|
+
`torch.compile`.
|
|
175
|
+
- **Planificador con presupuesto de tiempo**: le dices "en 60 segundos" y reparte
|
|
176
|
+
las cinco palancas sobre el hardware que ha medido.
|
|
177
|
+
|
|
178
|
+
Detalles y fuentes en [docs/ACELERADOR.md](docs/ACELERADOR.md).
|
|
179
|
+
|
|
180
|
+
### Edicion y juegos (medido)
|
|
181
|
+
|
|
182
|
+
- **Edicion**: `nexpi_accel/ffmpeg_accel.py` elige la ruta mas rapida de ffmpeg.
|
|
183
|
+
Recorte de 6 s **13x** mas rapido (sin recodificar), transcodificacion **1,8x**
|
|
184
|
+
con la cadena entera en la integrada. Y una regla medida: decodificar por
|
|
185
|
+
hardware solo compensa si la cadena sigue en hardware.
|
|
186
|
+
- **Juegos**: `nexpi_accel/juegos.py` (NEXPI Frame Booster) sintetiza fotogramas
|
|
187
|
+
intermedios con flujo optico y warping, como DLSS 3 Frame Generation o AFMF pero
|
|
188
|
+
sin hardware dedicado. **14,5 ms por fotograma a 720p** (69 fps posibles),
|
|
189
|
+
**60,2 fps de salida desde 30 a 1080p** con ~30 ms de latencia anadida, 47-50 dB
|
|
190
|
+
de calidad. Ningun chip hace correr un juego en un PC sin requisitos: lo que
|
|
191
|
+
hace es duplicar los fotogramas presentados y permitir renderizar mas pequeno.
|
|
192
|
+
|
|
193
|
+
### Marca
|
|
194
|
+
|
|
195
|
+
`marca/lamina_chip.py` y `marca/lamina_chip_3d.py` generan las laminas de producto
|
|
196
|
+
por geometria vectorial; `marca/pdf_nexpi.py` el dossier tecnico (solo cifras
|
|
197
|
+
medidas); `marca/video_promo.py` el video promocional en espanol e ingles, con voz
|
|
198
|
+
neuronal y musica sintetizada, todo de cero.
|
|
199
|
+
|
|
200
|
+
### Se puede sumar la CPU y la integrada? (experimento)
|
|
201
|
+
|
|
202
|
+
Si, pero mucho menos de lo que promete la aritmetica. Medido con la maquina en
|
|
203
|
+
reposo: iGPU sola 15,91 fotogramas/s, CPU sola 6,72, suma teorica 22,63, y el
|
|
204
|
+
mejor reparto (el de NEXPI, 70/30 segun velocidad medida) da **16,39: solo un
|
|
205
|
+
+3 %**.
|
|
206
|
+
|
|
207
|
+
La razon esta medida: **al trabajar a la vez, cada unidad pierde ~24 %** porque
|
|
208
|
+
la integrada no tiene memoria propia y **compiten por el mismo bus**. No son dos
|
|
209
|
+
unidades independientes, son dos consumidores del mismo recurso escaso.
|
|
210
|
+
|
|
211
|
+
El experimento completo, con el metodo y las consecuencias de diseno, en
|
|
212
|
+
[docs/EXPERIMENTO_GPU_VIRTUAL.md](docs/EXPERIMENTO_GPU_VIRTUAL.md).
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 2. NEXPI (generador 2.5D)
|
|
217
|
+
|
|
218
|
+
Texto -> video 1080p en un portatil sin GPU: un ancla por difusion por plano
|
|
219
|
+
(SDXS 1 paso + TAESD, ~0,45 s en la integrada), profundidad, realce x4, capas
|
|
220
|
+
2.5D y movimiento de camara por warp en CPU (~18 ms/fotograma).
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
python -m nexpi generar "Un faro solitario en un acantilado al atardecer. Las olas rompen contra las rocas" -d 12
|
|
224
|
+
python -m nexpi api # interfaz web en http://127.0.0.1:5050
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Clip de 12 s en ~17 s (x1,1 tiempo real). Limite honesto: cada plano es una
|
|
228
|
+
imagen con movimiento de camara real por profundidad, no hay movimiento de
|
|
229
|
+
personajes dentro del plano. Detalles en [docs/ARQUITECTURA.md](docs/ARQUITECTURA.md).
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Hardware de referencia (medido, no de catalogo)
|
|
234
|
+
|
|
235
|
+
Portatil i9-12900H + Iris Xe 96 EU, **sin GPU NVIDIA**:
|
|
236
|
+
|
|
237
|
+
| Unidad | Medido |
|
|
238
|
+
|---|---|
|
|
239
|
+
| Iris Xe via OpenVINO fp16 | **756 GFLOP/s** |
|
|
240
|
+
| CPU via OpenVINO | 326 GFLOP/s |
|
|
241
|
+
| CPU via torch | 296 GFLOP/s |
|
|
242
|
+
|
|
243
|
+
La integrada rinde **2,5x la CPU** y practicamente todo el software de video la
|
|
244
|
+
ignora.
|
|
245
|
+
|
|
246
|
+
Mediciones completas y metodologia en [docs/HARDWARE_MEDIDO.md](docs/HARDWARE_MEDIDO.md)
|
|
247
|
+
e [docs/INVESTIGACION.md](docs/INVESTIGACION.md).
|
|
248
|
+
|
|
249
|
+
## Instalacion
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
pip install -r requirements.txt # ffmpeg debe estar en el PATH
|
|
253
|
+
python bench/fetch_models.py # pesos del generador 2.5D
|
|
254
|
+
python bench/fetch_video_model.py # modelo de video para el acelerador
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Nexpigramas: LTX-Video en cualquier PC (2026-09-02)
|
|
258
|
+
|
|
259
|
+
LTX-Video 2B destilado corre entero en este portatil sin GPU dedicada: T5-XXL en streaming desde GGUF, transformer en 28 bloques OpenVINO int8 (CPU 6,6 s/paso, Iris Xe 3,9 s/paso, torch 19,5 s), VAE por baldosas. Clip 512x320x49: 87 s en la integrada, 107 s en CPU. Detalles y trampas en `docs/NEXPIGRAMAS.md`.
|
|
260
|
+
|
|
261
|
+
python -m nexpi_accel.ltx_cpu "prompt" --ancho 512 --alto 320 --fotogramas 49 --backend gpu -o clip.mp4
|
|
262
|
+
python -m nexpi_accel.nexpigramas plan --ancho 1024 --alto 640 --fps 48 --duracion 2 --presupuesto 300
|
nexpi-0.1.0/README.md
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# NEXPI
|
|
2
|
+
|
|
3
|
+
Dos piezas que comparten una misma tesis: **el video es casi todo redundante, y
|
|
4
|
+
el hardware que la gente ya tiene esta desaprovechado.**
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
nexpi_accel/ ACELERADOR UNIVERSAL — hace que modelos de video de otros corran
|
|
8
|
+
en maquinas sin GPU dedicada (integrada, NPU o solo CPU)
|
|
9
|
+
nexpi/ GENERADOR PROPIO 2.5D — texto -> mp4 1080p con camara cinematografica
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. NEXPI Accel — acelerador universal de modelos de video
|
|
15
|
+
|
|
16
|
+
**El problema:** todo lo que existe para acelerar generacion de video esta hecho
|
|
17
|
+
para NVIDIA. FastVideo soporta NVIDIA y Apple Silicon, y nada mas. Las tecnicas
|
|
18
|
+
de atencion dispersa (SVG, VSA, Sliding Tile) exigen kernels CUDA o CK-Tile. Si
|
|
19
|
+
tienes un portatil con grafica integrada, no hay nada para ti.
|
|
20
|
+
|
|
21
|
+
**Lo que hace NEXPI:** se enchufa a un pipeline de difusion que ya tengas y
|
|
22
|
+
aplica cinco palancas que **se multiplican entre si**:
|
|
23
|
+
|
|
24
|
+
| # | Palanca | Coste | Ganancia |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| 1 | pasos (cache adaptativa) | lineal | 2-6x |
|
|
27
|
+
| 2 | pixeles (superresolucion) | **cuadratico** | 2-4x |
|
|
28
|
+
| 3 | fotogramas (interpolacion) | lineal | 2-4x |
|
|
29
|
+
| 4 | precision (fp16 / int8) | lineal | 2x |
|
|
30
|
+
| 5 | unidad de ejecucion | segun silicio | 2.5x |
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python -m nexpi_accel hardware # que hay en esta maquina, MEDIDO
|
|
34
|
+
python -m nexpi_accel plan --segundos 60 # como repartir el computo
|
|
35
|
+
python -m nexpi_accel video "un gato en la ventana" --segundos 90
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from nexpi_accel import acelerar
|
|
40
|
+
with acelerar(pipe, presupuesto_error=0.03) as a: # cualquier pipeline de diffusers
|
|
41
|
+
video = pipe(prompt, num_frames=16).frames[0]
|
|
42
|
+
print(a.informe())
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### El chip se enchufa solo
|
|
46
|
+
|
|
47
|
+
No hace falta decirle a NEXPI que modelo es ni pasarle nada: lo identifica por lo
|
|
48
|
+
que ES (el modulo que evalua la difusion, sus parametros contados de verdad y lo
|
|
49
|
+
que admite su llamada) y le aplica el plan que salga del hardware ya medido.
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
import nexpi_accel.auto # una linea: todo lo que cargues despues sale acelerado
|
|
53
|
+
pipe = DiffusionPipeline.from_pretrained("Lightricks/LTX-Video")
|
|
54
|
+
video = pipe(prompt, num_frames=97).frames[0]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
O envolviendo por fuera un programa que ya tengas, sin abrirlo:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
python -m nexpi_accel detectar # que modelos hay ya en la maquina
|
|
61
|
+
python -m nexpi_accel auto mi_script.py # lo ejecuta con el chip puesto
|
|
62
|
+
python -m nexpi_accel auto mi_script.py --segundos 60 --calidad rapida
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Sin objetivo de tiempo solo tira de la palanca que **no cambia lo que pediste**:
|
|
66
|
+
la cache adaptativa (misma resolucion, mismos fotogramas, mismos pasos). Con
|
|
67
|
+
objetivo de tiempo entran las cinco: genera mas pequeno y sube con
|
|
68
|
+
superresolucion, genera menos fotogramas y los repone interpolando, recorta
|
|
69
|
+
pasos y reparte las etapas entre las unidades. Lo que quita, lo devuelve: si
|
|
70
|
+
pides 16 fotogramas de 512x512, recibes 16 de 512x512.
|
|
71
|
+
|
|
72
|
+
Funciona con lo que ya tengas descargado (cache de HuggingFace, ComfyUI, A1111):
|
|
73
|
+
no hay que convertir ni volver a bajar nada.
|
|
74
|
+
|
|
75
|
+
### Contrato de plazo: lo que no hace nadie
|
|
76
|
+
|
|
77
|
+
Todos los aceleradores del mercado te dan velocidad. Ninguno te da una
|
|
78
|
+
**garantia**. NEXPI si:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
nexpi-accel contrato "un faro al atardecer" --plazo 30 --certificado cert.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
from nexpi_accel import contrato
|
|
86
|
+
oferta = contrato.negocia(pipe, plazo=30, height=512, width=512) # antes de gastar un vatio
|
|
87
|
+
print(oferta.texto())
|
|
88
|
+
salida, cert = contrato.ejecuta(pipe, plazo=30, prompt="un faro", height=512, width=512)
|
|
89
|
+
print(cert.texto())
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Tres piezas:
|
|
93
|
+
|
|
94
|
+
1. **Negociacion**: dice SI o NO *antes* de empezar, y si no puede, dice cual es
|
|
95
|
+
el mejor tiempo alcanzable en esta maquina.
|
|
96
|
+
2. **Controlador**: dentro del bucle mide el ritmo real, aprieta o afloja la
|
|
97
|
+
cache y, si el siguiente paso no cabe en el plazo, **entrega lo que tiene**.
|
|
98
|
+
Un modelo de difusion siempre tiene una imagen a medio hacer utilizable: por
|
|
99
|
+
eso el plazo se puede cumplir siempre.
|
|
100
|
+
3. **Certificado**: que se prometio, que paso y con que se midio, con huella
|
|
101
|
+
para que no se pueda retocar sin que se note.
|
|
102
|
+
|
|
103
|
+
**Medido en SD1.5 a 512x512 (CPU, sin GPU dedicada):**
|
|
104
|
+
|
|
105
|
+
| plazo | real | |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| 240 s | 64,8 s | CUMPLIDO (previsto 68,1 s: 5% de error) |
|
|
108
|
+
| 90 s | 78,8 s | CUMPLIDO |
|
|
109
|
+
| 40 s | 29,9 s | CUMPLIDO, entregado al vencer (2 pasos; un tercero no cabia) |
|
|
110
|
+
| 25 s | 20,7 s | CUMPLIDO, entregado al vencer |
|
|
111
|
+
| 15 s | 10,2 s | CUMPLIDO, entregado al vencer |
|
|
112
|
+
|
|
113
|
+
La promesa **no sale de un modelo teorico**: sale de lo medido en esta maquina y
|
|
114
|
+
guardado en `cache/contratos.json`, escalado por pixeles cuando cambia la
|
|
115
|
+
resolucion. El certificado dice siempre de donde sale la cifra y con cuantas
|
|
116
|
+
ejecuciones se sostiene. Y lo que dice de la desviacion es lo que de verdad se
|
|
117
|
+
ha medido (el error de las verificaciones de la cache contra la red real), no la
|
|
118
|
+
distancia al resultado sin acelerar, que exigiria generarlo dos veces.
|
|
119
|
+
|
|
120
|
+
**Lo que aporta y no existe en ningun otro sitio:**
|
|
121
|
+
|
|
122
|
+
- **Presupuesto de error en lazo cerrado** en vez de umbral fijo calibrado a mano.
|
|
123
|
+
Medido: **33,5 dB con 28,7/30 evaluaciones** frente a **20,4 dB con 26/30** del
|
|
124
|
+
metodo publicado.
|
|
125
|
+
- **Coeficiente de extrapolacion aprendido** por minimos cuadrados en cada
|
|
126
|
+
verificacion. Extrapolar a ciegas hunde la calidad de 33,5 a 21,1 dB en
|
|
127
|
+
modelos destilados; NEXPI lo detecta y se comporta como copia cuando conviene.
|
|
128
|
+
- **Autocalibracion**: mide su propio fallo cada pocos saltos y corrige la
|
|
129
|
+
ganancia. Por eso funciona igual en cualquier modelo y en cualquier hardware.
|
|
130
|
+
- **Enganche universal**: envuelve `pipe.unet`/`pipe.transformer`, cuenta pasos
|
|
131
|
+
por cambio de timestep (acierta con CFG en lote y separado) y lleva una cache
|
|
132
|
+
por rama de guia. Vale para Wan, LTX, CogVideoX, AnimateDiff, SVD y pipelines
|
|
133
|
+
propios, sin una linea de codigo por modelo.
|
|
134
|
+
- **Runtime OpenVINO** que ejecuta modelos de diffusers en iGPU, NPU o CPU, con
|
|
135
|
+
captura automatica de las formas reales del modelo y respaldo por
|
|
136
|
+
`torch.compile`.
|
|
137
|
+
- **Planificador con presupuesto de tiempo**: le dices "en 60 segundos" y reparte
|
|
138
|
+
las cinco palancas sobre el hardware que ha medido.
|
|
139
|
+
|
|
140
|
+
Detalles y fuentes en [docs/ACELERADOR.md](docs/ACELERADOR.md).
|
|
141
|
+
|
|
142
|
+
### Edicion y juegos (medido)
|
|
143
|
+
|
|
144
|
+
- **Edicion**: `nexpi_accel/ffmpeg_accel.py` elige la ruta mas rapida de ffmpeg.
|
|
145
|
+
Recorte de 6 s **13x** mas rapido (sin recodificar), transcodificacion **1,8x**
|
|
146
|
+
con la cadena entera en la integrada. Y una regla medida: decodificar por
|
|
147
|
+
hardware solo compensa si la cadena sigue en hardware.
|
|
148
|
+
- **Juegos**: `nexpi_accel/juegos.py` (NEXPI Frame Booster) sintetiza fotogramas
|
|
149
|
+
intermedios con flujo optico y warping, como DLSS 3 Frame Generation o AFMF pero
|
|
150
|
+
sin hardware dedicado. **14,5 ms por fotograma a 720p** (69 fps posibles),
|
|
151
|
+
**60,2 fps de salida desde 30 a 1080p** con ~30 ms de latencia anadida, 47-50 dB
|
|
152
|
+
de calidad. Ningun chip hace correr un juego en un PC sin requisitos: lo que
|
|
153
|
+
hace es duplicar los fotogramas presentados y permitir renderizar mas pequeno.
|
|
154
|
+
|
|
155
|
+
### Marca
|
|
156
|
+
|
|
157
|
+
`marca/lamina_chip.py` y `marca/lamina_chip_3d.py` generan las laminas de producto
|
|
158
|
+
por geometria vectorial; `marca/pdf_nexpi.py` el dossier tecnico (solo cifras
|
|
159
|
+
medidas); `marca/video_promo.py` el video promocional en espanol e ingles, con voz
|
|
160
|
+
neuronal y musica sintetizada, todo de cero.
|
|
161
|
+
|
|
162
|
+
### Se puede sumar la CPU y la integrada? (experimento)
|
|
163
|
+
|
|
164
|
+
Si, pero mucho menos de lo que promete la aritmetica. Medido con la maquina en
|
|
165
|
+
reposo: iGPU sola 15,91 fotogramas/s, CPU sola 6,72, suma teorica 22,63, y el
|
|
166
|
+
mejor reparto (el de NEXPI, 70/30 segun velocidad medida) da **16,39: solo un
|
|
167
|
+
+3 %**.
|
|
168
|
+
|
|
169
|
+
La razon esta medida: **al trabajar a la vez, cada unidad pierde ~24 %** porque
|
|
170
|
+
la integrada no tiene memoria propia y **compiten por el mismo bus**. No son dos
|
|
171
|
+
unidades independientes, son dos consumidores del mismo recurso escaso.
|
|
172
|
+
|
|
173
|
+
El experimento completo, con el metodo y las consecuencias de diseno, en
|
|
174
|
+
[docs/EXPERIMENTO_GPU_VIRTUAL.md](docs/EXPERIMENTO_GPU_VIRTUAL.md).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 2. NEXPI (generador 2.5D)
|
|
179
|
+
|
|
180
|
+
Texto -> video 1080p en un portatil sin GPU: un ancla por difusion por plano
|
|
181
|
+
(SDXS 1 paso + TAESD, ~0,45 s en la integrada), profundidad, realce x4, capas
|
|
182
|
+
2.5D y movimiento de camara por warp en CPU (~18 ms/fotograma).
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
python -m nexpi generar "Un faro solitario en un acantilado al atardecer. Las olas rompen contra las rocas" -d 12
|
|
186
|
+
python -m nexpi api # interfaz web en http://127.0.0.1:5050
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Clip de 12 s en ~17 s (x1,1 tiempo real). Limite honesto: cada plano es una
|
|
190
|
+
imagen con movimiento de camara real por profundidad, no hay movimiento de
|
|
191
|
+
personajes dentro del plano. Detalles en [docs/ARQUITECTURA.md](docs/ARQUITECTURA.md).
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Hardware de referencia (medido, no de catalogo)
|
|
196
|
+
|
|
197
|
+
Portatil i9-12900H + Iris Xe 96 EU, **sin GPU NVIDIA**:
|
|
198
|
+
|
|
199
|
+
| Unidad | Medido |
|
|
200
|
+
|---|---|
|
|
201
|
+
| Iris Xe via OpenVINO fp16 | **756 GFLOP/s** |
|
|
202
|
+
| CPU via OpenVINO | 326 GFLOP/s |
|
|
203
|
+
| CPU via torch | 296 GFLOP/s |
|
|
204
|
+
|
|
205
|
+
La integrada rinde **2,5x la CPU** y practicamente todo el software de video la
|
|
206
|
+
ignora.
|
|
207
|
+
|
|
208
|
+
Mediciones completas y metodologia en [docs/HARDWARE_MEDIDO.md](docs/HARDWARE_MEDIDO.md)
|
|
209
|
+
e [docs/INVESTIGACION.md](docs/INVESTIGACION.md).
|
|
210
|
+
|
|
211
|
+
## Instalacion
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
pip install -r requirements.txt # ffmpeg debe estar en el PATH
|
|
215
|
+
python bench/fetch_models.py # pesos del generador 2.5D
|
|
216
|
+
python bench/fetch_video_model.py # modelo de video para el acelerador
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Nexpigramas: LTX-Video en cualquier PC (2026-09-02)
|
|
220
|
+
|
|
221
|
+
LTX-Video 2B destilado corre entero en este portatil sin GPU dedicada: T5-XXL en streaming desde GGUF, transformer en 28 bloques OpenVINO int8 (CPU 6,6 s/paso, Iris Xe 3,9 s/paso, torch 19,5 s), VAE por baldosas. Clip 512x320x49: 87 s en la integrada, 107 s en CPU. Detalles y trampas en `docs/NEXPIGRAMAS.md`.
|
|
222
|
+
|
|
223
|
+
python -m nexpi_accel.ltx_cpu "prompt" --ancho 512 --alto 320 --fotogramas 49 --backend gpu -o clip.mp4
|
|
224
|
+
python -m nexpi_accel.nexpigramas plan --ancho 1024 --alto 640 --fps 48 --duracion 2 --presupuesto 300
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
__version__ = "0.1.0"
|
|
2
|
+
|
|
3
|
+
__all__ = ["Nexpi", "planificar", "Guion", "Chip", "__version__"]
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def __getattr__(nombre):
|
|
7
|
+
if nombre == "Nexpi":
|
|
8
|
+
from .core.pipeline import Nexpi
|
|
9
|
+
return Nexpi
|
|
10
|
+
if nombre in ("planificar", "Guion"):
|
|
11
|
+
from .core import guion as g
|
|
12
|
+
return getattr(g, nombre)
|
|
13
|
+
if nombre == "Chip":
|
|
14
|
+
from .core.device import Chip
|
|
15
|
+
return Chip
|
|
16
|
+
raise AttributeError(nombre)
|