Suivez nous sur

Suivi des grands modèles de langage (LLM) avec MLflow : un guide complet

Outils IA 101

Suivi des grands modèles de langage (LLM) avec MLflow : un guide complet

mm
Évaluation du guide MLflow LLM

À mesure que les grands modèles linguistiques (LLM) gagnent en complexité et en évolutivité, le suivi de leurs performances, de leurs expériences et de leurs déploiements devient de plus en plus difficile. C'est là qu'intervient MLflow, en fournissant une plate-forme complète pour gérer l'ensemble du cycle de vie des modèles d'apprentissage automatique, y compris les LLM.

Dans ce guide détaillé, nous explorerons comment exploiter MLflow pour le suivi, l'évaluation et le déploiement des LLM. Nous aborderons tous les aspects, de la configuration de votre environnement aux techniques d'évaluation avancées, avec de nombreux exemples de code et bonnes pratiques.

Fonctionnalité de MLflow dans les grands modèles de langage (LLM)

MLflow MLflow est devenu un outil essentiel dans la communauté du machine learning et de la science des données, notamment pour la gestion du cycle de vie des modèles de machine learning. MLflow propose une suite d'outils performants pour les modèles de langages volumineux (LLM), simplifiant considérablement le processus de développement, de suivi, d'évaluation et de déploiement de ces modèles. Voici un aperçu du fonctionnement de MLflow dans le domaine des LLM et des avantages qu'il offre aux ingénieurs et aux data scientists.

Découvrez les composants principaux de MLflow

Suivi et gestion des interactions LLM

Le système de suivi LLM de MLflow est une amélioration de ses capacités de suivi existantes, adaptée aux besoins uniques des LLM. Il permet un suivi complet des interactions des modèles, y compris les aspects clés suivants :

  • Paramètres : journalisation des paires clé-valeur qui détaillent les paramètres d'entrée du LLM, tels que les paramètres spécifiques au modèle tels que top_k et temperatureCela fournit un contexte et une configuration pour chaque exécution, garantissant que tous les aspects de la configuration du modèle sont capturés.
  • Métrique: Mesures quantitatives qui fournissent un aperçu des performances et de la précision du LLM. Ceux-ci peuvent être mis à jour dynamiquement au fur et à mesure de la progression de l'exécution, offrant ainsi des informations en temps réel ou post-traitement.
  • Prédictions: Capturer les entrées envoyées au LLM et les sorties correspondantes, qui sont stockées sous forme d'artefacts dans un format structuré pour une récupération et une analyse faciles.
  • Artefacts:Au-delà des prédictions, MLflow peut stocker divers fichiers de sortie tels que des visualisations, des modèles sérialisés et des fichiers de données structurés, permettant une documentation et une analyse détaillées des performances du modèle.

Cette approche structurée garantit que toutes les interactions avec le LLM sont méticuleusement enregistrées, fournissant ainsi un lignage complet et un suivi de la qualité des modèles générateurs de texte.

Évaluation des LLM

L'évaluation des LLM présente des défis uniques en raison de leur nature générative et de l'absence d'une vérité terrain unique. MLflow simplifie cela avec des outils d'évaluation spécialisés conçus pour les LLM. Les principales fonctionnalités incluent :

  • Évaluation polyvalente du modèle: prend en charge l'évaluation de différents types de LLM, qu'il s'agisse d'un modèle pyfunc MLflow, d'un URI pointant vers un modèle MLflow enregistré ou de tout appelable Python représentant votre modèle.
  • Mesures complètes: Offre une gamme de métriques adaptées à l'évaluation LLM, y compris des métriques dépendantes du modèle SaaS (par exemple, pertinence des réponses) et des métriques basées sur les fonctions (par exemple, ROUGE, Flesch Kincaid).
  • Collections de métriques prédéfinies: En fonction du cas d'utilisation, tel que la réponse à des questions ou le résumé de texte, MLflow fournit des métriques prédéfinies pour simplifier le processus d'évaluation.
  • Création de métriques personnalisées: permet aux utilisateurs de définir et de mettre en œuvre des métriques personnalisées pour répondre à des besoins d'évaluation spécifiques, améliorant ainsi la flexibilité et la profondeur de l'évaluation du modèle.
  • Évaluation avec des ensembles de données statiques: permet l'évaluation d'ensembles de données statiques sans spécifier de modèle, ce qui est utile pour des évaluations rapides sans réexécuter l'inférence de modèle.

Déploiement et intégration

