Compilar modelos de Hugging Face y ejecutarlos en Foundry Local

Foundry Local ejecuta modelos ONNX en el dispositivo. Use Olive para convertir y optimizar modelos de Hugging Face (Safetensors o PyTorch) en ONNX para que pueda ejecutarlos con Foundry Local.

Importante

La CLI de Olive y la configuración de optimización cambian con el tiempo y es posible que un único ejemplo de línea de comandos no funcione para cada modelo, dispositivo o proveedor de ejecución.

Para los ejemplos más confiables y actualizados, empieza con el repositorio Olive Recipes. Proporciona un conjunto de recetas dirigidas para varios modelos, optimizados para diferentes hardware con diferentes configuraciones de optimización.

En esta guía se muestra cómo:

  • Convierta y optimice los modelos de Hugging Face para que se ejecuten en Foundry Local. Los ejemplos usan el Llama-3.2-1B-Instruct modelo, pero muchos modelos de Hugging Face pueden funcionar.
  • Ejecute los modelos optimizados con Foundry Local.

Requisitos previos

  • Python 3.10 o posterior (necesario para la compilación olive)
  • Una cuenta y un token de Hugging Face con acceso a meta-llama/Llama-3.2-1B-Instruct

Instalación de Olive y dependencias

Olive optimiza los modelos y los convierte en el formato ONNX.

pip install olive-ai
pip install transformers onnxruntime-genai

Sugerencia

Instale Olive en un entorno virtual mediante venv o conda.

Compruebe la instalación: olive --help imprime la información de uso.

Iniciar sesión en Hugging Face

El Llama-3.2-1B-Instruct modelo requiere la autenticación de Hugging Face.

hf auth login

Sugerencia

Si hf no se encuentra, instálelo ejecutando pip install -U huggingface_hub.

Compilación del modelo

En esta sección se explica una compilación manual. El comando Olive optimize puede descargar, convertir, cuantificar y optimizar el modelo.

Nota

El siguiente script es un ejemplo manual que podría requerir ajustes para diferentes modelos o destinos de hardware.

  1. Ejecute el comando Olive optimize :

    olive optimize \
        --model_name_or_path meta-llama/Llama-3.2-1B-Instruct \
        --trust_remote_code \
        --output_path models/llama \
        --device cpu \
        --provider CPUExecutionProvider \
        --precision int4 \
        --log_level 1
    

    El comando usa los parámetros siguientes:

    Parámetro Descripción
    model_name_or_path Origen del modelo: Hugging Face ID, local path o Azure AI Model Registry ID
    output_path Dónde guardar el modelo optimizado
    device Hardware de destino: cpu, gpuo npu
    provider Proveedor de ejecución (por ejemplo, CPUExecutionProvider, CUDAExecutionProvider)
    precision Precisión del modelo: fp16, fp32, int4o int8

    Sugerencia

    Si tiene una copia local del modelo, use una ruta local en lugar del Hugging Face ID. Por ejemplo, --model_name_or_path models/llama-3.2-1B-Instruct. Olive controla automáticamente la conversión, optimización y cuantificación.

    Nota

    El proceso de compilación tarda aproximadamente 60 segundos, más el tiempo de descarga.

  2. Exponga el modelo a Foundry Local mediante la creación inference_model.json de un archivo en el directorio del modelo.

    # generate_inference_model.py
    import json
    import os
    
    model_path = "models/llama"
    
    json_template = {
      "Name": "llama-3.2:1"  # set the model name as you like, the default version is 1
    }
    
    json_file = os.path.join(model_path, "inference_model.json")
    
    with open(json_file, "w") as f:
        json.dump(json_template, f, indent=2)
    

    Ejecute el script:

    python generate_inference_model.py
    

    Compruebe que el archivo existe: models/llama/inference_model.json.

Ejecución del modelo compilado

Use el SDK de C# local de Foundry para cargar y ejecutar el modelo compilado con la API de finalizaciones de chat nativas. Este enfoque no requiere un servidor REST: el SDK se comunica directamente con el entorno de ejecución.

Requisitos previos

Instalación de paquetes

Si está desarrollando o distribuyendo en Windows, seleccione la pestaña Windows. El paquete de Windows se integra con el entorno de ejecución Windows ML y proporciona la misma superficie del API con una mayor amplitud de aceleración de hardware.

