共用方式為


使用 Windows ML 初始化執行提供者

本頁討論您的應用程式可以使用 Windows ML 正常處理下載和註冊執行提供者 (EP) 的更進階方式。 即使裝置上已下載 EP,您也必須在每次應用程式執行時註冊 EP,才能顯示在 ONNX 執行階段中。

一次下載並註冊

在初期開發時,簡單地呼叫 EnsureAndRegisterCertifiedAsync(),這樣就能確保有與你裝置相容的 EP 存在(如果沒有的話會下載這些 EP),然後它會將所有現有的 EP 註冊到 ONNX 執行時。 請注意,首次運行時,此方法可能需要幾秒鐘甚至幾分鐘的時間,具體取決於您的網路速度和需要下載的 EP。

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

小提示

在生產應用程式中,將呼叫包裝 EnsureAndRegisterCertifiedAsync() 在 try-catch 區塊中,以正常處理潛在的網路或下載失敗。

僅註冊現有提供者

如果您想要避免下載,而只註冊電腦上已有的執行提供者:

var catalog = ExecutionProviderCatalog.GetDefault();

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

發現是否有 EP(無需下載)

如果你想查看是否有不在裝置上但與你的裝置和驅動程式相容的 EP,且又不想開始下載,可以使用這個 FindAllProviders() 方法,來檢查是否有供應商的 ReadyState 狀態為 NotPresent。 你可以隨意決定如何處理(例如啟動使用者進入「安裝畫面」、詢問是否要安裝等)。 如果你暫時不想讓用戶等待,可以選擇繼續使用已下載的 EP(如上所示執行 RegisterCertifiedAsync())。

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

下載並註冊特定 EP

如果您的應用程式想要使用特定執行提供者,您可以下載並註冊特定執行提供者,而無需下載所有相容的 EP。

您將先使用 FindAllProviders() 來取得所有相容的執行提供者,然後您可以呼叫EnsureReadyAsync()以針對特定的ExecutionProvider下載該執行提供者,並且呼叫 TryRegister()來註冊該特定的執行提供者。

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

生產應用程式範例

針對生產應用程式,以下是應用程式可能想要執行的動作範例,讓您自己和使用者使用者控制下載的時間。 您可以檢查是否有新的執行提供者可用,並有條件地下載它們:

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

另請參閱