次の方法で共有


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

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

このページでは、ユーザーのデバイスに EP をインストールする方法について説明します。 インストールが完了したら、 実行プロバイダー を使用する前に ONNX Runtime に登録する必要があります。

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

初期開発では、 EnsureAndRegisterCertifiedAsync()を呼び出すだけで、ユーザーのデバイスで使用できるすべての IP をダウンロードしてインストールし、1 回の呼び出しですべての EP を ONNX ランタイムに登録することができます。 初回実行時には、ダウンロードする必要があるネットワーク速度と 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()を呼び出してダウンロードしてインストールできます。

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

インストール進行中

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;

次のステップ

実行プロバイダーをインストールしたので、「 実行プロバイダーの登録 」を参照して、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();
    }
}

こちらも参照ください