À 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.
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 temperature
Cela 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
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()
.
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.
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()
.
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 :
An mlflow.pyfunc.PyFuncModel
instance ou un URI pointant vers un modèle MLflow enregistré.
Une fonction Python qui prend des entrées de chaîne et génère une seule chaîne.
Un URI de point de terminaison MLflow Deployments.
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.
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 :
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.
MLflow propose différentes manières de visualiser les résultats de votre évaluation LLM. Voici quelques techniques :
Après avoir exécuté vos évaluations, vous pouvez utiliser l'interface utilisateur MLflow pour visualiser les résultats :
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 :
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.