Sdílet prostřednictvím


Inicializace zprostředkovatelů spouštění pomocí Windows ML

Tato stránka popisuje pokročilejší způsoby, jak vaše aplikace může elegantně zvládnout stahování a registraci poskytovatelů spouštění (EPS) pomocí Windows ML. I když je ep na zařízení už stažený, musíte zaregistrovat EPS při každém spuštění vaší aplikace, aby se zobrazily v modulu runtime ONNX.

Stažení a registrace v jednom hovoru

Pro počáteční vývoj může být užitečné jednoduše zavolat EnsureAndRegisterCertifiedAsync(), což zajistí, že jsou k dispozici EPs kompatibilní s vaším zařízením (a stáhne EPs, pokud nejsou přítomné), a pak zaregistruje všechny přítomné EPs v modulu runtime ONNX. Všimněte si, že při prvním spuštění může tato metoda trvat několik sekund nebo dokonce minut v závislosti na rychlosti sítě a e-mailech, které je potřeba stáhnout.

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

Návod

V produkčníchaplikacích EnsureAndRegisterCertifiedAsync()

Registrace pouze existujících poskytovatelů

Pokud se chcete vyhnout stahování a registraci pouze poskytovatelů spouštění, kteří jsou již na počítači:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Zjistěte, jestli existují epizody (bez stahování)

Pokud chcete zjistit, zda nejsou k dispozici koncové body kompatibilní s vaším zařízením a ovladači, ale nechcete spustit stahování, můžete použít metodu FindAllProviders() a zjistit, jestli mají všichni poskytovatelé ReadyState hodnotu NotPresent. Pak se můžete rozhodnout, jak chcete postupovat (například zobrazit uživatelům obrazovku instalace, zeptat se jich, zda chtějí instalovat, atp.). Pokud nechcete, aby vaši uživatelé právě teď čekali, můžete dál používat všechny již stažené EPS (voláním RegisterCertifiedAsync() , jak je znázorněno výše).

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

Stažení a registrace konkrétního EP

Pokud je konkrétní poskytovatel spouštění, kterého vaše aplikace chce použít, můžete stáhnout a zaregistrovat konkrétního poskytovatele spouštění bez stažení všech kompatibilních EPS.

Nejprve použijete FindAllProviders() k získání všech kompatibilních EP, poté můžete použít EnsureReadyAsync() na konkrétního Poskytovatele spuštění ke stažení specifického poskytovatele spuštění, a použít TryRegister() k registraci specifického poskytovatele spuštění.

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

Příklad produkční aplikace

Tady je příklad toho, co vaše aplikace může chtít udělat pro produkční aplikace a uživatele, kteří mají kontrolu nad tím, kdy se stahují. Můžete zkontrolovat, jestli jsou k dispozici noví poskytovatelé spouštění, a podmíněně je stáhnout:

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

Viz také