Компилировать модели Hugging Face для запуска на Foundry Local

Foundry Local запускает модели ONNX на устройстве. Используйте Olive для преобразования и оптимизации моделей из Hugging Face (Safetensors или PyTorch) в ONNX, чтобы запускать их с Foundry Local.

Важно

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

Для наиболее надежных и актуальных примеров начните с репозитория оливковых рецептов. Он предоставляет набор целевых рецептов для различных моделей, оптимизированных для различных аппаратных средств с различными параметрами оптимизации.

В этом руководстве показано, как:

  • Преобразование и оптимизация моделей из Hugging Face для запуска в Foundry Local. В примерах используется Llama-3.2-1B-Instruct модель, но многие модели Hugging Face могут работать.
  • Запустите оптимизированные модели с помощью Foundry Local.

Необходимые условия

  • Python 3.10 или более поздней версии (требуется для компиляции Оливки)
  • Учетная запись Hugging Face и токен с доступом к meta-llama/Llama-3.2-1B-Instruct

Установка Olive и зависимостей

Олив оптимизирует модели и преобразует их в формат ONNX.

pip install olive-ai
pip install transformers onnxruntime-genai

Совет

Установите Olive в виртуальной среде с помощью venv или conda.

Проверьте установку: olive --help выводит сведения об использовании.

Войти на Hugging Face

Для Llama-3.2-1B-Instruct модели требуется аутентификация Hugging Face.

hf auth login

Примечание

Перед тем как продолжить, создайте токен Hugging Face и запросите доступ к модели.

Совет

Если hf не найден, установите его, выполнив pip install -U huggingface_hub.

Компиляция модели

В этом разделе описывается компиляция вручную. Команда "Оливка optimize " загружает, преобразует, квантуизирует и оптимизирует модель.

Примечание

Это ручной пример, который может потребовать корректировки для различных моделей или аппаратных целевых объектов.

  1. Выполните команду 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
    

    Команда использует следующие параметры:

    Параметр Описание
    model_name_or_path Источник модели: ID Hugging Face, локальный путь или идентификатор реестра моделей Azure ИИ
    output_path Где сохранить оптимизированную модель
    device Целевое оборудование: cpu, gpuили npu
    provider Поставщик выполнения (например, CPUExecutionProvider, CUDAExecutionProvider)
    precision Точность модели: fp16, , fp32int4илиint8

    Совет

    Если у вас есть локальная копия модели, используйте локальный путь вместо Hugging Face ID. Например, --model_name_or_path models/llama-3.2-1B-Instruct. Olive автоматически обрабатывает преобразование, оптимизацию и квантизацию.

    Примечание

    Процесс компиляции занимает около 60 секунд, а также время загрузки.

  2. Обеспечьте доступ модели для Foundry Local, создав файл inference_model.json в каталоге модели.

    # 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)
    

    Запустите скрипт:

    python generate_inference_model.py
    

    Убедитесь, что файл существует: models/llama/inference_model.json

Запуск скомпилированной модели

Используйте Foundry Local C# SDK для загрузки и выполнения вашей скомпилированной модели с помощью встроенного API завершения чата. Этот подход не требует REST-сервера — пакет SDK взаимодействует напрямую со средой выполнения.

Необходимые условия

  • пакет SDK .NET 8.0 или более поздней версии

Установка пакетов

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

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

Примеры C# в репозитории GitHub предварительно настроены. Если вы создаете с нуля, ознакомьтесь со справочником по локальному пакету SDK Foundry для получения дополнительных сведений о настройке проекта C# с помощью Foundry Local.

Выполнение вывода в скомпилированной модели

Замените содержимое Program.cs следующим кодом:

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

Запустите приложение:

dotnet run

Используйте Local JavaScript SDK Foundry для загрузки и запуска вашей скомпилированной модели с помощью API для нативных завершений чата.

Необходимые условия

Установка пакетов

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

npm install foundry-local-sdk-winml openai

Выполнение вывода в скомпилированной модели

Скопируйте и вставьте следующий код в файл JavaScript с именем 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();

Запустите приложение:

node app.js

Используйте локальный Python SDK Foundry, чтобы загрузить и запустить скомпилированную модель с помощью API для завершения чатов на родном языке.

Необходимые условия

  • Python 3.11 или более поздней версии, установленные.

Установка пакетов

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

pip install foundry-local-sdk-winml openai

Выполнение вывода в скомпилированной модели

Скопируйте и вставьте следующий код в файл Python с именем 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())

Запустите приложение:

python app.py

Используйте пакет SDK Foundry Local Rust для загрузки и запуска скомпилированной модели с помощью API завершения собственного чата.

Необходимые условия

  • Rust и Cargo установлены (Rust 1.70.0 или более поздней версии).

Установка пакетов

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

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

Выполнение вывода в скомпилированной модели

Замените содержимое src/main.rs следующим кодом:

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

Запустите приложение:

cargo run

Устранение неполадок

  • Если olive optimize завершается ошибкой аутентификации или доступа, убедитесь, что подтвержден ваш токен Hugging Face и одобрен запрос на доступ к модели.
  • hf Если команда не найдена, установите ее, выполнив командуpip install -U huggingface_hub.
  • Если скомпилированная модель не найдена в списке кэшированных моделей, проверьте, что ModelCacheDir путь в Configuration указывает на родительский каталог, содержащий папку модели.
  • Если возникают ошибки сборки .NET, ссылающиеся на net8.0, установите пакет SDK .NET 8.0.