Condividi tramite


Installare fornitori di esecuzione con Windows ML

Con Windows ML, alcuni provider di esecuzione (EP) vengono scaricati, installati e condivisi in modo dinamico a livello di sistema tramite le API di Windows ML ExecutionProviderCatalog e vengono aggiornati automaticamente. Per informazioni sui provider di esecuzione disponibili, vedere Provider di esecuzione supportati.

Questa pagina illustra come installare gli EP su un dispositivo dell'utente. Dopo l'installazione, è necessario registrare i provider di esecuzione con ONNX Runtime prima di usarli.

Installare tutti gli EPS compatibili

Per lo sviluppo iniziale, risulta utile semplicemente chiamare EnsureAndRegisterCertifiedAsync(), che scaricherà e installerà tutti gli EP disponibili per il dispositivo dell'utente e quindi registra tutti gli EP con il runtime ONNX in una singola chiamata. 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 execution providers compatible with device are present (downloads if necessary)
// and then registers all present execution providers with ONNX Runtime
await catalog.EnsureAndRegisterCertifiedAsync();

Trova tutti gli EPs compatibili

È possibile visualizzare gli EPS (inclusi gli EPS non installati) disponibili per il dispositivo dell'utente chiamando il FindAllProviders() metodo .

ExecutionProviderCatalog catalog = ExecutionProviderCatalog.GetDefault();

// Find all available EPs (including non-installed EPs)
ExecutionProvider[] providers = catalog.FindAllProviders();

foreach (var provider in providers)
{
    Console.WriteLine($"{provider.Name}: {provider.ReadyState}");
}

I provider di esecuzione restituiti variano in base al dispositivo dell'utente e ai provider di esecuzione disponibili. In un dispositivo Qualcomm compatibile senza provider di esecuzione attualmente installati, il codice precedente restituisce quanto segue...

QNNExecutionProvider: NotPresent

Ogni ExecutionProvider ha una proprietà ReadyState che indica lo stato corrente nel dispositivo. Comprendere questi stati consente di determinare quali azioni devono essere eseguite dall'app.

ReadyState Definizione Passaggi successivi
NotPresent L'EP non è installato nel dispositivo client. Chiamare EnsureReadyAsync() per scaricare e installare l'EP e aggiungerlo al grafico delle dipendenze di runtime dell'app.
NotReady L'EP è installato nel dispositivo client, ma non è stato aggiunto al grafico delle dipendenze di runtime dell'app. Chiamare EnsureReadyAsync() per aggiungere l'EP al grafico delle dipendenze di runtime dell'app.
Ready Il modulo EP viene installato nel dispositivo client ed è stato aggiunto al grafico delle dipendenze di runtime dell'applicazione. Chiamare TryRegister() per registrare l'EP con ONNX Runtime.

Installare un EP specifico

Se è presente un executionProvider specifico che l'app vuole usare e il relativo ReadyState è NotPresent, è possibile scaricarlo e installarlo chiamando EnsureReadyAsync().

// Download and install a NotPresent EP
var result = await provider.EnsureReadyAsync();

// Check that the download and install was successful
bool installed = result.Status == ExecutionProviderReadyResultState.Success;

Installazione con stato di avanzamento

Le API per scaricare e installare gli EP includono callback che forniscono aggiornamenti sullo stato del progresso, in modo da poter visualizzare indicatori di avanzamento per mantenere gli utenti informati.

Screenshot di una barra di avanzamento che mostra il progresso del download

// Start the download and install of a NotPresent EP
var operation = provider.EnsureReadyAsync();

// Listen to progress callback
operation.Progress = (asyncInfo, progressInfo) =>
{
    // Dispatch to UI thread (varies based on UI platform)
    _dispatcherQueue.TryEnqueue(() =>
    {
        // progressInfo is out of 100, convert to 0-1 range
        double normalizedProgress = progressInfo / 100.0;

        // Display the progress to the user
        Progress = normalizedProgress;
    };
};

// Await for the download and install to complete
var result = await operation;

// Check that the download and install was successful
bool installed = result.Status == ExecutionProviderReadyResultState.Success;

Passaggi successivi

Dopo aver installato i provider di esecuzione, vedere Registrare i provider di esecuzione per informazioni su come registrarli per l'utilizzo con ONNX Runtime.

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 a se stessi e agli utenti il controllo su quando si verificano i download. È possibile verificare se i nuovi provider di esecuzione sono disponibili e scaricarli in modo condizionale prima della registrazione:

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

Vedere anche