MLflow prend également en charge le déploiement et l'intégration transparents des LLM :

  • Serveur de déploiements MLflow: Agit comme une interface unifiée pour interagir avec plusieurs fournisseurs LLM. Il simplifie les intégrations, gère les informations d'identification en toute sécurité et offre une expérience API cohérente. Ce serveur prend en charge une gamme de modèles fondamentaux de fournisseurs SaaS populaires ainsi que des modèles auto-hébergés.
  • Point de terminaison unifié: Facilite le changement facile entre les fournisseurs sans modification de code, minimisant ainsi les temps d'arrêt et améliorant la flexibilité.
  • Vue des résultats intégrée: Fournit des résultats d’évaluation complets, accessibles directement dans le code ou via l’interface utilisateur MLflow pour une analyse détaillée.

MLflow est une suite complète d'outils et d'intégrations qui en font un atout inestimable pour les ingénieurs et les data scientists travaillant avec des modèles NLP avancés.

Configuration de votre environnement

Avant de nous lancer dans le suivi des LLM avec MLflow, configurons notre environnement de développement. Nous devrons installer MLflow et plusieurs autres bibliothèques clés :

pip install mlflow>=2.8.1
pip install openai
pip install chromadb==0.4.15
pip install langchain==0.0.348
pip install tiktoken
pip install 'mlflow[genai]'
pip install databricks-sdk --upgrade

Après l'installation, il est recommandé de redémarrer votre environnement Python pour vous assurer que toutes les bibliothèques sont correctement chargées. Dans un notebook Jupyter, vous pouvez utiliser :

import mlflow
import chromadb

print(f"MLflow version: {mlflow.__version__}")
print(f"ChromaDB version: {chromadb.__version__}")

Cela confirmera les versions des bibliothèques clés que nous utiliserons.

Comprendre les capacités de suivi LLM de MLflow

Le système de suivi des LLM de MLflow s'appuie sur ses capacités de suivi existantes et y ajoute des fonctionnalités spécifiquement conçues pour les spécificités des LLM. Détaillons les principaux éléments :

Exécutions et expériences

Dans MLflow, une « exécution » représente une exécution unique de votre code de modèle, tandis qu'une « expérience » est une collection d'exécutions associées. Pour les LLM, une exécution peut représenter une requête unique ou un lot d'invites traitées par le modèle.

Composants clés de suivi

  1. Paramètres: Il s'agit de configurations d'entrée pour votre LLM, telles que la température, top_k ou max_tokens. Vous pouvez les enregistrer en utilisant mlflow.log_param() or mlflow.log_params().
  2. Métrique: Mesures quantitatives des performances de votre LLM, telles que la précision, la latence ou les scores personnalisés. mlflow.log_metric() or mlflow.log_metrics() pour les suivre.
  3. Prédictions:Pour les LLM, il est essentiel d'enregistrer à la fois les invites d'entrée et les sorties du modèle. MLflow les stocke sous forme d'artefacts au format CSV à l'aide de mlflow.log_table().
  4. Artefacts: tous les fichiers ou données supplémentaires liés à votre exécution LLM, tels que les points de contrôle du modèle, les visualisations ou les échantillons d'ensembles de données. Utiliser mlflow.log_artifact() pour les stocker.

Regardons un exemple de base de journalisation d’une exécution LLM :

Cet exemple illustre les paramètres de journalisation, les métriques et les entrées/sorties sous forme d'artefact de table.

import mlflow
import openai

def query_llm(prompt, max_tokens=100):
    response = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        max_tokens=max_tokens
    )
    return response.choices[0].text.strip()

with mlflow.start_run():
    prompt = "Explain the concept of machine learning in simple terms."
    
    # Log parameters
    mlflow.log_param("model", "text-davinci-002")
    mlflow.log_param("max_tokens", 100)
    
    # Query the LLM and log the result
    result = query_llm(prompt)
    mlflow.log_metric("response_length", len(result))
    
    # Log the prompt and response
    mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})
    
    print(f"Response: {result}")

Déployer des LLM avec MLflow

MLflow offre de puissantes fonctionnalités de déploiement de LLM, facilitant ainsi la mise à disposition de vos modèles en environnement de production. Découvrons comment déployer un LLM grâce aux fonctionnalités de déploiement de MLflow.

Création d'un point de terminaison

Tout d’abord, nous allons créer un point de terminaison pour notre LLM en utilisant le client de déploiement de MLflow :

import mlflow
from mlflow.deployments import get_deploy_client

# Initialize the deployment client
client = get_deploy_client("databricks")

