Freigeben über


Initialisieren von Ausführungsanbietern mit Windows ML

Auf dieser Seite werden erweiterte Möglichkeiten erläutert, wie Ihre App das Herunterladen und Registrieren von Ausführungsanbietern (EPs) mit Windows ML ordnungsgemäß verarbeiten kann. Selbst wenn eine EP bereits auf dem Gerät heruntergeladen wurde, müssen Sie die EPs jedes Mal registrieren, wenn Ihre App ausgeführt wird, damit sie in DER ONNX-Runtime angezeigt werden.

Herunterladen und Registrieren in einem Anruf

Für die erstentwicklung kann es schön sein, einfach aufzurufen EnsureAndRegisterCertifiedAsync(), die alle neuen EPs (oder neue Versionen von EPs) herunterladen, die mit Ihrem Gerät und Treibern kompatibel sind, wenn sie noch nicht heruntergeladen wurden, und dann alle EPs registrieren. Beachten Sie, dass diese Methode bei der ersten Ausführung je nach Netzwerkgeschwindigkeit und EPs, die heruntergeladen werden müssen, mehrere Sekunden oder sogar Minuten dauern kann.

// Get the default ExecutionProviderCatalog
var catalog = ExecutionProviderCatalog.GetDefault();

// Ensure and register all compatible execution providers with ONNX Runtime
// This downloads any necessary components and registers them
await catalog.EnsureAndRegisterCertifiedAsync();

Tipp

Schließen Sie in Produktionsanwendungen den EnsureAndRegisterCertifiedAsync() Anruf in einen Try-Catch-Block ein, um potenzielle Netzwerk- oder Downloadfehler ordnungsgemäß zu verarbeiten.

Nur vorhandene Anbieter registrieren

Wenn Sie das Herunterladen vermeiden und nur Ausführungsanbieter registrieren möchten, die bereits auf dem Computer vorhanden sind:

var catalog = ExecutionProviderCatalog.GetDefault();

// Register only providers already present on the machine
// This avoids potentially long download times
await catalog.RegisterCertifiedAsync();

Ermitteln, ob neue EPs vorhanden sind (ohne Download)

Wenn Sie sehen möchten, ob neue EPs mit Ihrem Gerät und Treibern kompatibel sind, die heruntergeladen werden können, aber nicht starten möchten, können Sie die FindAllProviders() Methode verwenden und dann überprüfen, ob anbieter über einen ReadyState von NotPresent verfügen. Sie können dann entscheiden, dies zu behandeln, aber Sie möchten (starten Sie Ihre Benutzer in einen "Aktualisierungsbildschirm", fragen Sie sie, ob sie aktualisieren möchten usw.). Sie können die bereits heruntergeladenen EPs weiterhin verwenden (indem Sie wie oben gezeigt aufrufen RegisterCertifiedAsync() ), wenn Sie Ihre Benutzer nicht sofort warten möchten.

var catalog = ExecutionProviderCatalog.GetDefault();

// Check if there are new EPs that need to be downloaded
if (catalog.FindAllProviders().Any(provider => provider.ReadyState == ExecutionProviderReadyState.NotPresent))
{
    // TODO: There are new EPs, decide how your app wants to handle that
}
else
{
    // All EPs are already present, just register them
    await catalog.RegisterCertifiedAsync();
}

Herunterladen und Registrieren einer bestimmten EP

Wenn es einen bestimmten Ausführungsanbieter gibt, den Ihre App verwenden möchte, können Sie einen bestimmten Ausführungsanbieter herunterladen und registrieren, ohne alle kompatiblen EPs herunterzuladen.

Sie werden zuerst verwendenFindAllProviders(), um alle kompatiblen EPs abzurufen, und dann können Sie einen bestimmten EnsureReadyAsync() aufrufen, um den spezifischen Ausführungsanbieter herunterzuladen und den bestimmten Ausführungsanbieter aufzurufenTryRegister(), um den spezifischen Ausführungsanbieter zu registrieren.

var catalog = ExecutionProviderCatalog.GetDefault();

// Get the QNN provider, if present
var qnnProvider = catalog.FindAllProviders()
    .FirstOrDefault(i => i.Name == "QNNExecutionProvider");

if (qnnProvider != null)
{
    // Download it
    var result = await qnnProvider.EnsureReadyAsync();

    // If download succeeded
    if (result != null && result.Status == ExecutionProviderReadyResultState.Success)
    {
        // Register it
        bool registered = qnnProvider.TryRegister();
    }
}

Beispiel einer Produktions-App

Für Produktionsanwendungen finden Sie hier ein Beispiel dafür, was Ihre App tun kann, um sich selbst und Ihren Benutzern die Kontrolle über das Auftreten von Downloads zu verschaffen. Sie können überprüfen, ob neue Ausführungsanbieter verfügbar sind und diese bedingt herunterladen:

using Microsoft.Windows.AI.MachineLearning;

var catalog = ExecutionProviderCatalog.GetDefault();

// Filter to the EPs our app supports/uses
var providers = catalog.FindAllProviders().Where(p =>
    p.Name == "VitisAIExecutionProvider" ||
    p.Name == "OpenVINOExecutionProvider" ||
    p.Name == "QNNExecutionProvider" ||
    p.Name == "NvTensorRtRtxExecutionProvider"
);

if (providers.Any(p => p.ReadyState == ExecutionProviderReadyState.NotPresent))
{
    // Show UI to user asking if they want to download new execution providers
    bool userWantsToDownload = await ShowDownloadDialogAsync();

    if (userWantsToDownload)
    {
        // Download all EPs
        foreach (var p in providers)
        {
            if (p.ReadyState == ExecutionProviderReadyState.NotPresent)
            {
                // Ignore result handling here; production code could inspect status
                await p.EnsureReadyAsync();
            }
        }

        // And register all EPs
        await catalog.RegisterCertifiedAsync();
    }
    else
    {
        // Register only already-present EPs
        await catalog.RegisterCertifiedAsync();
    }
}