Open-sourcebibliotheken gebruiken voor neurale netwerken in C++
Invoering
Moderne AI komt vaak een bedrijf binnen via Python, notebooks, demo-omgevingen en de begrijpelijke opwinding als je een model voor de eerste keer ziet werken. Die fase is echt, nuttig en zelfs een beetje magisch. Het is waar nieuwsgierigheid goedkoop is en iteratie snel. Maar de levensduur van een echt product eindigt niet bij de demo. Een model dat klanten moet bedienen, in een backend moet passen, op fabriekshardware moet draaien, in een desktopproduct moet leven of slechte netwerkomstandigheden moet overleven, is niet langer alleen maar een model. Het wordt een onderdeel van een systeem, en in systemen begint de technische volwassenheid ertoe te doen.
Dat is het moment waarop C++ terugkeert in de kamer. Niet omdat ingenieurs sentimenteel zijn over het verleden, en niet omdat elk AI-probleem een eigen probleem zou moeten worden, maar omdat de productie vragen stelt die experimenten op een hoger niveau slechts zo lang kunnen uitstellen. Hoeveel geheugen heeft het proces werkelijk nodig? Wat is de steady-state latentie onder belasting? Kan de opstarttijd automatisch schalen overleven? Kan de runtime binnen een bestaande native applicatie leven? Kunnen we hetzelfde gevolgtrekkingspad naar een server, een edge-box en een operatorwerkstation verzenden zonder het hele product rond een onderzoeksstapel opnieuw op te bouwen?
Open-sourcebibliotheken maken deze transitie mogelijk zonder de controle over te dragen aan een zwarte doos van een leverancier. Ze geven ons stabiele runtimes, tensorabstracties, geoptimaliseerde kernels, gekwantiseerde uitvoeringspaden, hardwarebewuste backends en, in het recente LLM-tijdperk, verrassend capabele lokale inferentie-engines. Maar de overvloed aan bibliotheken kan het landschap ook verwarrend maken. Ingenieurs vragen vaak welke bibliotheek het beste is, terwijl de betere vraag is welke bibliotheek eerlijk is over de taak die voor ons ligt.
Dit artikel neemt dat meer geaarde pad. We zullen de belangrijkste C++-relevante bibliotheken in AI niet bekijken als identiteitsbewijzen, maar als technische persoonlijkheden met sterke punten, blinde vlekken en operationele aannames. Uiteindelijk is het doel niet alleen om de namen ONNX Runtime, LibTorch, oneDNN, OpenVINO, TensorFlow Lite en llama.cpp te kennen. Het doel is om te begrijpen wanneer iedereen helpt, wanneer het te zwaar wordt, wanneer het te smal wordt, en hoe je kunt kiezen zonder door de mode te worden geduwd.
Waarom AI-systemen steeds terugkeren naar C++
Er zit een ritme in de levering van AI dat de moeite waard is om duidelijk te benoemen, want als je het eenmaal ziet, worden veel architectuurkeuzes gemakkelijker te begrijpen. Ten eerste is er de ontdekkingsfase. Onderzoekers en productingenieurs leren nog steeds wat het model kan doen, welke gegevens het nodig heeft en waar de waarde daadwerkelijk kan liggen. In dat stadium wint expressiviteit het van discipline. Snel experimenteren, rijke Python-tools en flexibele onderzoeksframeworks zijn precies wat het team nodig heeft.
Dan komt de minder glamoureuze tweede fase, waarin een prototype verplichtingen begint op te bouwen. Een ondersteuningsteam moet fouten begrijpen. Een SRE-team wil voorspelbaar opstart- en geheugengedrag. Financiën wil weten of de rekening een tijdelijke piek of een permanent lek is. Een embedded klant vraagt of het model offline kan draaien. Bij een veiligheidsbeoordeling wordt gevraagd wat er precies in het binaire bestand zit en welke stukken kunnen worden gecontroleerd. Plotseling is het model niet langer een onderzoeksartefact, maar wordt het een burger van een productieomgeving.
C++ blijft op dat punt terugkomen, omdat het ingenieurs in staat stelt concrete vragen te beantwoorden in plaats van er met de hand omheen te zwaaien. Een native service kan toewijzingsstrategieën, threadpools, ABI-grenzen, pakketten, CPU-specifieke optimalisaties en integratie met bestaande prestatiegevoelige subsystemen beheren. Die controle is niet altijd nodig. Maar waar het nodig is, is het heel moeilijk om met retoriek te faken.
Een nuttig tegenvoorbeeld helpt hier. Als uw team een lichtbelaste interne documentclassificator bouwt die één keer per uur wordt uitgevoerd, kan de weg van de minste weerstand een Python-service zijn met een stabiel bedieningsframework en zeer weinig native code. Daar is niets schandelijks aan. Aan de andere kant, als hetzelfde team gevolgtrekkingen in een latentiegevoelige C++-desktoptoepassing inbedt, naar een edge-apparaat met beperkte middelen verzendt of de uitvoering van modellen rechtstreeks in een hot backend-pad invoegt, wordt het doen alsof de runtime-taal er niet toe doet erg snel duur. Met andere woorden: C++ is niet het antwoord op elk AI-probleem, maar het blijft een van de ernstigste antwoorden wanneer het systeem zelf het probleem wordt.
De bibliotheken als technische persoonlijkheden
De gemakkelijkste manier om te verdwalen in dit ecosysteem is door elke bibliotheek te behandelen alsof deze om dezelfde baan strijdt. Dat zijn ze niet. Een op training gericht raamwerk, een draagbare inferentieruntime, een kernelbibliotheek en een lokale LLM-engine lossen allemaal verschillende problemen op. Als we ze samenbrengen in één categorie die AI-bibliotheken worden genoemd, maken we uiteindelijk keuzes op basis van merkbekendheid in plaats van op systeemontwerp.
ONNX Runtime is in veel productieomgevingen de meest gedisciplineerde en minst theatrale keuze. Het is gebouwd rond een schone belofte: exporteer het model naar een stabiel formaat, laad het via een runtime die zich richt op uitvoering, en laat de applicatie de rest van het systeem bezitten. Dat klinkt eenvoudig, en eenvoud is precies waarom het zo krachtig is. ONNX Runtime is vaak het juiste antwoord als de onderzoeksfase al elders heeft plaatsgevonden en wat overblijft is het nuchtere werk van het herhaaldelijk dienen van gevolgtrekkingen, draagbaar en met voorspelbaar operationeel gedrag. Een computervisie-backend die afbeeldingen ontvangt, tensoren normaliseert, een bekende grafiek uitvoert en resultaten retourneert naar een bestaande C++-service, is een ideaal ONNX Runtime-verhaal. Een product dat slecht aansluit zou een product zijn waarvan de kernwaarde afhangt van dynamisch trainingstijdgedrag, frequente grafiekoperaties binnen de applicatie, of een steeds veranderende reeks aangepaste operators die de export broos maken. In zo'n geval kan de looptijdgrens die er aanvankelijk schoon uitzag, een bron van wrijving worden.
LibTorch heeft een ander karakter. Het is niet in de eerste plaats een lichtgewicht uitvoeringsgrens. Het is het C++-gezicht van een volledig deep-learning-framework. Dat maakt het zwaarder, maar ook expressiever. Wanneer een native applicatie echt tensorbewerkingen moet bezitten, modellen moet bouwen, trainingsachtige manipulaties moet uitvoeren of dicht bij de PyTorch-semantiek moet blijven tijdens de ontwikkeling en productie, wordt LibTorch overtuigender dan ONNX Runtime. Er schuilt een zekere eerlijkheid in de keuze ervan wanneer het product echt een raamwerk nodig heeft en niet alleen een runtime. Het tegenvoorbeeld is net zo belangrijk. Teams gebruiken LibTorch soms voor eenvoudige statische gevolgtrekkingen, omdat het prestigieus of toekomstbestendig aanvoelt. Dan ontdekken ze dat ze een veel groter conceptueel en operationeel oppervlak hebben geïmporteerd dan de vereiste werklast. Een kleine gevolgtrekkingsservice die alleen een stabiele modelgrafiek hoefde te laden, zou voor die beslissing kunnen betalen wat betreft pakketgrootte, complexiteit en foutopsporingsinspanningen.
oneDNN en OpenVINO leven dichter bij het metaal en belonen een meer prestatiebewuste mentaliteit. oneDNN is meestal niet de bibliotheek waar u naar zoekt omdat u een volledig productverhaal wilt. Het is de bibliotheek die u waardeert wanneer CPU-kernels, geheugenformaten en efficiëntie op operatorniveau belangrijk genoeg worden om directe aandacht te verdienen. Veel teams gebruiken het indirect via runtimes op een hoger niveau, wat vaak verstandig is. OpenVINO bevindt zich ondertussen op een meer strategische plaats. Het helpt teams die zich bekommeren om Intel-georiënteerde implementatie, grafische optimalisatie en hardwarebewuste uitvoering zonder elk detail op laag niveau handmatig te willen beheren. In de praktijk beginnen deze tools ertoe te doen wanneer het bedrijfsprobleem niet langer alleen maar 'het model uitvoeren' is, maar 'het model efficiënt uitvoert op de hardware die we daadwerkelijk kunnen kopen, implementeren en onderhouden'. Dat onderscheid klinkt in een vergadering klein en wordt in een begroting heel groot.
TensorFlow Lite vertegenwoordigt een heel ander temperament. Het is de stem van terughoudendheid. Op edge-apparaten, mobiele doelen en systemen met beperkte middelen is volledigheid vaak minder waardevol dan fitheid. Ingenieurs hebben daar geen majestueus raamwerk nodig; ze hebben een model nodig dat laadt, uitvoert en binnen strenge beperkingen blijft op het gebied van geheugen, pakketgrootte, energieverbruik en opstarttijd. TensorFlow Lite is zinvol wanneer het implementatiedoel zelf de belangrijkste kracht is die de architectuur vormgeeft. Het tegenvoorbeeld is ook gebruikelijk: een team begint met een edge-runtime omdat het efficiënt klinkt, en breidt dit vervolgens langzaam uit naar een breder serverplatform of een workflow met meer dynamische behoeften dan waarvoor het is gebouwd. Efficiëntie aan de rand vertaalt zich niet automatisch in comfort elders.
Dan is er nog llama.cpp, dat speciale aandacht verdient omdat het de emotionele kaart van lokale gevolgtrekkingen heeft veranderd. Voordat llama.cpp en soortgelijke projecten mainstream werden, gingen veel ingenieurs ervan uit dat lokale, grote taalmodellen een onderzoeksspeeltje of een bedrijfsapparaat zouden blijven. llama.cpp demonstreerde iets interessanters: met agressieve kwantisering, zorgvuldig kernelwerk en gedisciplineerde engineering zou een moderne LLM een lokale native component binnen gewone systemen kunnen worden. Dat inzicht is van belang buiten één project. Het herinnerde het hele veld eraan dat native uitvoering, modelcompressie en praktische implementatie veel sneller kunnen gaan dan gecentraliseerde verhalen vaak suggereren. Maar lama.cpp heeft ook een natuurlijke grens. Het is uitstekend als de ondersteunde transformatormodellen lokaal en efficiënt worden uitgevoerd. Het is geen algemene vervanging voor het hele deep-learning-ecosysteem, en teams komen in de problemen als ze vragen om er één te worden.
Hoe te kiezen zonder verleid te worden door hype
De meest betrouwbare manier om uit deze bibliotheken te kiezen, is door te beginnen met het product en pas later de tool een naam te geven. Begin door te vragen wat uw applicatie werkelijk bezit en wat deze alleen maar verbruikt. Als het systeem meestal een stabiel model gebruikt en draagbare, goed begrensde gevolgtrekkingen nodig heeft, is ONNX Runtime vaak het rustigste antwoord. Als het systeem zelf de taal van tensoren, modules en raamwerksemantiek moet spreken, verdient LibTorch de discussie. Als CPU-efficiëntie, grafische optimalisatie of Intel-zware implementatie het moeilijkste deel is, komen oneDNN en OpenVINO dichter bij het centrum. Als het doel klein, offline, batterijgevoelig of ingebed is, wordt TensorFlow Lite natuurlijker. Als het product expliciet gaat over het uitvoeren van een lokaal gekwantiseerd taalmodel in een native omgeving, hoort llama.cpp al vroeg op tafel.
Een tweede vraag is net zo belangrijk: waar wordt de technische pijn eigenlijk betaald? Teams kiezen vaak bibliotheken op basis van benchmarkkoppen en ontdekken dan dat hun echte pijn ergens anders ligt. Een runtime met spectaculaire doorvoercijfers kan nog steeds de verkeerde keuze zijn als de export onstabiel is, de voorverwerking rommelig is of de implementatieverpakking broos wordt. Een wat langzamere runtime kan nog steeds de betere zakelijke keuze zijn als hierdoor een schonere grens ontstaat tussen modelproducenten en systeembeheerders. Ingenieurs die meer dan één AI-product hebben geleverd, leren deze les diep: de beste bibliotheek is niet altijd degene die de benchmarklijst wint, maar degene die het om twee uur 's nachts gemakkelijker maakt om over het hele systeem te redeneren.
Dit is waar tegenvoorbeelden gezond worden. Overweeg een team dat een native documentanalyseservice bouwt. De modieuze keuze zou kunnen zijn om naar het zwaarste raamwerk te grijpen dat beschikbaar is, omdat dit toekomstbestendig aanvoelt. Maar als het model statisch is, de voorverwerkingspijplijn eenvoudig is en de echte behoefte stabiele gevolgtrekking binnen een bestaande C++-service is, zal ONNX Runtime waarschijnlijk op de lange termijn minder belemmering veroorzaken. Beschouw nu het omgekeerde. Een team experimenteert met aangepaste tensorstromen, frequente architectuurwijzigingen en nauwe koppeling met op PyTorch gebaseerde trainingslogica. Alles via ONNX forceren omdat het 'productieklaar' klinkt, kan een fragiele exportgerichte workflow creëren waar niemand echt van geniet. In beide gevallen is de fout dezelfde: het team koos eerder een identiteit dan een werklast.
Hoe een goede integratie er eigenlijk uitziet
Een volwassen integratieworkflow begint bij het datacontract, niet bij de bibliotheek. Voordat u de runtime bespreekt, moet u beslissen wat de toepassing aan het model geeft en wat het model aan de toepassing retourneert. Noem de tensorvormen, dtypes, normalisatieregels, tokenisatiepaden, opvulgedrag, batch-aannames en foutcondities. Dit klinkt bijna bureaucratisch, maar het is de stille bron van veel succesvolle implementaties. Systemen falen niet alleen omdat de looptijden verkeerd zijn, maar ook omdat de grenzen eromheen vaag zijn.
Zodra het datacontract stabiel is, wordt export- of modelverpakkingen veel gemakkelijker te valideren. Een team kan de resultaten tussen het onderzoekstraject en het productietraject vergelijken op basis van representatieve inputs, toleranties meten en detecteren waar de betrouwbaarheid afwijkt. Hier ontdekken ingenieurs of hun elegante architectuur de werkelijkheid overleeft. Soms is de geëxporteerde grafiek prima en is het enige probleem een niet-overeenkomende voorverwerking. Soms is de runtime vlekkeloos en is het echte probleem een overabonnement op threads elders in de service. Soms kan een zogenaamd klein model de geheugendruk van echte gelijktijdigheid niet overleven. Al deze ontdekkingen zijn nuttig. Het betekent dat het systeem zichtbaar begint te worden.
Daarna komen benchmarking en profilering, en hier geldt dezelfde oude regel: meet het systeem dat u van plan bent te verzenden, niet het speelgoed dat u vroeger slim vond. Benchmark het model onder realistische verzoekvormen, batchgroottes, invoervariabiliteit en hardwareomstandigheden. Profielvoorbewerking en nabewerking ook, omdat veel teams onbewust alleen de modelkern benchmarken en vergeten dat klanten voor het hele traject betalen. Bij productie-AI is een grafiek van tien milliseconden omgeven door zestig milliseconden vermijdbare lijm nog steeds een kenmerk van zeventig milliseconden.
Zorg er ten slotte voor dat de implementatie reproduceerbaar is. Native AI-stacks belonen discipline. Pin-versies, documentcompiler- en runtime-aannames, beslis welke uitvoeringsproviders of CPU-functies vereist zijn en behoud een beperkte set ondersteunde configuraties. Als een teamgenoot zonder archeologie hetzelfde gevolgtrekkingspad niet op een andere machine kan reproduceren, is de stapel nog niet klaar, hoe indrukwekkend de demo ook mag zijn geweest. Goede C++ AI-engineering gaat niet alleen over snelheid. Het gaat erom het systeem zo kalm te maken dat de snelheid begrijpelijk blijft.
Fouten die zich blijven herhalen
De meest gemaakte fout is het verwarren van onderzoekswaarheid met productiewaarheid. Een model dat er uitstekend uitziet in een notebook kan onhandig worden als het eenmaal wordt geëxporteerd, gekwantificeerd, ingebed, geobserveerd en uitgevoerd onder echte gelijktijdigheid. Dat betekent niet dat het model slecht was. Het betekent dat het systeem groter was dan het experiment. De tweede steeds terugkerende fout is om te doen alsof voor- en nabewerking secundair zijn. Bij echte producten zijn ze vaak het halve werk. Beleid voor het wijzigen van de afbeeldingsgrootte, het gedrag van de tokenizer, normalisatie van functies, kalibratiedrempels en uitvoerdecodering, alle vormcorrectheid en latentie zijn net zo zeker als de kernruntime.
Een derde fout is het te veel vasthouden aan een raamwerk omdat het modern of alomvattend aanvoelt. Ingenieurs selecteren soms het grootst mogelijke gereedschap in afwachting van behoeften die nooit komen. Het product betaalt dan voor mogelijkheden die het niet gebruikt. De tegenovergestelde fout bestaat ook: de lichtste runtime kiezen in naam van de zuiverheid en dan ontdekken dat dynamisch gedrag, aangepaste bewerkingen of semantiek op raamwerkniveau toch niet optioneel waren. Wijsheid ligt in het alleen betalen voor de macht die je daadwerkelijk kunt verklaren.
Er is ook sprake van een subtieler falen van de houding. Sommige teams behandelen de bibliotheekkeuze alsof deze het hele technische verhaal beslecht. Dat is niet het geval. Goede resultaten komen voort uit herhaald, bescheiden werk: het valideren van output, het meten van hot paths, het verwijderen van vermijdbare kopieën, het verminderen van opstartproblemen, het vereenvoudigen van de verpakking en het leesbaar houden van de runtime-grens. Open-sourcebibliotheken maken dit werk mogelijk; zij voeren het niet namens ons uit.
Een klein implementatieverhaal dat de moeite waard is om te onthouden
Stel je een team voor dat begint met een Python vision-prototype. De demo is sterk genoeg om interne steun te winnen, en al snel gaat het gesprek over integratie met een bestaande C++-service die al de beeldopname, regelevaluatie en rapportage afhandelt. Het team heeft verschillende verleidingen. Eén daarvan is om het model voor altijd achter een aparte Python-service te houden, omdat dit op de korte termijn gemakkelijk is. Een andere is om alles onmiddellijk naar een zwaar native raamwerk te verplaatsen, want dat klinkt serieus. Een derde is wekenlang discussiëren over architectuur voordat zelfs maar het inputcontract wordt gestabiliseerd.
Het meer volwassen pad is rustiger. Eerst definieert het team de voorverwerking en uitvoersemantiek zorgvuldig. Vervolgens wordt de exportgetrouwheid getest op representatieve afbeeldingen. Het kiest voor ONNX Runtime omdat het probleem een statische gevolgtrekking is en geen raamwerkgestuurde experimenten. Later evalueert het voor een edge-variant met zwaardere hardwarebeperkingen of TensorFlow Lite of een agressiever geoptimaliseerd runtime-pad zinvol is voor die producttak. Maanden later, als het bedrijf een lokale assistent-functie toevoegt, kan llama.cpp ook in de architectuur terechtkomen, niet omdat één bibliotheek het hele debat heeft gewonnen, maar omdat elke tool zijn plaats in een andere hoek van het systeem heeft verdiend.
Dat is de diepere les achter al deze bibliotheken. Serieuze AI-techniek beloont zelden zuiverheid. Het beloont fitheid. De beste open-sourcebibliotheek is niet degene met de meeste aanhang. Het is het model dat ervoor zorgt dat uw model onderdeel wordt van een echt systeem, zonder dat de rest van het systeem onredelijk wordt.
Hands-On Lab: Bouw een kleine ONNX Runtime CLI
Theorie wordt overtuigender als ze wordt gecompileerd.
Laten we het kleinste bruikbare native inferentieprogramma in C++ bouwen. Het doel is niet om een model te trainen. Het doel is om met uw eigen handen te voelen hoe een native runtime-grens eruit ziet.
Voor deze oefening heb je nodig:
- een C++17-compiler
- CMaak
- een vooraf gebouwd ONNX Runtime-pakket uit de officiële releases
- elk klein
.onnx-model waarvan de invoer een flat float-tensor is
Projectindeling
tiny-ort/
CMakeLists.txt
main.cpp
third_party/
onnxruntime/
model.onnx
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(tiny_ort LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(ORT_ROOT "${CMAKE_SOURCE_DIR}/third_party/onnxruntime")
add_executable(tiny_ort main.cpp)
target_include_directories(tiny_ort PRIVATE "${ORT_ROOT}/include")
if (WIN32)
target_link_directories(tiny_ort PRIVATE "${ORT_ROOT}/lib")
target_link_libraries(tiny_ort PRIVATE onnxruntime)
else()
target_link_directories(tiny_ort PRIVATE "${ORT_ROOT}/lib")
target_link_libraries(tiny_ort PRIVATE onnxruntime)
endif()
main.cpp
#include <onnxruntime_cxx_api.h>
#include <array>
#include <iostream>
#include <numeric>
#include <vector>
int main() {
Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "tiny-ort"};
Ort::SessionOptions opts;
opts.SetIntraOpNumThreads(1);
opts.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
const ORTCHAR_T* model_path = ORT_TSTR("model.onnx");
Ort::Session session{env, model_path, opts};
std::vector<int64_t> shape{1, 4};
std::vector<float> input{0.25f, 0.50f, 0.75f, 1.0f};
auto mem_info = Ort::MemoryInfo::CreateCpu(
OrtArenaAllocator,
OrtMemTypeDefault
);
Ort::Value tensor = Ort::Value::CreateTensor<float>(
mem_info,
input.data(),
input.size(),
shape.data(),
shape.size()
);
const char* input_names[] = {"input"};
const char* output_names[] = {"output"};
auto outputs = session.Run(
Ort::RunOptions{nullptr},
input_names,
&tensor,
1,
output_names,
1
);
float* out = outputs[0].GetTensorMutableData<float>();
auto out_shape = outputs[0].GetTensorTypeAndShapeInfo().GetShape();
auto out_count = std::accumulate(
out_shape.begin(),
out_shape.end(),
int64_t{1},
std::multiplies<int64_t>{}
);
std::cout << "Output values:\n";
for (int64_t i = 0; i < out_count; ++i) {
std::cout << " [" << i << "] = " << out[i] << "\n";
}
return 0;
}
Bouwen
Op Linux of macOS:
cmake -S . -B build
cmake --build build -j
./build/tiny_ort
Op Windows met MSVC:
cmake -S . -B build
cmake --build build --config Release
.\build\Release\tiny_ort.exe
Wat dit je leert
Dit kleine project dwingt je al om verschillende productierealiteiten onder ogen te zien:
- waar de looptijd leeft
- hoe native afhankelijkheden worden verpakt
- wat tensornamen en -vormen eigenlijk zijn
- hoe expliciete geheugenverwerking aanvoelt in een native inferentiegrens
Dat is precies het punt. Een bibliotheek is niet langer een marketingterm, maar wordt een technische keuze.
Testtaken voor liefhebbers
Als je van het artikel een weekendlab wilt maken, zijn hier handige volgende stappen:
- Vervang de hardgecodeerde invoervector door waarden die zijn geladen vanuit een klein tekst- of binair bestand.
- Druk invoer- en uitvoertensorvormen dynamisch af in plaats van ze aan te nemen.
- Voeg eenvoudige latentiemetingen toe rond
session.Runen vergelijk1,2en4intra-op-threads. - Ruil ONNX Runtime in voor LibTorch in een soortgelijke speelgoedinferentie-app en schrijf op wat gemakkelijker werd en wat zwaarder werd.
- Exporteer een klein model uit Python, laad het in dit C++-programma en controleer of verschillen in de voorbewerking het resultaat niet stilletjes veranderen.
Als je deze vijf taken eerlijk uitvoert, begrijp je meer van de inzet van AI dan veel mensen die een uur lang raamwerknamen kunnen opzeggen.
Samenvatting
Open-source neurale netwerkbibliotheken voor C++ marcheren niet in één parade. Ze zijn voortgekomen uit verschillende technische behoeften, en blijven het nuttigst als we die oorsprong respecteren. ONNX Runtime is krachtig omdat het het probleem verkleint en productieteams een stabiele inferentiegrens geeft. LibTorch is waardevol wanneer de native applicatie echt in tensoren en modules moet denken in plaats van alleen maar een bevroren grafiek te gebruiken. oneDNN en OpenVINO zijn van belang wanneer efficiëntie op een laag niveau en inzet op specifieke hardwarefamilies niet langer secundaire zorgen zijn. TensorFlow Lite schittert wanneer het apparaat zelf de harde beperking is. llama.cpp is van belang omdat het publiekelijk heeft bewezen dat zorgvuldige native engineering moderne taalmodellen kan omzetten in praktische lokale componenten in plaats van diensten op afstand.
De beste keuze is daarom zelden de meest modieuze. Het is degene die het hele systeem rustiger maakt. Een goede runtime is een runtime die uw team zonder mythologie kan begrijpen, benchmarken, profileren, verpakken, testen en uitvoeren. Wanneer ingenieurs vanuit die plek kiezen, ziet open-source AI er niet langer uit als een verwarrende dierentuin van raamwerken, maar begint het te lijken op wat het werkelijk is: een gereedschapskist die rijk genoeg is om serieuze native producten te ondersteunen.
Referenties
- ONNX Runtime C/C++ API: https://onnxruntime.ai/docs/api/c/index.html
- Officieel ONNX-project: https://onnx.ai/
- PyTorch C++ frontend-documentatie: https://docs.pytorch.org/cppdocs/frontend.html
- oneDNN officiële documentatie: https://uxlfoundation.github.io/oneDNN/
- OpenVINO-documentatie: https://docs.openvino.ai/
- LiRT / TensorFlow Lite C++ API-documenten: https://ai.google.dev/edge/litert/api_docs/cc
- llama.cpp-opslagplaats: https://github.com/ggml-org/llama.cpp
- ONNX Runtime GitHub-repository: https://github.com/microsoft/onnxruntime
- PyTorch-repository: https://github.com/pytorch/pytorch