# Define the endpoint configuration
endpoint_name = "llm-endpoint"
endpoint_config = {
    "served_entities": [{
        "name": "gpt-model",
        "external_model": {
            "name": "gpt-3.5-turbo",
            "provider": "openai",
            "task": "llm/v1/completions",
            "openai_config": {
                "openai_api_type": "azure",
                "openai_api_key": "{{secrets/scope/openai_api_key}}",
                "openai_api_base": "{{secrets/scope/openai_api_base}}",
                "openai_deployment_name": "gpt-35-turbo",
                "openai_api_version": "2023-05-15",
            },
        },
    }],
}

# Create the endpoint
client.create_endpoint(name=endpoint_name, config=endpoint_config)

Ce code configure un point de terminaison pour un modèle GPT-3.5-turbo à l'aide d'Azure OpenAI. Notez l'utilisation des secrets Databricks pour la gestion sécurisée des clés API.

Test du point de terminaison

Une fois le endpoint créé, nous pouvons le tester :

<div class="relative flex flex-col rounded-lg">

response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "Explain the concept of neural networks briefly.","max_tokens": 100,},)

print(response)

Cela enverra une invite à notre modèle déployé et renverra la réponse générée.

Évaluation des LLM avec MLflow

L'évaluation est cruciale pour comprendre les performances et le comportement de vos LLM. MLflow fournit des outils complets pour évaluer les LLM, y compris des métriques intégrées et personnalisées.

Préparer votre LLM pour l'évaluation

Pour évaluer votre LLM avec mlflow.evaluate(), votre modèle doit se présenter sous l'une de ces formes :

  1. An mlflow.pyfunc.PyFuncModel instance ou un URI pointant vers un modèle MLflow enregistré.
  2. Une fonction Python qui prend des entrées de chaîne et génère une seule chaîne.
  3. Un URI de point de terminaison MLflow Deployments.
  4. complet » model=None et inclure les résultats du modèle dans les données d’évaluation.

Regardons un exemple utilisant un modèle MLflow enregistré :

import mlflow
import openai

with mlflow.start_run():
    system_prompt = "Answer the following question concisely."
    logged_model_info = mlflow.openai.log_model(
        model="gpt-3.5-turbo",
        task=openai.chat.completions,
        artifact_path="model",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": "{question}"},
        ],
    )

# Prepare evaluation data
eval_data = pd.DataFrame({
    "question": ["What is machine learning?", "Explain neural networks."],
    "ground_truth": [
        "Machine learning is a subset of AI that enables systems to learn and improve from experience without explicit programming.",
        "Neural networks are computing systems inspired by biological neural networks, consisting of interconnected nodes that process and transmit information."
    ]
})

# Evaluate the model
results = mlflow.evaluate(
    logged_model_info.model_uri,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
)

print(f"Evaluation metrics: {results.metrics}")

Cet exemple enregistre un modèle OpenAI, prépare les données d'évaluation, puis évalue le modèle à l'aide des métriques intégrées de MLflow pour les tâches de réponse aux questions.

Métriques d'évaluation personnalisées

MLflow vous permet de définir des indicateurs personnalisés pour l'évaluation des LLM. Voici un exemple de création d'un indicateur personnalisé pour évaluer le professionnalisme des réponses :

from mlflow.metrics.genai import EvaluationExample, make_genai_metric

professionalism = make_genai_metric(
    name="professionalism",
    definition="Measure of formal and appropriate communication style.",
    grading_prompt=(
        "Score the professionalism of the answer on a scale of 0-4:\n"
        "0: Extremely casual or inappropriate\n"
        "1: Casual but respectful\n"
        "2: Moderately formal\n"
        "3: Professional and appropriate\n"
        "4: Highly formal and expertly crafted"
    ),
    examples=[
        EvaluationExample(
            input="What is MLflow?",
            output="MLflow is like your friendly neighborhood toolkit for managing ML projects. It's super cool!",
            score=1,
            justification="The response is casual and uses informal language."
        ),
        EvaluationExample(
            input="What is MLflow?",
            output="MLflow is an open-source platform for the machine learning lifecycle, including experimentation, reproducibility, and deployment.",
            score=4,
            justification="The response is formal, concise, and professionally worded."
        )
    ],
    model="openai:/gpt-3.5-turbo-16k",
    parameters={"temperature": 0.0},
    aggregations=["mean", "variance"],
    greater_is_better=True,
)

# Use the custom metric in evaluation
results = mlflow.evaluate(
    logged_model_info.model_uri,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
    extra_metrics=[professionalism]
)

