Condividi tramite


Inizializzare i provider di esecuzione con Windows ML

Questa pagina illustra i modi più avanzati in cui l'app può gestire normalmente il download e la registrazione di provider di esecuzione tramite Windows ML. Anche se un EP è già scaricato nel dispositivo, devi registrare gli EP ogni volta che viene eseguita l'app in modo che vengano visualizzati in ONNX Runtime.

Scaricare e registrarsi in una sola chiamata

Per lo sviluppo iniziale, può essere bello chiamare EnsureAndRegisterCertifiedAsync()semplicemente , che scaricherà eventuali nuovi EPS (o nuove versioni di EPS) compatibili con il dispositivo e i driver se non sono già scaricati e quindi registrare tutti gli EPS. Si noti che alla prima esecuzione questo metodo può richiedere più secondi o anche minuti a seconda della velocità di rete e degli EPS che devono essere scaricati.

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

Suggerimento

Nelle applicazioni di produzione eseguire il wrapping della EnsureAndRegisterCertifiedAsync() chiamata in un blocco try-catch per gestire correttamente potenziali errori di rete o download.

Registrare solo i provider esistenti

Se si vuole evitare di scaricare e registrare solo i provider di esecuzione già presenti nel computer:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Scoprire se sono presenti nuovi indirizzi IP (senza download)

Se vuoi verificare se sono disponibili nuovi EP compatibili con il tuo dispositivo e i driver da scaricare, ma non vuoi avviare il download, puoi usare il FindAllProviders() metodo e quindi verificare se i provider hanno readyState of NotPresent. È quindi possibile decidere di gestirlo, ma si vuole (avviare gli utenti in una schermata di aggiornamento, chiedere loro se vogliono aggiornare e così via). È possibile scegliere di continuare a usare gli EPS già scaricati (chiamando RegisterCertifiedAsync() come illustrato in precedenza) se non si vuole fare in modo che gli utenti attendino subito.

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

Scaricare e registrare un EP specifico

Se è presente un provider di esecuzione specifico che l'app vuole usare, è possibile scaricare e registrare un provider di esecuzione specifico senza scaricare tutti gli EP compatibili.

Si userà FindAllProviders() prima di tutto per ottenere tutti gli EPS compatibili e quindi è possibile chiamare EnsureReadyAsync() su un determinato ExecutionProvider per scaricare il provider di esecuzione specifico e chiamare TryRegister() per registrare il provider di esecuzione specifico.

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

Esempio di app di produzione

Per le applicazioni di produzione, di seguito è riportato un esempio di ciò che l'app potrebbe voler fare per offrire agli utenti il controllo su quando si verificano i download. È possibile verificare se sono disponibili nuovi provider di esecuzione e scaricarli in modo condizionale:

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