Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Con Windows ML, algunos proveedores de ejecución (EPs) se descargan, instalan y comparten dinámicamente en todo el sistema a través de las API de Windows ML ExecutionProviderCatalog y se actualizan automáticamente. Para ver qué EP están disponibles, consulte Proveedores de ejecución admitidos.
En esta página se explica cómo instalar direcciones IP en el dispositivo de un usuario. Una vez instalado, deberá registrar proveedores de ejecución con ONNX Runtime antes de usarlos.
Instalación de todas las direcciones IP compatibles
Para el desarrollo inicial, es conveniente simplemente llamar a EnsureAndRegisterCertifiedAsync(), lo que descargará e instalará todos los EPs disponibles en el dispositivo del usuario y luego registrará todos los EPs con el ONNX Runtime en una sola llamada. 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 execution providers compatible with device are present (downloads if necessary)
// and then registers all present execution providers with ONNX Runtime
await catalog.EnsureAndRegisterCertifiedAsync();
Buscar todos los EP compatibles
Puede ver qué EPs (incluidos los EPs no instalados) están disponibles para el dispositivo del usuario llamando al método 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}");
}
Los proveedores de ejecución devueltos variarán en función del dispositivo del usuario y de los proveedores de ejecución disponibles. En un dispositivo Qualcomm compatible sin ningún proveedor de ejecución instalado actualmente, el código anterior genera lo siguiente...
QNNExecutionProvider: NotPresent
Cada ExecutionProvider tiene una propiedad ReadyState que indica su estado actual en el dispositivo. Comprender estos estados le ayuda a determinar qué acciones debe realizar la aplicación.
| ReadyState | Definición | Pasos siguientes |
|---|---|---|
NotPresent |
El EP no está instalado en el dispositivo cliente. | Ejecute EnsureReadyAsync() para descargar e instalar el EP y agréguelo al gráfico de dependencias en tiempo de ejecución de la aplicación. |
NotReady |
El EP se instala en el dispositivo cliente, pero no se ha agregado al gráfico de dependencias en tiempo de ejecución de la aplicación. | Llame EnsureReadyAsync() para agregar el EP al gráfico de dependencias en tiempo de ejecución de su aplicación. |
Ready |
El EP se instala en el dispositivo cliente y se ha agregado al gráfico de dependencias en tiempo de ejecución de la aplicación. | Llame TryRegister() para registrar el EP con ONNX Runtime. |
Instalación de un EP específico
Si hay un executionProvider específico que la aplicación quiere usar y su ReadyState es NotPresent, puede descargarlo e instalarlo llamando a 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;
Instalando con progreso
Las API para descargar e instalar EPs incluyen devoluciones de llamada que proporcionan actualizaciones de progreso, para que puedas mostrar indicadores de progreso y mantener informados a los usuarios.
// 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;
Pasos siguientes
Ahora que ha instalado proveedores de ejecución, consulte Registro de proveedores de ejecución para obtener información sobre cómo registrarlos para su uso con ONNX Runtime.
Ejemplo de aplicación de producción
En el caso de las aplicaciones de producción, este es un ejemplo de lo que tu aplicación podría querer hacer para darles a ti y a tus usuarios control sobre cuándo ocurren las descargas. Puede comprobar si hay nuevos proveedores de ejecución disponibles y descargarlos condicionalmente antes de registrarse:
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();
}
}