Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
// 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();
}
}