Installer des fournisseurs d’exécution Windows ML

Avec Windows ML, certains fournisseurs d’exécution sont téléchargés, installés et partagés dynamiquement via les API Windows ML ExecutionProviderCatalog et sont automatiquement mis à jour. Pour voir les fournisseurs d’exécution disponibles, consultez les fournisseurs d’exécution Windows ML.

Cette page explique comment installer des EPS Windows ML sur l’appareil d’un utilisateur à l’aide du catalogue EP. Pour obtenir l’autre approche de regroupement d’EPs directement dans votre application, consultez Bring your own EPs. Pour choisir entre ces options, consultez les différences entre les EP Windows ML et l'apportez-votre-propre.

Une fois installé, vous devez inscrire des EPs Windows ML auprès d’ONNX Runtime avant de les utiliser.

Note

Les EPs Windows ML sont téléchargés par Windows lorsque votre application appelle EnsureReadyAsync() ou EnsureAndRegisterCertifiedAsync(). Pour les environnements hors ligne, à réseau restreint, gérés ou avec épinglage strict des versions, consultez Bring your own EPs et Windows ML EPs vs. bring-your-own.

Installer tous les EPs compatibles

L’option la plus simple consiste à appeler EnsureAndRegisterCertifiedAsync(), qui télécharge et installe tous les EPs disponibles sur l’appareil de votre utilisateur, puis les inscrit auprès du runtime ONNX dans un seul appel. Si votre application a besoin d’un contrôle supplémentaire sur la découverte, les téléchargements ou l’inscription du fournisseur, consultez Rechercher tous les EPs compatibles et installer un EP spécifique ci-dessous.

Note

Lors de la première exécution, cette méthode peut prendre plusieurs secondes ou même minutes en fonction de la vitesse du réseau et des adresses IP qui doivent être téléchargées.

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

Rechercher tous les EPs compatibles

Vous pouvez voir quels EPs (y compris les EPs non installés) sont disponibles pour l’appareil de l’utilisateur en appelant la méthode FindAllProviders().

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

Les fournisseurs d’exécution retournés varient en fonction de l’appareil de l’utilisateur et des fournisseurs d’exécution disponibles. Sur un appareil compatible sans aucun fournisseur d’exécution actuellement installé, le code ci-dessus génère les résultats suivants...

QNNExecutionProvider: NotPresent

Chaque ExecutionProvider a une propriété ReadyState qui indique son état actuel sur l’appareil. Comprendre ces états vous aide à déterminer les actions que votre application doit entreprendre.

ReadyState Definition Prochaines étapes
NotPresent L’EP n’est pas installé sur l’appareil client. Appelez-le EnsureReadyAsync() pour télécharger et installer l’EP et l’ajouter au graphique de dépendance d’exécution de votre application.
NotReady L’EP est installé sur l’appareil client, mais n’a pas été ajouté au graphique de dépendances d’exécution de l’application. Appelez EnsureReadyAsync() pour ajouter l’EP au graphe de dépendance d’exécution de votre application.
Ready L’EP est installé sur l’appareil client et a été ajouté au graphe de dépendances d’exécution de votre application. Appelez TryRegister() pour enregistrer l’EP auprès le runtime ONNX.

Installer un EP spécifique

S’il existe un ExecutionProvider spécifique que votre application souhaite utiliser, et son ReadyState est NotPresent, vous pouvez le télécharger et l’installer en appelant EnsureReadyAsync().

Vous allez d’abord utiliser FindAllProviders() pour obtenir tous les EPs compatibles, puis vous pouvez appeler EnsureReadyAsync() un executionProvider particulier pour télécharger le fournisseur d’exécution spécifique et appeler TryRegister() pour inscrire le fournisseur d’exécution spécifique.

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

Gérer les résultats de l’installation

EnsureReadyAsync() retourne un ExecutionProviderReadyResult. Vérifiez son état avant de créer des sessions ou d’inscrire le fournisseur. Si l’état est Failure, vérifiez ExtendedError (un HRESULT) et DiagnosticText, et consultez Résoudre les problèmes de téléchargement du fournisseur d’exécution. Si l’état est InProgress, l’opération n’est pas terminée ; attendez le résultat avant de continuer.

Installation en cours

Les API pour le téléchargement et l’installation d’EPs incluent des rappels qui fournissent des mises à jour de progression, afin que vous puissiez afficher des indicateurs de progression pour informer vos utilisateurs.

Capture d’écran d’une barre de progression reflétant la progression du téléchargement

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

Prochaines étapes

Maintenant que vous avez installé les fournisseurs d’exécution, consultez Inscrire les fournisseurs d’exécution Windows ML pour apprendre à les inscrire pour une utilisation avec ONNX Runtime.

Exemple d’application de production

Pour les applications de production, voici un exemple de ce que votre application peut vouloir faire pour vous donner à vous-même et à vos utilisateurs le contrôle du moment où les téléchargements se produisent. Vous pouvez vérifier si de nouveaux fournisseurs d’exécution sont disponibles et les télécharger de manière conditionnelle avant d’inscrire :

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

Voir aussi