Partager via


Initialiser des fournisseurs d’exécution avec Windows ML

Cette page décrit les méthodes plus avancées de votre application pour gérer correctement le téléchargement et l’inscription de fournisseurs d’exécution à l’aide de Windows ML. Même si un EP est déjà téléchargé sur l’appareil, vous devez inscrire les EPs chaque fois que votre application s’exécute afin qu’elles apparaissent dans ONNX Runtime.

Télécharger et inscrire dans un appel

Pour le développement initial, il peut être agréable d’appeler EnsureAndRegisterCertifiedAsync()simplement, qui télécharge les nouveaux EPs (ou nouvelles versions d’EPs) compatibles avec votre appareil et pilotes s’ils ne sont pas déjà téléchargés, puis inscrivent tous les EPS. Notez que lors de la première exécution, cette méthode peut prendre plusieurs secondes ou même minutes en fonction de la vitesse de votre réseau et des adresses IP qui doivent être téléchargées.

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

Conseil / Astuce

Dans les applications de production, habillage de l’appel EnsureAndRegisterCertifiedAsync() dans un bloc try-catch pour gérer les échecs potentiels de réseau ou de téléchargement correctement.

Inscrire des fournisseurs existants uniquement

Si vous souhaitez éviter de télécharger et d’inscrire uniquement des fournisseurs d’exécution déjà présents sur l’ordinateur :

var catalog = ExecutionProviderCatalog.GetDefault();

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

Découvrez s’il existe de nouveaux EPs (sans téléchargement)

Si vous souhaitez voir s’il existe de nouveaux EPs compatibles avec votre appareil et les pilotes disponibles pour le téléchargement, mais que vous ne souhaitez pas démarrer le téléchargement, vous pouvez utiliser la FindAllProviders() méthode, puis voir si les fournisseurs ont un ReadyState de NotPresent. Vous pouvez ensuite décider de gérer cela, mais vous le souhaitez (lancer vos utilisateurs dans un « écran de mise à jour », en leur demandant s’ils veulent mettre à jour, etc.). Vous pouvez choisir de continuer à utiliser les adresses IP déjà téléchargées (en appelant RegisterCertifiedAsync() comme indiqué ci-dessus) si vous ne souhaitez pas que vos utilisateurs attendent maintenant.

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

Télécharger et inscrire un EP spécifique

S’il existe un fournisseur d’exécution spécifique que votre application souhaite utiliser, vous pouvez télécharger et inscrire un fournisseur d’exécution particulier sans télécharger tous les EPs compatibles.

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.

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

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 :

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