Udostępnij przez


Inicjowanie dostawców wykonywania za pomocą uczenia maszynowego z systemem Windows

Na tej stronie omówiono bardziej zaawansowane sposoby, w jaki aplikacja może bezpiecznie obsługiwać pobieranie i rejestrowanie dostawców wykonywania (EPS) przy użyciu usługi Windows ML. Nawet jeśli ep został już pobrany na urządzeniu, musisz zarejestrować adresy E-mail za każdym razem, gdy aplikacja działa, aby były wyświetlane w środowisku uruchomieniowym ONNX.

Pobieranie i rejestrowanie w jednym wywołaniu

W przypadku początkowego programowania można po prostu wywołać metodę EnsureAndRegisterCertifiedAsync(), która pobierze wszelkie nowe adresy e-mail (lub nowe wersje adresów e-mail), które są zgodne z urządzeniem i sterownikami, jeśli nie zostały jeszcze pobrane, a następnie zarejestruje wszystkich adresów e-mail. Należy pamiętać, że w pierwszym uruchomieniu ta metoda może potrwać wiele sekund, a nawet minut w zależności od szybkości sieci i adresów EPS, które należy pobrać.

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

Wskazówka

W aplikacjach produkcyjnych zawijanie EnsureAndRegisterCertifiedAsync() wywołania w bloku try-catch w celu bezproblemowego obsługi potencjalnych błędów sieci lub pobierania.

Zarejestruj istniejących dostawców tylko

Jeśli chcesz uniknąć pobierania i rejestrować tylko dostawców wykonywania, którzy są już obecni na maszynie:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Sprawdź, czy istnieją nowe adresy e-mail (bez pobierania)

Jeśli chcesz sprawdzić, czy istnieją nowe adresy e-mail zgodne z urządzeniem i sterownikami dostępnymi do pobrania, ale nie chcesz uruchamiać pobierania, możesz użyć FindAllProviders() metody , a następnie sprawdzić, czy dostawcy mają wartość ReadyStateof NotPresent. Następnie możesz zdecydować się na obsługę tego rozwiązania, jednak chcesz (uruchomienie użytkowników w obszarze "Aktualizowanie ekranu" z pytaniem o to, czy chcą zaktualizować itp.). Jeśli nie chcesz teraz czekać na użytkowników, możesz nadal korzystać z już pobranych adresów e-mail (przez wywołanie RegisterCertifiedAsync() metody , jak pokazano powyżej).

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

Pobieranie i rejestrowanie określonego EP

Jeśli Twoja aplikacja chce użyć konkretnego dostawcy usług wykonawczych, możesz pobrać i zarejestrować określonego dostawcę bez konieczności pobierania wszystkich kompatybilnych dostawców usług.

Najpierw użyjesz FindAllProviders() do uzyskania wszystkich zgodnych providerów wykonania, a następnie możesz wywołać EnsureReadyAsync() na określonym ExecutionProvider w celu pobrania konkretnego providera wykonania i wywołać TryRegister() w celu zarejestrowania konkretnego providera wykonania.

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

Przykład aplikacji produkcyjnej

W przypadku aplikacji produkcyjnych oto przykład tego, co aplikacja może robić, aby dać sobie i użytkownikom kontrolę nad tym, kiedy wystąpią pliki do pobrania. Możesz sprawdzić, czy są dostępni nowi dostawcy wykonywania i warunkowo je pobrać:

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