- ONNX Runtime izvaja pospešene modele ONNX (TensorRT, OpenVINO, DirectML) na več platformah.
- Omogoča hitro in učinkovito sklepanje na CPU/GPU/NPU, na lokaciji, na robu omrežja in v oblaku z API-ji v več jezikih.
- Praktičen primer: WinUI 3 v Windows z DirectML in ResNet50; enostaven za uporabo tudi v Python.

Razvijajoče se trendovsko vprašanje IA Uporabljeno je, kakšno vlogo ima ONNX Runtime pri prenosu modelov v produkcijo. Na kratko, ONNX Runtime je mehanizem sklepanja, optimiziran za modele formata ONNX., zasnovan za delo na različnih sistemih in izkoriščanje prednosti strojna oprema na voljo (CPU, GPU ali NPU). V tem članku boste videli, čemu služi, kako se uporablja v Pythonu in .NET-u, ter podroben primer z WinUI 3 v sistemu Windows pospešen z DirectML.
Če prihajate z usposabljanja za PyTorch ali TensorFlow in želite hitro in učinkovito uvajanje, vam ONNX omogoča izvoz modela, ONNX Runtime pa poskrbi za njegovo hitro izvajanje z nizko porabo pomnilnika. Zasebnost, nizka latenca in nizki stroški To so jasne prednosti, če sklepanje izvajate lokalno ali na robu omrežja, ne da bi se zanašali na oblak.
Kaj je izvajalno okolje ONNX?
Izvajalno okolje ONNX je pospeševalnik modelov strojnega učenja za več platform, z API-ji v jezikih C, C++, Python, C#, Java in JavaScript (vključno z Node.js). Pripravljen je za Linux, Windows in macOS ter se integrira tudi s spletnim, mobilnim in robnim okoljem. Njegova zasnova podpira oba nevronske mreže globoko tako kot tradicionalni modeli strojnega učenja in jih je mogoče razširiti s ponudniki izvajanja, specifičnimi za strojno opremo.
Med temi ponudniki so TensorRT na grafičnem procesorju NVIDIA, OpenVINO v strojni opremi Intel y DirectML v sistemu WindowsTa abstrakcijska plast omogoča modelu ONNX, da izkoristi razpoložljivo pospeševanje naprav, hkrati pa ohranja stabilen vmesnik. Obsežne storitve, kot so Bing, Office in Azure AI, ga že uporabljajo, izboljšave pa so vidne v do 2x na procesorju v določenih scenarijih, zahvaljujoč optimizacijam grafov, združevanju operatorjev in učinkovitemu upravljanju pomnilnika.
ONNX: Standardni format modela

