FAQ sur l’observabilité et la qualité des agents
Q : Quelle est la différence entre MLflow managé sur Databricks et MLflow open source ?
Managed MLflow sur Databricks repose sur le même MLflow open source : le traçage, l'évaluation, les juges LLM, les évaluateurs, le registre des prompts et les retours humains constituent autant d'APIs open source, ce qui garantit la portabilité de vos données et de votre code. Databricks l'exécute et le gère pour vous, tout en y ajoutant des fonctionnalités de plateforme ; le projet open source n'est ni remplacé ni ramifié (fork).
Compétence | MLflow open source | MLflow managé sur Databricks |
|---|---|---|
Modèle de données, APIs et SDK | Oui | Oui — identique, de sorte que vos données et votre code restent portables |
Tracing, autolog et interface utilisateur de la trace | Oui | Oui |
Évaluation : | Oui | Oui |
Registre des prompts | Oui | Oui |
Commentaires et étiquetage humains | Oui | Oui, plus la Review App hébergée — une interface de chat et une interface de labellisation experte pour les réviseurs n'ayant pas accès au Workspace |
Hébergement et stockage | Auto-hébergé : vous exécutez le serveur de suivi et choisissez le backend | Entièrement managé ; les traces et les experimentations résident dans les tables Delta Unity Catalog — gérées, interrogeables en SQL, sans limite par experimentation |
Gouvernance, sécurité et audit | Votre propre configuration | Autorisations du workspace et d'Unity Catalog, authentification au nom de l'utilisateur (on-behalf-of-user) et journaux d'audit dans les tables système |
Assistant IA et analyse en langage naturel | Assistant IA (bêta) — utilisez votre propre fournisseur de modèle ou agent de codage (par exemple, Claude Code) | Genie Code géré, tableaux de bord AI/BI et Databricks SQL sur vos traces — aucune configuration de modèle requise |
Production monitoring | Exécutez vous-même des évaluateurs ad hoc | Service géré qui évalue en continu un échantillon de trafic en direct |
CI/CD et MLOps | APIs principales et registre des modèles | Declarative Automation Bundles, MLOps Stacks et jobs de déploiement |
Vos données vous appartiennent toujours : le modèle de données et les APIs sont entièrement open source, ce qui vous permet d'exporter et d'utiliser vos données MLflow où que vous soyez. Pour en savoir plus, consultez la page produit de Managed MLflow.
Q : Quel est le surcoût de latence introduit par le traçage ?
Les traces sont écrites de manière asynchrone pour minimiser l'impact sur les performances. Cependant, le traçage ajoute toujours une latence minimale, particulièrement lorsque la taille de la trace est importante. MLflow recommande de tester votre application pour comprendre les impacts sur la latence du traçage avant de la déployer en production.
Le tableau suivant fournit des estimations approximatives de l’impact sur la latence en fonction de la taille de la trace :
Taille de la trace par requête | Impact sur la latence de vitesse de réponse (ms) |
|---|---|
~10 Ko | ~ 1 ms |
~ 1 Mo | 50 à 100 ms |
10 Mo | 150 ms ~ |
Q : Quelles sont les limites de débit et les quotas pour MLflow Tracing dans Databricks ?
Lors de l'utilisation de MLflow Tracing au sein d'un Workspace Databricks, des quotas et des limites de débit s'appliquent pour assurer la stabilité du service et une utilisation équitable. Voir les limites des Ressources.
Q : Je ne peux pas ouvrir ma trace dans l'interface utilisateur MLflow. Que dois-je faire ?
Il existe plusieurs raisons possibles pour lesquelles une trace peut ne pas être visible dans l'interface utilisateur MLflow.
-
Le traçage n'est pas encore terminé : si le traçage est toujours en cours de collecte, MLflow ne peut pas afficher les étendues dans l'interface utilisateur. Assurez-vous que toutes les étendues se terminent correctement avec le statut « OK » ou « ERROR ».
-
Le cache du navigateur est obsolète : Lorsque vous mettez à niveau MLflow vers une nouvelle version, le cache du navigateur peut contenir des données obsolètes et empêcher l'interface utilisateur d'afficher correctement les traces. Videz le cache de votre navigateur (Maj+F5) et refresh la page.
Q : J’ai enregistré des métriques et je vois « traces : 0 ». Quel est le problème ?
mlflow.log_metric(), mlflow.log_param() et mlflow.start_run() créent des exécutions MLflow , un concept différent des traces MLflow . Les exécutions apparaissent dans l’onglet tab d’une expérimentation. Les traces apparaissent dans l’onglet tab . Ils sont indépendants. L’enregistrement d’une métrique ne crée pas de trace, et le traçage ne nécessite pas de contexte d’exécution.
Pour générer une trace, utilisez le traçage automatique (par exemple, mlflow.openai.autolog(), mlflow.langchain.autolog()) ou le traçage manuel (par exemple, @mlflow.trace, mlflow.start_span()). Le tab Traces reste vide jusqu’à ce que l’un de ces éléments soit appelé et que le code instrumenté s’exécute.
Ce que vous avez appelé | Où il apparaît |
|---|---|
| tab Exécutions |
| tab Traces |
| tab Traces |
| tab Traces |
Q : Je ne trouve pas de trace spécifique par ID dans la liste des traces. Que dois-je faire ?
Par default, la liste de traces renvoie les 1 000 traces les plus récentes. Si une trace plus ancienne se situe en dehors de cette fenêtre, elle n'apparaîtra pas dans les résultats de recherche, même si vous correspondez à l'ID de la trace.
Pour trouver une trace plus ancienne, réduisez le filtre de plage horaire afin de créer une fenêtre de résultats plus petite. Une fois que la trace se trouvera parmi les 1 000 entrées les plus récentes pour cette période spécifique, la recherche par ID la trouvera. Si vous connaissez l'ID d'expérience et l'ID de trace, vous pouvez également naviguer directement : <workspace-url>/ml/experiments/<experiment-id>/traces/<trace-id>.
Les expérimentations qui ne sont pas dans Unity Catalog sont également limitées à 100 000 traces au total. Pour un stockage évolutif, gouverné et interrogeable par SQL sans limite de traces, Databricks recommande de stocker les traces dans Unity Catalog. Pour déplacer les traces d’expérimentation existantes, migrer vers les traces dans Unity Catalog.
Q : L'exécution du modèle est bloquée et ma trace est « en cours » indéfiniment.
Parfois, un modèle ou un agent se bloque dans une opération de longue durée ou une boucle infinie, ce qui bloque la trace à l'état "en cours".
Pour éviter cela, vous pouvez définir un délai d’expiration pour la trace à l’aide de la variable d’environnement MLFLOW_TRACE_TIMEOUT_SECONDS. Si la trace dépasse le délai d'expiration, MLflow interrompra automatiquement la trace avec le statut ERROR et l'exportera vers le backend, afin que vous puissiez analyser les spans pour identifier le problème. By default, le délai d'expiration n'est pas défini.
Le délai d’expiration s’applique uniquement à la trace MLflow. Le programme principal, le modèle ou l'agent continuera de s'exécuter même si la trace est arrêtée.
Par exemple, le code suivant définit le délai d'expiration à 5 secondes et simule la façon dont MLflow gère une Opération de longue durée :
import mlflow
import os
import time
# Set the timeout to 5 seconds for demonstration purposes
os.environ["MLFLOW_TRACE_TIMEOUT_SECONDS"] = "5"
# Simulate a long-running operation
@mlflow.trace
def long_running():
for _ in range(10):
child()
@mlflow.trace
def child():
time.sleep(1)
long_running()
MLflow surveille le temps d'exécution et l'expiration des traces dans un thread d'arrière-plan. Par défaut, cette vérification est effectuée chaque seconde et la consommation de ressources est négligeable. Si vous souhaitez ajuster l'intervalle, vous pouvez définir la variable d'environnement MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS.
Q : Ma trace est divisée en plusieurs traces lors de l'exécution multithread. Comment puis-je les combiner en une seule trace ?
Comme MLflow Tracing dépend de Python ContextVar, chaque thread a son propre contexte de trace par default, mais il est possible de générer une trace unique pour les applications multi-threads avec quelques étapes supplémentaires. Pour plus d'informations, consultez la section Multi-threading.
Q : Comment désactiver temporairement le traçage ?
Pour désactiver le traçage, l’API mlflow.tracing.disable cessera la collecte de données de trace depuis MLflow et n’enregistrera aucune donnée dans le service MLflow Tracking concernant les traces.
Pour activer le traçage (s'il avait été temporairement désactivé), l'API mlflow.tracing.enable réactivera la fonctionnalité de traçage pour les modèles instrumentés
qui sont invoqués.
Q : Mes résultats de recherche de traces sont trop volumineux pour mlflow.search_traces(). Comment puis-je rechercher des traces à grande échelle ?
L’API MLflow fournit une pagination via la méthode MlflowClient.search_traces(). Cependant, pour les cas d’utilisation ne nécessitant pas de pagination, mlflow.search_traces() est recommandé car il offre plus de fonctionnalités et des valeurs par défaut pratiques.
Pour l’analyse de traces à grande échelle en production, il est généralement préférable d’utiliser le monitoring de production pour consigner les traces dans des tables Delta de Unity Catalog. Consultez la présentation du suivi pour obtenir des conseils sur le suivi en production.
Q : Puis-je activer ou désactiver le traçage sans modifier mon code ?
Oui. Définissez la variable d’environnement MLFLOW_TRACING_ENABLED :
# Disable tracing
export MLFLOW_TRACING_ENABLED=false
# Enable tracing (if previously disabled)
export MLFLOW_TRACING_ENABLED=true
Cela vous permet d'activer ou de désactiver le traçage à l'exécution sans modifier le code, ce qui est utile pour les tests ou pour désactiver sélectivement le traçage dans certains environnements.
Q : MLflow Tracing fonctionne-t-il avec le code async et await ?
Oui. Le décorateur @mlflow.trace fonctionne de manière transparente avec les fonctions asynchrones :
import mlflow
@mlflow.trace
async def my_async_function(query: str):
result = await some_async_operation(query)
return result
# Call it
await my_async_function("hello")
Q : Puis-je afficher les traces directement dans les notebooks Jupyter ?
Oui. Dans MLflow 2.20 et version ultérieure, l'interface utilisateur des traces s'affiche automatiquement dans les Notebooks Jupyter lorsque :
- Your code generates traces (via autolog or
@mlflow.trace). - Vous appelez
mlflow.search_traces()pour afficher les traces sous forme de DataFrame.
L'interface utilisateur du notebook affiche les mêmes détails de trace et outils d'exploration que l'interface utilisateur du workspace Databricks.
Q : MLflow Tracing est-il compatible avec d’autres outils d’observabilité ?
Oui. MLflow Tracing repose sur les normes OpenTelemetry (OTel), ce qui garantit son agilité vis-à-vis des fournisseurs. Vous pouvez exporter les traces vers d’autres systèmes d’observabilité (par exemple, Jaeger, Datadog, New Relic) via l’exportation OTLP (OpenTelemetry Protocol). Consultez la section Exportation OTel pour en savoir plus sur la configuration.
Q : Quelle est la taille maximale d'une trace ?
Les traces peuvent être volumineuses ; l’impact sur la latence dépend de leur taille. MLflow recommande de tester votre application pour comprendre l’impact :
Taille de la trace par requête | Impact sur la latence |
|---|---|
~10 Ko | ~1 ms |
~1 Mo | 50–100 ms |
~10 Mo | 150+ ms |
Pour optimiser la taille des traces en production, veuillez utiliser des processeurs de span personnalisés pour filtrer ou masquer les données sensibles avant l’exportation.
Q : Pourquoi mes traces sont-elles divisées en plusieurs traces lors de l’utilisation du multithreading ?
Dans la Traces tab , vous verrez le travail apparaître sous la forme de plusieurs traces distinctes plutôt qu'une seule, car chaque thread obtient son propre contexte de trace. Pour conserver l'ensemble dans une seule trace, propagez le contexte à vos threads worker :
import contextvars
from concurrent.futures import ThreadPoolExecutor
import mlflow
@mlflow.trace
def main_task():
ctx = contextvars.copy_context()
with ThreadPoolExecutor() as executor:
# Pass the copied context to worker threads
executor.submit(ctx.run, worker_task)
def worker_task():
# This runs in the copied context, preserving the trace
print("I'm in the same trace as the parent")
main_task()
Vous pouvez également utiliser mlflow.tracing.set_destination() avec context_local=False pour log toutes les portées de votre application dans une seule Experimentation et trace.