dotnet add package Microsoft.AI.Foundry.Local.WinML
dotnet add package OpenAI

Los ejemplos de C# del repositorio de GitHub son proyectos preconfigurados. Si va a compilar desde cero, debe leer la referencia del SDK local de Foundry para obtener más detalles sobre cómo configurar el proyecto de C# con Foundry Local.

Ejecución de la inferencia en el modelo compilado

Reemplace el contenido de Program.cs por el código siguiente:

using Microsoft.AI.Foundry.Local;
using Betalgo.Ranul.OpenAI.ObjectModels.RequestModels;
using Microsoft.Extensions.Logging;

CancellationToken ct = CancellationToken.None;

// Point ModelCacheDir at the directory containing your compiled model
var config = new Configuration
{
    AppName = "run-compiled-model",
    LogLevel = Microsoft.AI.Foundry.Local.LogLevel.Information,
    ModelCacheDir = "../models"
};

using var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Information);
});
var logger = loggerFactory.CreateLogger<Program>();

await FoundryLocalManager.CreateAsync(config, logger);
var mgr = FoundryLocalManager.Instance;

var catalog = await mgr.GetCatalogAsync();

// List cached models to find your compiled model
var cachedModels = await catalog.GetCachedModelsAsync();
Console.WriteLine("Cached models:");
foreach (var m in cachedModels)
{
    Console.WriteLine($"  {m.Id}");
}

// Select your compiled model from the cached list
var model = cachedModels.FirstOrDefault(m => m.Id.Contains("llama-3.2:1"))
    ?? throw new Exception("Compiled model not found. Verify the ModelCacheDir path.");

await model.LoadAsync();

// Use native chat completions
var chatClient = await model.GetChatClientAsync();

List<ChatMessage> messages = new()
{
    new ChatMessage { Role = "user", Content = "What is the golden ratio?" }
};

var streamingResponse = chatClient.CompleteChatStreamingAsync(messages, ct);
await foreach (var chunk in streamingResponse)
{
    Console.Write(chunk.Choices[0].Delta.Content);
    Console.Out.Flush();
}
Console.WriteLine();

await model.UnloadAsync();

Ejecute la aplicación:

dotnet run

Use el SDK de JavaScript local de Foundry para cargar y ejecutar el modelo compilado con la API de finalizaciones de chat nativas.

Requisitos previos

Instalación de paquetes

Si está desarrollando o distribuyendo en Windows, seleccione la pestaña Windows. El paquete de Windows se integra con el entorno de ejecución Windows ML y proporciona la misma superficie del API con una mayor amplitud de aceleración de hardware.

npm install foundry-local-sdk-winml openai

Ejecución de la inferencia en el modelo compilado

Copie y pegue el código siguiente en un archivo javaScript denominado app.js:

import { FoundryLocalManager } from 'foundry-local-sdk';

// Initialize the Foundry Local SDK with custom model cache directory
const manager = FoundryLocalManager.create({
    appName: 'run-compiled-model',
    logLevel: 'info',
    modelCacheDir: '../models'
});

// List cached models to find your compiled model
const cachedModels = await manager.catalog.getCachedModels();
console.log('Cached models:');
for (const m of cachedModels) {
    console.log(`  ${m.id}`);
}

// Select your compiled model from the cached list
const model = cachedModels.find(m => m.id.includes('llama-3.2:1'));
if (!model) {
    throw new Error('Compiled model not found. Verify the modelCacheDir path.');
}

// Load the model
await model.load();

// Create a chat client
const chatClient = model.createChatClient();

// Generate a response
const completion = await chatClient.completeChat([
    { role: 'user', content: 'What is the golden ratio?' }
]);

console.log(completion.choices[0]?.message?.content);

// Unload the model
await model.unload();

Ejecute la aplicación:

node app.js

Utiliza el SDK de Python Local de Foundry para cargar y ejecutar tu modelo compilado con la API nativa de finalizaciones de chat.

Requisitos previos

Instalación de paquetes

Si está desarrollando o distribuyendo en Windows, seleccione la pestaña Windows. El paquete de Windows se integra con el entorno de ejecución Windows ML y proporciona la misma superficie del API con una mayor amplitud de aceleración de hardware.

pip install foundry-local-sdk-winml openai

