Windows ML 実行プロバイダーをインストールする

Windows ML では、特定の実行プロバイダー (IP) が Windows ML ExecutionProviderCatalog API を介してシステム全体で動的にダウンロード、インストール、共有され、 自動的に更新されます。 使用可能な IP を確認するには、 Windows ML 実行プロバイダーを参照してください。

このページでは、EP カタログを使用してユーザーのデバイスに Windows ML エンドポイント (EP) をインストールする方法について説明します。 アプリで直接 EP をバンドルする別の方法については、「独自の EP を持ち込む」を参照してください。 これらのオプションから選択するには、Windows ML EP と Bring Your Own の違いを確認してください

インストールしたら、使用する前に 、ONNX ランタイムに Windows ML EP を登録 する必要があります。

Windows ML EP は、アプリが EnsureReadyAsync() または EnsureAndRegisterCertifiedAsync() を呼び出すと、Windows によってダウンロードされます。 オフライン、制限付きネットワーク、マネージド、または厳密なバージョン固定の環境では、「独自の EPs の使用」および「Windows ML EPs と独自提供の比較」を参照してください。

互換性のあるすべての拡張パックをインストールする

最も簡単な方法は、EnsureAndRegisterCertifiedAsync() を呼び出すことです。これにより、ユーザーのデバイスで利用可能なすべての EP がダウンロードおよびインストールされ、その後、それらすべてが 1 回の呼び出しで ONNX Runtime にまとめて登録されます。 アプリでプロバイダーの検出、ダウンロード、または登録をより細かく制御する必要がある場合は、以下の 「互換性のあるすべての IP を検索 し、 特定の EP をインストール する」を参照してください。

最初の実行では、ネットワーク速度とダウンロードする必要がある IP に応じて、このメソッドは数秒または数分かかる場合があります。

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

互換性のあるすべての EP を見つける

FindAllProviders() メソッドを呼び出すと、ユーザーのデバイスで使用できる IP (インストールされていない IP を含む) を確認できます。

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

返される実行プロバイダーは、ユーザーのデバイスと使用可能な実行プロバイダーによって異なります。 現在実行プロバイダーがインストールされていない互換性のある Qualcomm デバイスでは、上記のコードによって次の出力が出力されます。

QNNExecutionProvider: NotPresent

ExecutionProvider には、デバイス上の現在の状態を示す ReadyState プロパティがあります。 これらの状態を理解することは、アプリで実行する必要があるアクションを決定するのに役立ちます。

ReadyState Definition 次のステップ
NotPresent EP はクライアント デバイスにインストールされていません。 EnsureReadyAsync()を呼び出して EP をダウンロードしてインストールし、アプリのランタイム依存関係グラフに追加します。
NotReady EP はクライアント デバイスにインストールされますが、アプリのランタイム依存関係グラフには追加されていません。 EnsureReadyAsync()を呼び出して、EP をアプリのランタイム依存関係グラフに追加します。
Ready EP はクライアント デバイスにインストールされ、アプリのランタイム依存関係グラフに追加されています。 TryRegister() を呼び出して、EP を ONNX Runtime に登録します。

特定の EP をインストールする

アプリで使用する特定の ExecutionProvider があり、その ReadyStateNotPresent場合は、 EnsureReadyAsync()を呼び出してダウンロードしてインストールできます。

最初に、FindAllProviders()を使用して互換性のあるすべての IP を取得します。その後、特定の EnsureReadyAsync()を呼び出して特定の実行プロバイダーをダウンロードし、TryRegister()を呼び出して特定の実行プロバイダーを登録します。

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

インストール結果の処理

EnsureReadyAsync()ExecutionProviderReadyResult を返します。 セッションを作成するか、プロバイダーを登録する前に 、その状態 を確認します。 状態が Failureの場合は、 ExtendedError (HRESULT) と DiagnosticTextを確認し、「 実行プロバイダーのダウンロードに関する問題のトラブルシューティング」を参照してください。 状態が InProgressの場合、操作は完了していません。続行する前に結果を待ちます。

インストール進行中

AP をダウンロードしてインストールするための API には、進行状況の更新プログラムを提供するコールバックが含まれているため、進行状況インジケーターを表示してユーザーに通知することができます。

ダウンロードの進行状況を反映する進行状況バーのスクリーンショット

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

次のステップ

実行プロバイダーをインストールしたので、「 Windows ML の IP を登録 する」を参照して、ONNX Runtime で使用するためにそれらを登録する方法について説明します。

運用アプリの例

実稼働アプリケーションの場合、ダウンロードがいつ行われるかを自分とユーザーが制御できるように、アプリが実行する可能性のある操作の例を次に示します。 登録する前に、新しい実行プロバイダーが使用可能かどうかを確認し、条件付きでダウンロードできます。

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

こちらも参照ください