print(f"Professionalism score: {results.metrics['professionalism_mean']}")

Cette métrique personnalisée utilise GPT-3.5-turbo pour évaluer le professionnalisme des réponses, démontrant comment vous pouvez exploiter les LLM eux-mêmes pour l'évaluation.

Techniques avancées d'évaluation LLM

À mesure que les LLM gagnent en sophistication, les techniques d'évaluation évoluent également. Explorons quelques méthodes d'évaluation avancées utilisant MLflow.

Évaluation de la génération augmentée par récupération (RAG)

Les systèmes RAG combinent la puissance des modèles basés sur la récupération et des modèles génératifs. Leur évaluation nécessite d'évaluer à la fois les composants de récupération et de génération. Voici comment configurer et évaluer un système RAG avec MLflow :

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# Load and preprocess documents
loader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# Create vector store
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

# Create RAG chain
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# Evaluation function
def evaluate_rag(question):
    result = qa_chain({"query": question})
    return result["result"], [doc.page_content for doc in result["source_documents"]]

# Prepare evaluation data
eval_questions = [
    "What is MLflow?",
    "How does MLflow handle experiment tracking?",
    "What are the main components of MLflow?"
]

# Evaluate using MLflow
with mlflow.start_run():
    for question in eval_questions:
        answer, sources = evaluate_rag(question)
        
        mlflow.log_param(f"question", question)
        mlflow.log_metric("num_sources", len(sources))
        mlflow.log_text(answer, f"answer_{question}.txt")
        
        for i, source in enumerate(sources):
            mlflow.log_text(source, f"source_{question}_{i}.txt")

    # Log custom metrics
    mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))

Cet exemple configure un système RAG à l'aide de LangChain et Chroma, puis l'évalue en enregistrant les questions, les réponses, les sources récupérées et les métriques personnalisées dans MLflow.

Évaluation de la stratégie de regroupement

La façon dont vous fragmentez vos documents peut avoir un impact significatif sur les performances de RAG. MLflow peut vous aider à évaluer différentes stratégies de segmentation :

import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter

def evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class):
    splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
    chunks = splitter.split_documents(documents)
    
    with mlflow.start_run():
        mlflow.log_param("chunk_size", chunk_size)
        mlflow.log_param("chunk_overlap", chunk_overlap)
        mlflow.log_param("splitter_class", splitter_class.__name__)
        
        mlflow.log_metric("num_chunks", len(chunks))
        mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))
        
        # Evaluate retrieval performance (simplified)
        correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
        mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)

# Evaluate different strategies
for chunk_size in [500, 1000, 1500]:
    for chunk_overlap in [0, 50, 100]:
        for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:
            evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class)

# Compare results
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"Best chunking strategy: {best_run['params.splitter_class']} with size {best_run['params.chunk_size']} and overlap {best_run['params.chunk_overlap']}")

Ce script évalue différentes combinaisons de tailles de fragments, de chevauchements et de méthodes de fractionnement, en enregistrant les résultats dans MLflow pour une comparaison facile.

Visualisation des résultats de l'évaluation LLM

MLflow propose différentes manières de visualiser les résultats de votre évaluation LLM. Voici quelques techniques :

Utilisation de l'interface utilisateur MLflow

Après avoir exécuté vos évaluations, vous pouvez utiliser l'interface utilisateur MLflow pour visualiser les résultats :

  1. Démarrez l'interface utilisateur de MLflow : mlflow ui
  2. Ouvrez un navigateur Web et accédez à http://localhost:5000
  3. Sélectionnez votre expérience et vos exécutions pour afficher les métriques, les paramètres et les artefacts

Visualisations personnalisées

Vous pouvez créer des visualisations personnalisées de vos résultats d'évaluation à l'aide de bibliothèques telles que Matplotlib ou Plotly, puis les enregistrer en tant qu'artefacts :

 
import matplotlib.pyplot as plt
import mlflow

def plot_metric_comparison(metric_name, run_ids):
    plt.figure(figsize=(10, 6))
    for run_id in run_ids:
        run = mlflow.get_run(run_id)
        metric_values = mlflow.get_metric_history(run_id, metric_name)
        plt.plot([m.step for m in metric_values], [m.value for m in metric_values], label=run.data.tags.get("mlflow.runName", run_id))
    
    plt.title(f"Comparison of {metric_name}")
    plt.xlabel("Step")
    plt.ylabel(metric_name)
    plt.legend()
    
    # Save and log the plot
    plt.savefig(f"{metric_name}_comparison.png")
    mlflow.log_artifact(f"{metric_name}_comparison.png")

