Construirea canalului de date Edge Intelligence: Text către entități structurate în milisecunde. Când se proiectează În arhitectură, una dintre principalele constrângeri cu care m-am confruntat a fost "taxa de inferență" - suprafața computațională de a se baza pe modele de limbi mari masive, monolitice (LLM) pentru a îndeplini sarcini pentru care nu au fost niciodată proiectate în mod optim. FogAI Într-o arhitectură naivă, un dezvoltator ar putea direcționa jurnalele de senzori brute sau contextul de chat către un model de parametri 7B sau 8B cu o promptă cum ar fi "Extract all the field units, locations, and timestamps from the following text." Există două probleme evidente cu această abordare pentru Edge AI: Taxa de inferență: efectuarea unei extracții simple cu parametrii 8B arde bateria, umple VRAM-ul și introduce latența (300ms+ pe interogare) doar pentru a returna un șir JSON. Halucinații: LLM-urile sunt generative. Ei ghicesc ce token vine mai departe, ceea ce duce la inconsecvențe structurale și entități fabricate. Pentru a rezolva acest lucru în FogAi, am implementat un Folosirea celor model (194M parametri). rulează pur și simplu pe , acest strat leagă decalajul dintre fluxurile de text brut și datele acționabile structurate - toate fără un singur înveliș Python. Knowledge Extraction Layer knowledgator/gliner-bi-base-v2.0 MNN Iată dezintegrarea arhitecturală a modului în care extrag viteza "magică". Descoperă Bi-Encoder Modelele NER clasice necesită pre-definirea entităților (de exemplu, , , În momentul în care aveți nevoie de o entitate particularizată, cum ar fi sau Modelul se rupe. PERSON ORG LOC WELDING DEFECT RADIO FREQUENCY GLiNER (Generalist and Lightweight Named Entity Recognition) rezolvă acest lucru folosind o Ea împarte fizic procesul de codificare în jos în mijloc: Bi-Encoder Architecture Text Encoder: Creează încorporări contextuale bogate pentru textul prim. Codificatorul de etichete: Creează încorporări pentru lista entităților pe care doriți să le găsiți. De ce această diviziune arhitecturală este o capodoperă pentru Edge? Caching. Într-un nod de margine care urmărește datele site-ului de lucru, etichetele dorite (de exemplu, Rareori se schimbă de la milisecundă la milisecundă, deoarece codificatoarele text și etichetă sunt deconectate. . ['worker', 'forklift', 'safety_vest', 'pallet'] FogAi caches the Label Embeddings in RAM Pentru fiecare flux nou de text care vine, Gateway-ul trebuie doar să execute codificatorul de text. , indiferent dacă sunteți în căutarea pentru 5 tipuri de entitate sau 500. Constant-Time Inference Fluxul complet de date: Zero Python FogAi utilizează JNI și gRPC pentru a executa direct inferența MNN. Fluxul de lucru este complet lipsit de timpul de rulare Python greu: Raw Text Ingest -> Un șir crud ajunge la Vert.x Gateway. JNI / C++ Hand-off -> Stringul este transmis direct prin buffere de memorie off-heap. MNN Text Encoder -> Graficul gliner-bi-base-v2.0 ONNX este executat prin intermediul timpului de rulare MNN (care este complet accelerat pentru CPU-urile Edge și NPU-urile). Vector Dot Product -> Motorul C++ calculează o matrice simplă de similitudine a produsului Dot între noile Embeddings Text și Embeddings Label pre-calculate. Structured Output -> O sarcină utilă JSON curată care conține intervalele etichetate este redirecționată înapoi la router în < 50 milisecunde. Toate acestea se întâmplă fără ca datele să atingă niciodată norul. Benchmarkingul impozitului pe inferență Benchmarking-ul impozitului de inferență: trei modele în inel Nu am teorizat doar „taxa de inferență” – am măsurat-o. Folderul de la Eu am construit script-uri de benchmarking Python pentru a extrage Într-o propoziţie standard pycompare FogAi ['animal', 'location', 'time', 'date'] Să ne uităm la cei trei concurenți din ring: Greutatea grea (LLM generală): Qwen2.5-0.5B-Instruiți Greutatea grea specializată: numind / NuExtract-1.5 (un LLM de extracție bine reglat) Agil Bi-Encoder (motorul lui FogAi): GLiNER-194M Iată cele mai recente date empirice: 1 din Legea nr. 3/2001 ( ) pycompare/test_llm_perf.py Model: Qwen2.5-0.5B Instrucțiuni Arhitectură: Generative Causal LM Input Prompt Tokens: 53 Token-uri generate la ieșire: 100 Timp total de inferență: 3,524.42 ms (Da, 3,5 secunde) Memorie RAM amprentă: 1.116.77 MB Rezultatul: LLM-ul a halucinat, producând un bloc JSON care a ratat complet "râul brun" și "câinele leneș", urmat de 50 de token-uri ale unui monolog intern nesolicitat despre modul în care intenționează să extragă entitățile. LLM specializat (NuExtract 1.5) Modelul: numind/NuExtract-1.5 Arhitectură: Generative Causal LM (Fine-tuned pentru extracția JSON) Tokenuri de intrare prompt: 55 Token-uri generate la ieșire: 30 Timp total de inferență: ~1,200.00 ms RAM amprentă: ~1,200.00 MB Rezultatul: Extracția exactă a entităților în format JSON adecvat, dar încă suferă de generarea de tokenuri autoregresive. este mai rapidă decât Qwen, deoarece halucinează mai puțin, generând mai puține tokenuri de ieșire, dar totuși durează mai mult de o secundă. Soluția de codificare bi-encoder FogAi ( ) pycompare/test_gliner_perf.py Etichetă: knowledgator/gliner-bi-base-v2.0 Arhitectură: Bi-Encoder Aproximativ token-uri de intrare: 22 (Text + Etichete) Timp total de inferență (Python): 50.83 ms Timp total de inferență (JNI/C++ Web Gateway): ~750.00 ms (inclusiv framing HTTP, coadă și memcopie off-heap) Memorie RAM: 824,11 MB Rezultatul: Extracția curată, perfect structurată a {animal: "râul brun rapid", locația: "New York", ora: "5 PM", data: "Luni"}. Verdictul: Embeddings sunt sângele bazelor de date vectoriale Prin descărcarea extracției de cunoștințe în GLiNER, FogAi accelerează conducta cu până la (3500ms vs 50ms în execuție brută) în comparație cu un LLM general, și depășește LLM-urile de extracție fine-tuned (cum ar fi NuExtract) prin ocolirea completă a flaconului autoregresiv. 6,800% Dar execuția brută este doar jumătate din bătălie. How do we deploy it? Testul de integrare Gateway: testarea fiecărei topologii (nodurile A, B și C) În arhitectura FogAi, am construit trei topologii diferite de implementare pentru a testa integrarea GLiNER. Tip A (In-Process JNI): Execută explicit GLiNER în C++ prin acces direct la memorie (bufferuri de memorie off-heap) în același JVM ca și Vert.x API Gateway. Tip B (Out-of-Process C++ gRPC): Execută GLiNER într-un microservice C++ autonom (folosind fie MNN, fie ONNX runtime) și comunică cu Gateway-ul prin HTTP/2. Tip C (Out-of-Process Python gRPC): Execută GLiNER într-un microservice gRPC standard bazat pe Python folosind timpul de rulare ONNX. Când am testat toate cele trei noduri prin intermediul Vert.x API Gateway, rezultatele au fost definitive: 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. Prin prelucrarea GLiNER nativ pe un nod de tip A de margine din interiorul MNN, automat și obțineți acces la integrările contextuale dense ale acestor entități în timpul avansului. LLM-urile generative nu produc în mod nativ integrări de token pentru indexarea bazelor de date fără modele secundare de integrare. Pot construi instantaneu Graficele Temporale ale Cunoașterii din surse de senzori brute din domeniu. Gratuit de încărcare unfair advantage Depinderea de LLM-uri pentru extracția locală a cunoștințelor pe un nod de margine este abuzul de hardware. Exportarea GLiNER în C++ MNN Pentru a atinge aceste viteze de integrare JNI fără Python, trebuie să convertesc modelul HuggingFace GLiNER în modelul MNN. Eu ocolesc bug-urile de urmărire a formei dinamice ONNX în versiunile mai noi ale PyTorch prin preluarea stratului explicit ONNX direct din HuggingFace și folosind . .mnn MNNConvert Am furnizat acest script de conversie exact în În cadrul repozitorului: 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/" Verifică magia pe cont propriu Puteți rula benchmarks-urile Python pe propria mașină. Clonează repozitorul FogAi, navighează la , și efectuați testele pentru a vedea Impozitul de inferență în direct: 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 în Open WebUI Deoarece FogAi expune în mod nativ o (în ), nici măcar nu trebuie să scrieți cod client personalizat pentru a interacționa cu acesta. am inclus un pre-configurat setare în depozit care se învârte în interfețe de chat populare care indică direct la Gateway. OpenAI-compatible API /v1/chat/completions docker-compose Asigurați-vă că aveți Docker instalat pe mașină. Navigați la directorul UI și porniți serviciile: 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 Interfețele vor ajunge în mod automat la , descoperiți modelele MNN și ONNX care rulează și lăsați-le să le invocați ca și cum ar rula în cloud. http://host.docker.internal:8080/v1