Поделиться через


Установка поставщиков выполнения с помощью Windows ML

При использовании Windows ML некоторые поставщики выполнения динамически загружаются, устанавливаются и распределяются по всей системе через Windows ML ExecutionProviderCatalog API, и обновляются автоматически. Сведения о доступных провайдерах выполнения см. в разделе Поддерживаемые провайдеры выполнения.

На этой странице описывается установка EPS на устройство пользователя. После установки необходимо зарегистрировать поставщиков выполнения в onNX Runtime перед их использованием.

Установка всех совместимых EPs

Для первоначальной разработки можно просто вызвать EnsureAndRegisterCertifiedAsync(), который загрузит и установит все доступные на устройстве пользователя модули EP, а затем зарегистрирует все модули 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();

Поиск всех совместимых EPs

Вы можете увидеть, какие EP (включая неустановленные EP) доступны устройству пользователя, вызвав метод 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}");
}

Возвращаемые поставщики выполнения зависят от устройства пользователя и доступных поставщиков выполнения. На совместимом устройстве Qualcomm без установленных поставщиков выполнения приведенный выше код выводит следующий код...

QNNExecutionProvider: NotPresent

Каждый ExecutionProvider имеет свойство ReadyState , указывающее его текущее состояние на устройстве. Понимание этих состояний помогает определить, какие действия необходимо предпринять приложению.

ReadyState Определение Дальнейшие шаги
NotPresent EP не установлен на клиентском устройстве. Вызов EnsureReadyAsync() для скачивания и установки EP и добавления его в граф зависимостей среды выполнения приложения.
NotReady EP устанавливается на клиентском устройстве, но не добавлен в граф зависимостей среды выполнения приложения. Вызовите EnsureReadyAsync(), чтобы добавить EP в граф зависимостей времени выполнения вашего приложения.
Ready EP устанавливается на клиентском устройстве и добавлен в граф зависимостей среды выполнения приложения. Вызовите TryRegister(), чтобы зарегистрировать EP в ONNX Runtime.

Установка определенного EP

Если в вашем приложении есть конкретный ExecutionProvider, и его ReadyStateNotPresent, вы можете скачать и установить его, вызвав EnsureReadyAsync().

Сначала вы будете использовать FindAllProviders() для получения всех совместимых EPs, а затем можно вызвать 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;

Установка с отображением прогресса

API-интерфейсы для скачивания и установки EPs включают обратные вызовы, которые предоставляют обновления хода выполнения. Это позволяет отображать индикаторы прогресса и информировать пользователей.

Снимок экрана полосы прогресса, показывающей ход загрузки

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

См. также