Compartir a través de


Inicialización de proveedores de ejecución con Windows ML

En esta página se describen formas más avanzadas de que la aplicación puede controlar correctamente la descarga y el registro de proveedores de ejecución (EPs) mediante Windows ML. Incluso si ya se ha descargado un EP en el dispositivo, debes registrar los EPs cada vez que se ejecute la aplicación para que aparezcan en ONNX Runtime.

Descarga y registro en una llamada

Para el desarrollo inicial, puede ser agradable llamar EnsureAndRegisterCertifiedAsync()simplemente a , que descargará cualquier EPs (o nuevas versiones de EPs) que sean compatibles con el dispositivo y los controladores si aún no están descargados y, a continuación, registrar todos los EPs. Tenga en cuenta que, en la primera ejecución, este método puede tardar varios segundos o incluso minutos en función de la velocidad de red y los EPs que deban descargarse.

// Get the default ExecutionProviderCatalog
var catalog = ExecutionProviderCatalog.GetDefault();

// Ensure and register all compatible execution providers with ONNX Runtime
// This downloads any necessary components and registers them
await catalog.EnsureAndRegisterCertifiedAsync();

Sugerencia

En las aplicaciones de producción, encapsula la EnsureAndRegisterCertifiedAsync() llamada en un bloque try-catch para controlar posibles errores de red o descarga correctamente.

Registrar solo proveedores existentes

Si desea evitar la descarga y solo registrar proveedores de ejecución que ya están presentes en el equipo:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Detectar si hay nuevos EPs (sin descargar)

Si quiere ver si hay nuevos EPs compatibles con el dispositivo y los controladores disponibles para descargar, pero no desea iniciar la descarga, puede usar el FindAllProviders() método y, a continuación, ver si algún proveedor tiene un ReadyState de NotPresent. Después, puede decidir controlar esto, pero le gustaría (iniciar a los usuarios en una "pantalla de actualización", preguntándoles si quieren actualizar, etc.). Puede optar por seguir usando los EPs ya descargados (llamando RegisterCertifiedAsync() a como se muestra anteriormente) si no desea que los usuarios esperen ahora mismo.

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

Descarga y registro de un EP específico

Si hay un proveedor de ejecución específico que la aplicación quiere usar, puede descargar y registrar un proveedor de ejecución determinado sin descargar todos los EPs compatibles.

En primer lugar, usará FindAllProviders() para obtener todos los EPs compatibles y, a continuación, puede llamar a EnsureReadyAsync() en un ExecutionProvider determinado para descargar el proveedor de ejecución específico y llamar a TryRegister() para registrar el proveedor de ejecución específico.

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

Ejemplo de aplicación de producción

En el caso de las aplicaciones de producción, este es un ejemplo de lo que la aplicación podría querer hacer para proporcionarse a sí mismo y a los usuarios controlar cuándo se producen descargas. Puede comprobar si hay nuevos proveedores de ejecución disponibles y descargarlos condicionalmente:

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