Construir el canal de datos de inteligencia de borde: texto a entidades estructuradas en milisegundos. Cuando se diseña el En arquitectura, una de las principales restricciones a las que me he enfrentado fue el "Impuesto de Inferencia" - la superposición computacional de depender de grandes modelos de lenguaje monolítico masivo (LLM) para realizar tareas que nunca fueron idealmente diseñadas para. FogAI En una arquitectura ingenua, un desarrollador podría redirigir los registros de sensores crudos o el contexto de chat a un modelo de parámetro 7B o 8B con un prompt como "Extract all the field units, locations, and timestamps from the following text." Hay dos problemas claros con este enfoque para Edge AI: El Impuesto de Inferencia: Hacer una extracción simple con los parámetros 8B quema la batería, llena VRAM y introduce la latencia (300ms+ por consulta) sólo para devolver una cadena JSON. Hallucinaciones: Los LLM son generativos. adivinan qué token viene a continuación, lo que conduce a inconsistencias estructurales y entidades fabricadas. Para resolver esto en FogAi, implementé un dedicado Utilizando el modelo (194M parámetros). ejecutando puramente en , esta capa puente la brecha entre los flujos de texto crudo y los datos actuables estructurados, todo sin un único envuelto de Python. Knowledge Extraction Layer knowledgator/gliner-bi-base-v2.0 MNN Aquí está la descomposición arquitectónica de cómo extrajo la velocidad "mágica". El descubrimiento de Bi-Encoder Los modelos NER clásicos requieren que predefinas las entidades (por ejemplo, , de , de El momento en que necesites una entidad personalizada como o El modelo se rompe. PERSON ORG LOC WELDING DEFECT RADIO FREQUENCY GLiNER (Generalist and Lightweight Named Entity Recognition) resuelve este problema utilizando un Físicamente divide el proceso de codificación en el medio: Bi-Encoder Architecture El codificador de texto: crea incorporaciones contextuales ricas para el texto en bruto de entrada. El codificador de etiquetas: crea embeddings para la lista de entidades que desea encontrar. ¿Por qué esta división arquitectónica es un maestro para el Edge? Caching. En un nodo de borde que rastrea los datos del sitio de trabajo, las etiquetas deseadas (por ejemplo, rara vez cambia de milisegundo a milisegundo, ya que los codificadores de texto y etiqueta están desconectados, . ['worker', 'forklift', 'safety_vest', 'pallet'] FogAi caches the Label Embeddings in RAM Para cada nuevo flujo de texto que llega, el Gateway sólo necesita ejecutar el Encoder de texto. , independientemente de si está buscando 5 tipos de entidades o 500. Constant-Time Inference Flujo de datos completo: Zero Python FogAi aprovecha JNI y gRPC para ejecutar directamente la inferencia de MNN. El flujo de trabajo está completamente desprovisto de tiempo de ejecución de Python pesado: Ingesta de texto en bruto -> Una cadena en bruto llega a Vert.x Gateway. JNI / C++ Hand-off -> La cadena se transmite directamente a través de los buffers de la memoria. MNN Text Encoder -> El gráfico gliner-bi-base-v2.0 ONNX se ejecuta a través del tiempo de ejecución de MNN (que se acelera por completo para CPU y NPU Edge). Vector Dot Product -> El motor C++ calcula una matriz de semejanza de producto de punto simple entre las nuevas incorporaciones de texto y las incorporaciones de etiquetas pre-calculadas. Salida estructurada -> Una carga útil JSON limpia que contenga los intervalos etiquetados se dirige de vuelta al router en < 50 milisegundos. Todo esto sucede sin que los datos nunca toquen la nube. Benchmarking del Impuesto de Inferencia Benchmarking del Impuesto de Inferencia: Tres modelos en el anillo No solo teorizaba el “Impuesto de Inferencia”, sino que lo medíamos. Folleto de la repositorio, he construido scripts de benchmarking de Python para extraer de una frase estándar. pycompare FogAi ['animal', 'location', 'time', 'date'] Veamos a los tres concursantes en el ring: El peso pesado (LLM General): Qwen2.5-0.5B-Instruct El peso pesado especializado: numind/NuExtract-1.5 (un LLM de extracción finamente ajustado) El Agile Bi-Encoder (el motor de FogAi): GLiNER-194M Aquí están los datos empíricos: 1o de la Ley General de Derechos Humanos ( ) pycompare/test_llm_perf.py Modelo: Qwen2.5-0.5B Instrucción Archivo de la categoría: Generative Causal LM Input Prompt Tokens: 53 Tokens de salida generados: 100 Tiempo total de inferencia: 3,524.42 ms (Sí, 3,5 segundos) Impresión RAM: 1.116.77 MB El resultado: El LLM alucinó, produciendo un bloque de JSON que desaprovechó por completo la "roja marrón" y el "perro perezoso", seguido de 50 tokens de un monólogo interno no solicitado sobre cómo planea extraer las entidades. El LLM Especializado (NuExtract 1.5) Modelo: numind/NuExtract-1.5 Arquitectura: LM causal generativa (Fine-tuned para la extracción de JSON) Tokens de entrada rápida: 55 Tokens de salida generados: 30 Tiempo total de inferencia: ~1,200.00 ms Impresión RAM: ~1,200.00 MB El resultado: la extracción precisa de las entidades en el formato JSON adecuado, pero todavía sufre de la generación de token autorregresiva. es más rápido que Qwen porque alucina menos, generando menos tokens de salida, pero todavía toma más de un segundo. Soluciones para el tratamiento de la artritis reumatoide ( ) pycompare/test_gliner_perf.py Modelo: knowledgator/gliner-bi-base-v2.0 Arquitectura: Bi-Encoder Tokens de entrada aproximados: 22 (Texto + Etiquetas) Tiempo de Inferencia Total (Python): 50.83 ms Tiempo total de inferencia (JNI/C++ Web Gateway): ~750.00 ms (incluyendo el framing HTTP, la fila y la memcopia fuera del heap) Impresión RAM: 824.11 MB El resultado: Extracción limpia y perfectamente estructurada de {animal: "raza marrón rápida", ubicación: "Nueva York", hora: "5 PM", fecha: "Monday"}. El veredicto: las incorporaciones son la sangre de las bases de datos de vectores Al descargar Knowledge Extraction a GLiNER, FogAi acelera la tubería hasta (3500ms vs 50ms en ejecución cruda) en comparación con un LLM general, y supera a los LLM de extracción finamente ajustados (como NuExtract) al ignorar completamente la barrera de botella autorregresiva. 6,800% Pero la ejecución cruda es sólo la mitad de la batalla. How do we deploy it? The Gateway Integration Test: Testing Every Topology (Nodos A, B y C) En la arquitectura FogAi, construí tres topologías de implementación diferentes para probar la integración de GLiNER. Tipo A (In-Process JNI): Ejecuta GLiNER explícitamente en C++ a través de acceso directo a la memoria (buferes de memoria fuera del conjunto) dentro del mismo JVM que el Gateway de la API Vert.x. Tipo B (Out-of-Process C++ gRPC): Ejecuta GLiNER en un microservicio C++ independiente (utilizando el tiempo de ejecución MNN o ONNX) y comunica con el Gateway a través de HTTP/2. Tipo C (Out-of-Process Python gRPC): Ejecuta GLiNER en un microservicio gRPC estándar basado en Python utilizando el tiempo de ejecución ONNX. Cuando probé las cargas de los tres nodos a través de Vert.x API Gateway, los resultados fueron definitivos: Averaged per request under load. The combined overhead of Protobuf serialization, inter-process HTTP/2 networking, and the crushing weight of the Python Global Interpreter Lock (GIL) created a massive bottleneck. Type C (Out-of-Process Python gRPC): 3,200 ms - 4,500 ms Averaged per request under load. Even with a hyper-optimized C++ backend, the overhead of Protobuf serialization/deserialization and inter-process HTTP/2 networking created a massive bottleneck. Under stress tests ( ), the network stack overhead resulted in queue pileups for a model that normally takes 50ms to run natively. Type B (Out-of-Process C++ gRPC): 1,250 ms - 2,100 ms test_integration.sh Sustained end-to-end latency the HTTP Web Gateway routing, EDF queueing, Type A (In-Process JNI): ~750.00 ms including the "Vanilla" safety checks, and memory mapping. The direct off-heap C++ memory handoff bypassed the networking and serialization layer entirely. Al procesar GLiNER nativamente en un nodo de tipo A dentro de MNN, automaticamente y obtener acceso a las incorporaciones contextuales densas de estas entidades durante el paso adelante. Los LLM generativos no producen incorporaciones de token nativas para la indexación de bases de datos sin modelos de incorporación secundarios. Hacer esto directamente a través de JNI antes de que los datos se envíen incluso a un clúster de nube me da un : Puedo construir instantáneamente Gráficos de Conocimiento Temporal a partir de las fuentes de sensores en bruto en el campo. Libre de cargas unfair advantage Depender de los LLMs para la extracción de conocimientos localizados en un nodo de borde es abuso de hardware. Exportación de GLiNER a C++ MNN Para lograr estas velocidades de integración de JNI sin Python, debo convertir el modelo HuggingFace GLiNER en el modelo de MNN Evito los errores de rastreo de forma dinámica de ONNX en versiones más recientes de PyTorch mediante la obtención de la capa de rastro explícita de ONNX directamente de HuggingFace, y utilizando . .mnn MNNConvert He proporcionado este script de conversión exacto en En el repositorio: scripts/convert_gliner_to_mnn.sh #!/bin/bash ONNX_MODEL="models_onnx/gliner-bi-v2/onnx/model.onnx" MNN_DIR="models_mnn/gliner-bi-v2" mnnconvert -f ONNX --modelFile "$ONNX_MODEL" --MNNModel "$MNN_DIR/model.mnn" --bizCode MNN copy models_onnx/gliner-bi-v2/*.json "$MNN_DIR/" Revisa tu propia magia Usted puede ejecutar los benchmarks de Python en su propia máquina. Clone el repositorio FogAi, navegar a , y ejecutar las pruebas para ver el Impuesto de Inferencia en vivo: pycompare git clone https://github.com/NickZt/FogAi.git cd FogAi python3 -m venv venv && source venv/bin/activate pip install psutil gliner transformers accelerate python3 pycompare/test_gliner_perf.py python3 pycompare/test_llm_perf.py Bonus: Plugging FogAi en Open WebUI Desde que FogAi nativamente expone un (en el ), ni siquiera necesita escribir código de cliente personalizado para interactuar con él. configuración en el repositorio que gira las interfaces de chat populares apuntando directamente al Gateway. OpenAI-compatible API /v1/chat/completions docker-compose Asegúrate de que tienes Docker instalado en tu máquina. Navega al directorio de UI y inicia los servicios: cd UI docker-compose up -d Open your browser and start chatting: : Open WebUI http://localhost:3000 : (Password is simply ) Lobe Chat http://localhost:3210 fogai Las interfaces se conectarán automáticamente a , descubra los modelos MNN y ONNX en ejecución, y déjate invocar como si estuvieran en ejecución en la nube. http://host.docker.internal:8080/v1