# Usage
with mlflow.start_run():
    plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])

Cette fonction crée un tracé linéaire comparant une métrique spécifique sur plusieurs exécutions et l'enregistre en tant qu'artefact.

Alternatives à MLflow Open Source

Il existe de nombreuses alternatives à l'open source MLflow pour gérer les flux de travail d'apprentissage automatique, chacun offrant des fonctionnalités et des intégrations uniques.

MLflow géré par Databricks

MLflow géré, hébergé par Databricks, offre les fonctionnalités essentielles de MLflow open source, mais avec des avantages supplémentaires tels qu'une intégration transparente avec l'écosystème Databricks, des fonctionnalités de sécurité avancées et une infrastructure gérée. Cela en fait un excellent choix pour les organisations nécessitant une sécurité et une évolutivité robustes.

Apprentissage automatique Azure

Apprentissage automatique Azure Offre une solution d'apprentissage automatique de bout en bout sur la plateforme cloud Azure de Microsoft. Elle est compatible avec les composants MLflow tels que le registre de modèles et le suivi des expériences, bien qu'elle ne soit pas basée sur MLflow.

Plateformes ML dédiées

Plusieurs sociétés proposent des produits ML gérés avec diverses fonctionnalités :

  • neptune.ai: Se concentre sur le suivi des expériences et la gestion des modèles.
  • Poids et biais: Offre des outils étendus de suivi des expériences, de gestion des versions des ensembles de données et de collaboration.
  • Comète ML: Fournit le suivi des expériences, la surveillance de la production de modèles et l'enregistrement des données.
  • Valohai: Spécialisé dans les pipelines et l'orchestration d'apprentissage automatique.

Métaflux

Métaflux, développé par Netflix, est un framework open source conçu pour orchestrer les flux de données et les pipelines ML. Bien qu'il excelle dans la gestion des déploiements à grande échelle, il lui manque des fonctionnalités complètes de suivi des expériences et de gestion des modèles par rapport à MLflow.

Amazon SageMaker et Vertex AI de Google

Le Amazon Sage Maker et Vertex AI de Google fournir des solutions MLOps de bout en bout intégrées à leurs plateformes cloud respectives. Ces services offrent des outils robustes pour créer, former et déployer des modèles d'apprentissage automatique à grande échelle.

Comparaison détaillée

MLflow géré vs MLflow Open Source

Managed MLflow by Databricks offre plusieurs avantages par rapport à la version open source, notamment :

  • Configuration et déploiement: L'intégration transparente avec Databricks réduit le temps et les efforts de configuration.
  • Évolutivité: Capable de gérer facilement des charges de travail d’apprentissage automatique à grande échelle.
  • Sécurité et gestion: Fonctionnalités de sécurité prêtes à l'emploi telles que le contrôle d'accès basé sur les rôles (RBAC) et le cryptage des données.
  • Intégration :: Intégration profonde avec les services de Databricks, améliorant l'interopérabilité et les fonctionnalités.
  • Stockage et sauvegarde des données: Les stratégies de sauvegarde automatisées garantissent la sécurité et la fiabilité des données.
  • Prix: Les utilisateurs paient pour la plateforme, le stockage et les ressources de calcul.
  • Soutien et Entretien: Support et maintenance dédiés assurés par Databricks.

Conclusion

Le suivi des grands modèles de langage avec MLflow fournit un cadre robuste pour gérer les complexités du développement, de l'évaluation et du déploiement LLM. En suivant les meilleures pratiques et en tirant parti des fonctionnalités avancées décrites dans ce guide, vous pouvez créer des expériences LLM plus organisées, reproductibles et plus perspicaces.

N'oubliez pas que le domaine des LLM évolue rapidement et que de nouvelles techniques d'évaluation et de suivi émergent constamment. Restez à jour avec les dernières versions de MLflow et les recherches LLM pour affiner continuellement vos processus de suivi et d'évaluation.

En appliquant ces techniques dans vos projets, vous développerez une compréhension plus approfondie du comportement et des performances de vos LLM, conduisant à des modèles linguistiques plus efficaces et plus fiables.

J'ai passé les cinq dernières années à m'immerger dans le monde fascinant du Machine Learning et du Deep Learning. Ma passion et mon expertise m'ont amené à contribuer à plus de 50 projets de génie logiciel divers, avec un accent particulier sur l'IA/ML. Ma curiosité continue m'a également attiré vers le traitement automatique du langage naturel, un domaine que j'ai hâte d'explorer davantage.