ONNX (Odprta izmenjava nevronskih omrežij) je odprti standard za predstavitev naučenih modelov. Omogoča izvoz iz PyTorch, TensorFlow/Keras, scikit-learn, TFLite, MXNet, Chainer ali MATLAB in delujejo kjer koli z motorji, kot je ONNX Runtime. Model ONNX vključuje struktura omrežja, pesos usposobljeni in opis vhodov/izhodov, kar omogoča interoperabilnost med ogrodji in strojno opremo.
Ta pristop pospeši pot od raziskav do produkcije: usposabljate se tam, kjer vam je ljubše, in uvajate tam, kjer je najprimernejše (oblak, lokalno, na robu). ONNX olajša tudi optimizirajte velikost in zmogljivost s tehnikami, kot je kvantifikacija po usposabljanju, ki je zelo uporabna pri vgrajene naprave ali Internet stvari.
Če morate pregledati model, orodja, kot so Netron pomagajo vizualizirati graf in plasti. In če delate z zaznavanjem objektov, modeli, kot so YOLO podjetja Ultralytics Dobro jih je izvoziti v ONNX, da se nato izvajajo z ONNX Runtime, OpenVINO ali drugimi motorji, s čimer pridobijo prenosljivost brez vezave na en sam ekosistem.
Izvajalni paketi ONNX in njihova uporaba v Pythonu
Za Python ONNX Runtime ponuja pakete v PyPI za CPU in GPU. Pred namestitvijo preverite sistemske zahteve, da izberete pravilno gradnjo. S pipom je namestitev preprosta in omogoča hiter zagon z lokalnim ali oddaljenim sklepanjem.
Hitra namestitev:
pip install onnxruntime # build para CPU
pip install onnxruntime-gpu # build con aceleración GPU (según plataforma)
Ko je model nameščen, je nalaganje in poizvedovanje po metapodatkih preprosto. Seja sklepanja razkrije metode za branje. vhodi in izhodi pričakovano, kot tudi metapodatke iz samega modela, ki pomagajo pri preverjanju oblik in tipov pred klicem seja.zagon.
Primer seje:
import onnxruntime as ort
session = ort.InferenceSession("ruta/al/modelo.onnx")
# Metadatos y firmas
meta = session.get_modelmeta()
first_input_name = session.get_inputs().name
first_output_name = session.get_outputs().name
# Inferencia (todas las salidas o sólo algunas)
results_all = session.run([], {first_input_name: indata})
results_some = session.run(, {first_input_name: indata})
Dokumentacija, ki je priložena modelu, običajno navaja predhodno obdelan zahtevane in vhodne oblike. Pazite, da upoštevate skaliranje tenzorjev, normalizacijo in dimenzije, sicer bo sklepanje neuspešno ali bo dalo nedosledne rezultate.
Primer celotnega poteka:
// Selección y visualización
FileOpenPicker picker = new() { ViewMode = PickerViewMode.Thumbnail };
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".jpeg");
picker.FileTypeFilter.Add(".png");
picker.FileTypeFilter.Add(".gif");
InitializeWithWindow.Initialize(picker, WinRT.Interop.WindowNative.GetWindowHandle(this));
StorageFile file = await picker.PickSingleFileAsync();
if (file == null) return;
var bitmap = new BitmapImage();
bitmap.SetSource(await file.OpenAsync(Windows.Storage.FileAccessMode.Read));
myImage.Source = bitmap;
// Preprocesado con ImageSharp
using var fileStream = await file.OpenStreamForReadAsync();
IImageFormat format = SixLabors.ImageSharp.Image.DetectFormat(fileStream);
using Image<Rgb24> image = SixLabors.ImageSharp.Image.Load<Rgb24>(fileStream);
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new SixLabors.ImageSharp.Size(224, 224),
Mode = ResizeMode.Crop
}));
var mean = new[] { 0.485f, 0.456f, 0.406f };
var std = new[] { 0.229f, 0.224f, 0.225f };
DenseTensor<float> input = new(new[] { 1, 3, 224, 224 });
image.ProcessPixelRows(accessor =>
{
for (int y = 0; y < accessor.Height; y++)
{
Span<Rgb24> row = accessor.GetRowSpan(y);
for (int x = 0; x < accessor.Width; x++)
{
input = ((row.R / 255f) - mean) / std;
input = ((row.G / 255f) - mean) / std;
input = ((row.B / 255f) - mean) / std;
}
}
});
// OrtValue desde memoria (evita copias)
using var inputOrt = OrtValue.CreateTensorValueFromMemory(
OrtMemoryInfo.DefaultInstance, input.Buffer, new long[] { 1, 3, 224, 224 });
var inputs = new Dictionary<string, OrtValue> { { "data", inputOrt } };
if (_inferenceSession == null) InitModel();
using var runOptions = new RunOptions();
using var results = _inferenceSession.Run(runOptions, inputs, _inferenceSession.OutputNames);
// Postprocesado: softmax y Top-10
var logits = results.GetTensorDataAsSpan<float>().ToArray();
float sum = logits.Sum(v => (float)Math.Exp(v));
var softmax = logits.Select(v => (float)Math.Exp(v) / sum).ToArray();
Izhodni indeksi ustrezajo oznakam iz učnega nabora (npr. ImageNet). Lahko jih preslikate v Zemljevid oznak (niz nizov v istem vrstnem redu kot razredi modela) in izvleči Top 10 z večjim zaupanjem jih prikazati v TextBlocku.
Naknadna obdelava in oznake:
var top10 = softmax
.Select((score, idx) => new Prediction { Label = LabelMap.Labels, Confidence = score })
.OrderByDescending(p => p.Confidence)
.Take(10);
featuresTextBlock.Text = "Top 10 predictions for ResNet50 v2..." + Environment.NewLine;
featuresTextBlock.Text += "-------------------------------------" + Environment.NewLine;
foreach (var p in top10)
{
featuresTextBlock.Text += $"Label: {p.Label}, Confidence: {p.Confidence}" + Environment.NewLine;
}
internal class Prediction
{
public object Label { get; set; }
public float Confidence { get; set; }
}
public static class LabelMap
{
public static readonly string[] Labels = new[]
{
// Lista completa de etiquetas (p.ej., ImageNet) en orden; omitada por brevedad
"tench", "goldfish", "great white shark", /* ... */ "toilet paper"
};
}
S tem se ob kliku na gumb »Izberi fotografijo« model inicializira (če še ni bil), slika se obdela in najverjetnejše napovedi z njihovimi zaupnostmiTa vzorec lahko prilagodite drugim modelom in nalogam ONNX (zaznavanje, segmentacija, besedilo itd.).
Izvajanje v Azure in MLOps
Če potrebujete skaliranje, vam strojno učenje Azure omogoča uvajanje modelov ONNX kot končne točke REST, upravljanje različic, spremljanje in življenjski cikel MLOps. Na ta način lahko prenesete tisto, kar izvajate lokalno, v oblak, hkrati pa ohranite enako modelni artefakt in izkoriščanje prednosti strežniških pospeševalcev.
Tipičen potek je pakiranje sklepanja z ONNX Runtime znotraj vsebnika, izpostavljanje končne točke in orkestriranje. posodobitve, metrike y opozorilaTa pristop poenoti razvoj in delovanje modela velikega obsega.
Strojno pospeševanje in združljivost
ONNX Runtime izstopa po svoji arhitekturi Ponudniki izvedbe: s TensorRT stisne grafični procesor NVIDIA; z OpenWINE optimizira Intelove procesorje/video enote; in z DirectML pospešuje Windows na grafičnih procesorjih in nevronskih procesorjih različnih proizvajalcev. Na voljo so tudi integracije z Vitis AI za zagon modelov na Xilinx FPGA (npr. U250), s čimer se razširi obseg na specializirane konfiguracije.
Zaradi te prilagodljivosti lahko isti model ONNX dobro deluje v oblak, rob, splet in mobilne naprave, pri čemer mehanizem prilagaja operatorje in pomnilnik vsaki platformi. Rezultat je manjša latenca in izboljšana prepustnost brez spreminjanja kode na visoki ravni.
Lokalna umetna inteligenca: zasebnost, stroški in nadzor
Lokalno izvajanje umetne inteligence z ONNX Runtime prinaša Zasebnost (podatkov ne delite), minimalna latenca y predvidljivi stroški (brez uporabe API-ja v oblaku). Še posebej je dragocen v zdravstvu, industriji ali scenarijih z omejeno povezljivostjo in se dobro integrira z .NET (celo VB.NET) ali Python, odvisno od vašega sklada.
Za napredne modele, a GPU se zelo pospeši, vendar je ONNX Runtime optimiziran tudi za CPU. Ključno je spoštovanje predobdelave modela in po potrebi uporaba kvantifikacija za zmanjšanje velikosti in pomnilnika ob hkratnem ohranjanju ustrezne natančnosti.
Pretvorba in dobre prakse
Pretvorba modelov v ONNX iz PyTorcha se običajno izvede z torch.onnx.export in iz TensorFlowa z tf2onnx. Asegura que el primer tenzorja (lutkasti vnos) ima pravilno obliko in da ciljna operacija podpira operacije z grafom.
Po pretvorbi preverite model s poizvedbo vhodi/izhodi z ONNX Runtime in testnimi primeri izvajanja. Če obstajajo sloji po meri, jih boste morda morali prilagoditi ali zamenjati s podprtimi operatorji; združljivost med obsedenosti in različice so pomembne, da se izognemo presenečenjem.
Aplikacije in primeri uporabe
V računalniškem vidu ONNX omogoča klasifikacijo, zaznavanje in segmentacijo na različnih napravah, od strežnikov do rob in internet stvari. Zmanjšanje velikosti s kvantizacijo in optimizacijami sklepanja je idealen za delo v realnem času (npr. roboti tovarniški ali kakovostni pregled).
V zdravstvu lahko modeli ONNX v nosljivih napravah in sistemih za spremljanje signali predobdelave (kot je EKG) in lokalno izluščijo značilnosti, pri čemer ohranjajo zasebnost. Za pametna mesta kamere, ki jih poganja ONNX, prepoznajo vozila v v realnem času brez odvisnosti od oblaka, optimizacija prometa in virov.
Izbrani viri in vsebina
ONNX Runtime poganja umetno inteligenco v Windows, Office, kognitivne storitve Azure in Bingin v tisočih globalnih projektih. Obstajajo izobraževalni materiali, ki se poglobljeno ukvarjajo z ONNX, njegovim odnosom z obsedenosti, strojno pospeševanje in resnični primeri kot je na primer Bingovo semantično iskanje slik.
Primer programa ozaveščanja označuje te mejnike: Predstavitev ONNX-a, Uvod v ONNX, Demo: Pretvorba iz CoreML, Izvajalno okolje ONNX, Različice in nabori, Strojno pospeševanje, Praktični primerTa vrsta vsebine ponazarja, kako preiti iz modela v optimizirano uvajanje.
Za prenos že pripravljenih predlog, Model živalskega vrta ONNX ponuja klasifikatorje slik, detektorje in modele NLP. Če se nekaj ne pretvori prvič, je pogosto koristno odpreti incident v skladišču pretvornikov ustrezne in pregledajte nepodprte operacije.
Kot končna opomba obstajajo tudi specifične integracije, kot so Vitis AI (Xilinx) z ONNX Runtime za U250 FPGA, ki širi obseg uporabe na programabilni strojni opremi za visoko zmogljive aplikacije z nizko zakasnitvijo.
ONNX Runtime se je pozicioniral kot ključni element za zagon modelov umetne inteligence z hitrost, vsestranskost in učinkovitost v skoraj vsakem okolju. Ne glede na to, ali delate s Pythonom ali .NET-om, na lokaciji ali v Azureju in potrebujete podporo za CPE-je, GPU-je, NPU-je ali celo FPGA-je, vam kombinacija ONNX + ONNX Runtime omogoča učenje, kjer koli želite, in uvajanje, kjer koli je to najprimernejše, s preizkušenim optimizacijskim cevovodom in aktivno skupnostjo, ki spodbuja njegov razvoj.
Strasten pisec o svetu bajtov in tehnologije nasploh. Rad delim svoje znanje s pisanjem in to je tisto, kar bom počel v tem blogu, saj vam bom pokazal vse najbolj zanimive stvari o pripomočkih, programski opremi, strojni opremi, tehnoloških trendih in še več. Moj cilj je, da vam pomagam krmariti po digitalnem svetu na preprost in zabaven način.
