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.
En esta guía se muestra cómo usar las API del catálogo de modelos de Windows ML para administrar modelos de IA en las aplicaciones de Windows. Aprenderá a configurar orígenes de catálogo, encontrar modelos compatibles y descargarlos en una ubicación compartida en el dispositivo para que todas las aplicaciones puedan usarlos.
Prerrequisitos
- Pc Windows que ejecuta una versión de Windows compatible con Windows App SDK
- Una o más fuentes del catálogo de modelos
- Windows App SDK 1.8.3 o posterior en el proyecto compatible
Paso 1: Creación de un origen de catálogo de modelos
Primero debe crear o obtener un origen de catálogo de modelos, que es un índice de modelos, incluida la información sobre cómo acceder al modelo. Consulte los documentos de origen del catálogo de modelos para obtener más información.
El archivo JSON de origen del catálogo de modelos se puede hospedar en línea, hacer referencia a él a través https:// de puntos de conexión o usarse desde un archivo local, al que se hace referencia a través de rutas de acceso de archivo como C:\Users\....
Paso 2: Inicia tu catálogo con tu origen de datos
Inicialice un catálogo con un único origen de catálogo:
using Microsoft.Windows.AI.MachineLearning;
using Windows.Foundation;
using System;
using System.Threading.Tasks;
// Create a catalog source from a URI
var source = await ModelCatalogSource.CreateFromUriAsync(
new Uri("https://contoso.com/models"));
// Create the catalog with the source
var catalog = new ModelCatalog(new ModelCatalogSource[] { source });
También puede configurar varios orígenes de catálogo con diferentes prioridades:
var catalog = new ModelCatalog(new ModelCatalogSource[0]);
// Add sources in order of preference (highest priority first)
catalog.Sources.Add(await ModelCatalogSource.CreateFromUriAsync(
new Uri("https://contoso.com/models")));
catalog.Sources.Add(await ModelCatalogSource.CreateFromUriAsync(
new Uri("https://contoso.com/secondaryModels")));
Paso 3: Buscar un modelo por nombre
Busque un modelo en todos los orígenes configurados:
// Find a model by its name
CatalogModelInfo model = await catalog.FindModelAsync("phi-3.5-reasoning");
if (model != null)
{
Console.WriteLine($"Found model: {model.Name}");
Console.WriteLine($"Version: {model.Version}");
Console.WriteLine($"Publisher: {model.Publisher}");
Console.WriteLine($"Size: {model.ModelSizeInBytes / (1024 * 1024)} MB");
Console.WriteLine($"Supported execution providers: {string.Join(", ", model.ExecutionProviders)}");
}
Paso 4: Descargar y usar un modelo
Obtenga una instancia de modelo y úsela con el marco deseado:
// Get an instance of the model (downloads if necessary)
var progress = new Progress<double>(percent =>
Console.WriteLine($"Download progress: {percent:P}"));
CatalogModelInstanceResult result = await model.GetInstanceAsync().AsTask(progress);
if (result.Status == CatalogModelInstanceStatus.Available)
{
CatalogModelInstance instance = result.GetInstance();
// Get the model path
string modelPath = instance.ModelPaths[0];
Console.WriteLine($"Model path: {modelPath}");
// Inference your model using your own code
}
else
{
Console.WriteLine($"Failed to get model: {result.ExtendedError}");
Console.WriteLine($"Details: {result.DiagnosticText}");
}
Ejemplo completo
Este es un ejemplo completo que lo coloca todo juntos:
using Microsoft.Windows.AI.MachineLearning;
using System;
using System.Threading.Tasks;
try
{
// Create catalog with source
var source = await ModelCatalogSource.CreateFromUriAsync(
new Uri("https://contoso.com/models"));
var catalog = new ModelCatalog(new ModelCatalogSource[] { source });
// Find a model
Console.WriteLine("Searching for model...");
CatalogModelInfo model = await catalog.FindModelAsync("phi-3.5-reasoning");
if (model != null)
{
Console.WriteLine($"Found model: {model.Name}");
Console.WriteLine($"Version: {model.Version}");
Console.WriteLine($"Publisher: {model.Publisher}");
Console.WriteLine($"Size: {model.ModelSizeInBytes / (1024 * 1024)} MB");
Console.WriteLine($"Supported execution providers: {string.Join(", ", model.ExecutionProviders)}");
// Get an instance of the model (downloads if necessary)
var progress = new Progress<double>(percent =>
Console.WriteLine($"Download progress: {percent:P}"));
CatalogModelInstanceResult result = await model.GetInstanceAsync().AsTask(progress);
if (result.Status == CatalogModelInstanceStatus.Available)
{
CatalogModelInstance instance = result.GetInstance();
// Get the model path
string modelPath = instance.ModelPaths[0];
Console.WriteLine($"Model path: {modelPath}");
// Inference your model using your own code
}
else
{
Console.WriteLine($"Failed to get model: {result.ExtendedError}");
Console.WriteLine($"Details: {result.DiagnosticText}");
}
}
else
{
Console.WriteLine("Model not found");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
Filtrado por proveedores de ejecución
Personalice qué proveedores de ejecución se deben tener en cuenta:
public async Task FilterByExecutionProvidersAsync(ModelCatalog catalog)
{
// Only look for CPU-compatible models
catalog.ExecutionProviders.Clear();
catalog.ExecutionProviders.Add("cpuexecutionprovider");
var cpuModels = await catalog.FindAllModelAsync();
Console.WriteLine($"Found {cpuModels.Count} CPU-compatible models");
// Look for DirectML-compatible models
catalog.ExecutionProviders.Clear();
catalog.ExecutionProviders.Add("dmlexecutionprovider");
var dmlModels = await catalog.FindAllModelAsync();
Console.WriteLine($"Found {dmlModels.Count} DirectML-compatible models");
}
Comprobación del estado del modelo
Compruebe si un modelo ya está disponible localmente:
public void CheckModelStatus(ModelCatalog catalog)
{
var availableModels = catalog.GetAvailableModels();
foreach (var model in availableModels)
{
var status = model.GetStatus();
Console.WriteLine($"Model {model.Name}: {status}");
switch (status)
{
case CatalogModelStatus.Ready:
Console.WriteLine(" ✓ Available locally");
break;
case CatalogModelStatus.NotReady:
Console.WriteLine(" ⚠ Needs to be downloaded");
break;
}
}
}
Uso de archivos de catálogo local
Cree un origen de catálogo a partir de un archivo local:
public async Task<ModelCatalog> CreateLocalCatalogAsync()
{
// Load catalog from a local JSON file
var localFile = Path.Combine(Package.Current.EffectivePath, "my-models.json");
var source = await ModelCatalogSource.CreateFromUriAsync(new Uri(localFile));
var catalog = new ModelCatalog(new ModelCatalogSource[] { source });
return catalog;
}
Adición de encabezados personalizados para descargas
Proporcione autenticación o encabezados personalizados para las descargas de modelos:
public async Task DownloadWithCustomHeadersAsync(CatalogModelInfo model)
{
var headers = new Dictionary<string, string>
{
["Authorization"] = "Bearer your-token-here",
["User-Agent"] = "MyApp/1.0"
};
var result = await model.GetInstanceAsync(headers);
// Handle result...
}
Control de errores
Incluya siempre el control de errores adecuado al trabajar con el catálogo de modelos:
public async Task<bool> SafeModelUsageAsync(string modelName)
{
try
{
var source = await ModelCatalogSource.CreateFromUriAsync(
new Uri("https://contoso.com/models"));
var catalog = new ModelCatalog(new ModelCatalogSource[] { source });
var model = await catalog.FindModelAsync(modelName);
if (model == null)
{
Console.WriteLine($"Model '{modelName}' not found");
return false;
}
var result = await model.GetInstanceAsync();
if (result.Status != CatalogModelInstanceStatus.Available)
{
Console.WriteLine($"Failed to get model: {result.ExtendedError}");
if (!string.IsNullOrEmpty(result.DiagnosticText))
{
Console.WriteLine($"Details: {result.DiagnosticText}");
}
return false;
}
using var instance = result.GetInstance();
// Use the model...
return true;
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("Access denied - check permissions");
return false;
}
catch (System.Net.Http.HttpRequestException ex)
{
Console.WriteLine($"Network error: {ex.Message}");
return false;
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
return false;
}
}
procedimientos recomendados
-
Reutilización de instancias de catálogo: Reutiliza instancias
ModelCatalogen tu app - Controlar el progreso de la descarga: Proporcionar retroalimentación al usuario durante la descarga del modelo.
-
Eliminar instancias del modelo: utilice
usinginstrucciones para desechar adecuadamente las instancias del modelo. - Comprobación de la compatibilidad: compruebe que los proveedores de ejecución del modelo coinciden con sus requisitos
- Controlar los errores correctamente: compruebe siempre el estado del resultado antes de usar modelos.
-
Usar nombres de modelo: use
FindModelAsynccon nombres de modelo para la selección automática de la mejor variante del modelo en función de las funcionalidades del dispositivo.
Pasos siguientes
- Más información sobre el esquema de origen del catálogo de modelos
- Introducción a Windows ML