Ejecución de la inferencia en el modelo compilado

Copie y pegue el código siguiente en un archivo de Python denominado app.py:

import asyncio
from foundry_local_sdk import Configuration, FoundryLocalManager


async def main():
    # Point model_cache_dir at the directory containing your compiled model
    config = Configuration(
        app_name="run-compiled-model",
        model_cache_dir="../models",
    )
    FoundryLocalManager.initialize(config)
    manager = FoundryLocalManager.instance

    # List cached models to find your compiled model
    cached_models = manager.catalog.get_cached_models()
    print("Cached models:")
    for m in cached_models:
        print(f"  {m.id}")

    # Select your compiled model from the cached list
    model = next((m for m in cached_models if "llama-3.2:1" in m.id), None)
    if model is None:
        raise Exception("Compiled model not found. Verify the model_cache_dir path.")

    # Load the model
    model.load()

    # Get a chat client
    client = model.get_chat_client()

    # Stream the response
    messages = [{"role": "user", "content": "What is the golden ratio?"}]
    for chunk in client.complete_streaming_chat(messages):
        content = chunk.choices[0].delta.content
        if content:
            print(content, end="", flush=True)
    print()

    # Tidy up - unload the model
    model.unload()


if __name__ == "__main__":
    asyncio.run(main())

Ejecute la aplicación:

python app.py

Use el SDK de Foundry Local Rust para cargar y ejecutar el modelo compilado con la API nativa de finalizaciones de chat.

Requisitos previos

  • Rust y Cargo instalados (Rust 1.70.0 o posterior).

Instalación de paquetes

Si está desarrollando o distribuyendo en Windows, seleccione la pestaña Windows. El paquete de Windows se integra con el entorno de ejecución Windows ML y proporciona la misma superficie del API con una mayor amplitud de aceleración de hardware.

cargo add foundry-local-sdk --features winml
cargo add tokio --features full
cargo add tokio-stream anyhow

Ejecución de la inferencia en el modelo compilado

Reemplace el contenido de src/main.rs por el código siguiente:

use foundry_local_sdk::{
    ChatCompletionRequestMessage, ChatCompletionRequestUserMessage,
    FoundryLocalConfig, FoundryLocalManager,
};
use std::io::Write;
use tokio_stream::StreamExt;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Point model_cache_dir at the directory containing your compiled model
    let config = FoundryLocalConfig::new("run-compiled-model")
        .with_model_cache_dir("../models");
    let manager = FoundryLocalManager::create(config)?;

    // List cached models to find your compiled model
    let cached_models = manager.catalog().get_cached_models().await?;
    println!("Cached models:");
    for m in &cached_models {
        println!("  {}", m.id());
    }

    // Select your compiled model from the cached list
    let model = cached_models
        .iter()
        .find(|m| m.id().contains("llama-3.2:1"))
        .ok_or_else(|| anyhow::anyhow!("Compiled model not found. Verify the model_cache_dir path."))?;

    // Load the model
    model.load().await?;

    // Create a chat client
    let client = model.create_chat_client().temperature(0.7).max_tokens(256);

    // Stream the response
    let messages: Vec<ChatCompletionRequestMessage> = vec![
        ChatCompletionRequestUserMessage::new("What is the golden ratio?").into(),
    ];

    let mut stream = client.complete_streaming_chat(&messages, None).await?;
    while let Some(chunk) = stream.next().await {
        let chunk = chunk?;
        if let Some(content) = &chunk.choices[0].delta.content {
            print!("{}", content);
            std::io::stdout().flush()?;
        }
    }
    println!();

    // Tidy up - unload the model
    model.unload().await?;

    Ok(())
}

Ejecute la aplicación:

cargo run

Solución de problemas

  • Si se produce un error de autenticación o acceso en olive optimize, confirme el token de Hugging Face y que se apruebe la solicitud de acceso al modelo.
  • Si no se encuentra el comando hf, instálelo ejecutando pip install -U huggingface_hub.
  • Si el modelo compilado no se encuentra en la lista de modelos almacenados en caché, verifique que la ruta de acceso en su ModelCacheDir apunte al directorio primario que contiene la carpeta del modelo.
  • Si encuentra errores de compilación .NET que hacen referencia a net8.0, instale el SDK de .NET 8.0.