Instalowanie dostawców obsługi Windows ML

W przypadku Windows ML niektórzy dostawcy wykonawczy (EPs) są dynamicznie pobierani, instalowani i współużytkowani w całym systemie za pośrednictwem interfejsów API Windows ML i są automatycznie aktualizowani. Aby zobaczyć, jakie dostawcy wykonania są dostępni, zobacz Dostawcy wykonawcze systemu Windows ML.

Na tej stronie opisano sposób instalowania Windows ML EP na urządzeniu użytkownika przy użyciu katalogu EP. Aby zapoznać się z alternatywnym podejściem pakowania EP bezpośrednio w aplikacji, zobacz Bring your own EPs. Aby wybrać między tymi opcjami, zobacz Windows ML EPs vs. bring-your-own.

Po zainstalowaniu należy zarejestrować EP Windows ML w środowisku uruchomieniowym ONNX przed ich użyciem.

Uwaga / Notatka

Windows EPs uczenia maszynowego są pobierane przez Windows, gdy aplikacja wywołuje EnsureReadyAsync() lub EnsureAndRegisterCertifiedAsync(). W przypadku środowisk offline, z ograniczonym dostępem do sieci, zarządzanych lub ze ściśle przypiętymi wersjami zobacz Własne EP i EP Windows ML a własne EP.

Zainstaluj wszystkie zgodne EPs

Najprostszą opcją jest wywołanie EnsureAndRegisterCertifiedAsync(), które pobiera i instaluje wszystkie EP-y dostępne na urządzeniu użytkownika, a następnie rejestruje je wszystkie w ONNX Runtime w ramach jednego wywołania. Jeśli aplikacja wymaga większej kontroli nad wykrywaniem dostawców, pobieraniem lub rejestracją, zobacz poniżej Znajdź wszystkie zgodne EP i Zainstaluj konkretne EP.

Uwaga / Notatka

Przy pierwszym uruchomieniu ta metoda może potrwać kilka sekund, a nawet minut, w zależności od szybkości sieci i liczby EP-ów, które trzeba pobrać.

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

Znajdź wszystkie zgodne EPs

Aby zobaczyć, które punkty końcowe (w tym nieinstalowane punkty końcowe) są dostępne dla urządzenia użytkownika, wywołaj metodę 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}");
}

Zwróconi dostawcy wykonywania będą się różnić w zależności od urządzenia użytkownika i dostępnych dostawców wykonywania. Na zgodnym urządzeniu Qualcomm bez zainstalowanych obecnie dostawców wykonywania powyższy kod generuje następujące dane wyjściowe...

QNNExecutionProvider: NotPresent

Każdy obiekt ExecutionProvider ma właściwość ReadyState , która wskazuje jego bieżący stan na urządzeniu. Zrozumienie tych stanów pomaga określić, jakie działania należy wykonać w aplikacji.

ReadyState Definicja Dalsze kroki
NotPresent EP nie jest zainstalowany na urządzeniu klienckim. Wywołaj metodę EnsureReadyAsync() , aby pobrać i zainstalować EP i dodać ją do grafu zależności środowiska uruchomieniowego aplikacji.
NotReady Ep jest zainstalowany na urządzeniu klienckim, ale nie został dodany do grafu zależności środowiska uruchomieniowego aplikacji. Wywołaj metodę EnsureReadyAsync() , aby dodać EP do grafu zależności środowiska uruchomieniowego aplikacji.
Ready EP jest zainstalowany na urządzeniu klienckim i został dodany do grafu zależności w czasie działania aplikacji. Wywołaj TryRegister() w celu zarejestrowania EP w środowisku uruchomieniowym ONNX.

Instalowanie określonego EP

Jeśli istnieje określony element ExecutionProvider , którego aplikacja chce użyć, a jej element ReadyState to NotPresent, możesz pobrać i zainstalować go, wywołując polecenie EnsureReadyAsync().

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.

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

Obsługa wyników instalacji

EnsureReadyAsync() zwraca obiekt ExecutionProviderReadyResult. Sprawdź jego Stan przed utworzeniem sesji lub zarejestrowaniem dostawcy. Jeśli stan to Failure, sprawdź ExtendedError (HRESULT) i DiagnosticText, i zobacz Rozwiązywanie problemów z pobieraniem dostawcy wykonywania. Jeśli stan to InProgress, operacja nie została ukończona; przed kontynuowaniem poczekaj na wynik.

Instalacja z postępem

API do pobierania i instalowania EPs obejmują wywołania zwrotne, które zapewniają aktualizacje postępu, dzięki czemu można wyświetlać wskaźniki postępu, aby informować użytkowników.

Zrzut ekranu przedstawiający pasek postępu odzwierciedlający postęp pobierania

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

Dalsze kroki

Po zainstalowaniu dostawców wykonywania, zobacz Rejestrowanie dostawców wykonywania Windows ML, aby dowiedzieć się, jak zarejestrować ich do użycia z środowiskiem uruchomieniowym ONNX.

Przykład aplikacji produkcyjnej

W przypadku aplikacji produkcyjnych oto przykład tego, co aplikacja może zrobić, aby dać sobie i użytkownikom kontrolę nad tym, kiedy nastąpi pobieranie. Przed zarejestrowaniem można 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 == "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();
    }
}

Zobacz także