Delen via


Uitvoeringsproviders initialiseren met Windows ML

Op deze pagina worden geavanceerdere manieren besproken waarop uw app het downloaden en registreren van uitvoerproviders (EPs) met Behulp van Windows ML probleemloos kan afhandelen. Zelfs als een EP al op het apparaat is gedownload, moet u de EPs registreren telkens wanneer uw app wordt uitgevoerd, zodat deze worden weergegeven in ONNX Runtime.

Downloaden en registreren in één gesprek

Voor de eerste ontwikkeling kan het handig zijn om gewoon aan te roepen EnsureAndRegisterCertifiedAsync(), waardoor EPs die compatibel zijn met uw apparaat aanwezig zijn (en de EPs worden gedownload als ze niet aanwezig zijn) en vervolgens worden alle aanwezige EPs geregistreerd bij de ONNX Runtime. Houd er rekening mee dat deze methode bij de eerste uitvoering meerdere seconden of zelfs minuten kan duren, afhankelijk van de netwerksnelheid en IP-adressen die moeten worden gedownload.

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

// Ensure execution providers compatible with device are present (downloads if necessary)
// and then registers all present execution providers with ONNX Runtime
await catalog.EnsureAndRegisterCertifiedAsync();

Aanbeveling

In productietoepassingen verpakt u de EnsureAndRegisterCertifiedAsync() aanroep in een try-catch-blok om potentiële netwerk- of downloadfouten probleemloos af te handelen.

Alleen bestaande providers registreren

Als u wilt voorkomen dat u downloadt en alleen uitvoeringsproviders registreert die al aanwezig zijn op de computer:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Ontdekken of er EPs zijn (zonder te downloaden)

Als u wilt controleren of er niet-aanwezige EPs zijn die compatibel zijn met uw apparaat en drivers, maar u de download niet wilt starten, kunt u de FindAllProviders()-methode gebruiken en zien of providers een ReadyState van NotPresent hebben. Vervolgens kunt u besluiten om dit af te handelen zoals u wilt (uw gebruikers starten in een 'Installatiescherm', vragen of ze willen installeren, enzovoort). U kunt ervoor kiezen om alle al gedownloade EPs te blijven gebruiken (door te bellen RegisterCertifiedAsync() zoals hierboven wordt weergegeven) als u uw gebruikers nu niet wilt laten wachten.

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();
}

Een specifiek EP downloaden en registreren

Als er een specifieke uitvoeringsprovider is die uw app wil gebruiken, kunt u een bepaalde uitvoeringsprovider downloaden en registreren zonder alle compatibele EP's te downloaden.

U gebruikt eerst FindAllProviders() om alle compatibele EPs op te halen, en vervolgens kunt u EnsureReadyAsync() aanroepen op een bepaalde ExecutionProvider om de specifieke uitvoeringsprovider te downloaden, en TryRegister() om de specifieke uitvoeringsprovider te registreren.

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();
    }
}

Voorbeeld van productie-app

Voor productietoepassingen ziet u hier een voorbeeld van wat uw app kan doen om uzelf en uw gebruikers controle te geven over wanneer downloads plaatsvinden. U kunt controleren of nieuwe uitvoeringsproviders beschikbaar zijn en deze voorwaardelijk downloaden:

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 == "MIGraphXExecutionProvider" ||
    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();
    }
}

Zie ook