Dela via


Felsökningsguide för modelltjänster

Den här artikeln visar felsökningssteg för vanliga problem som användare kan stöta på när de arbetar med modell som betjänar slutpunkter. Vanliga problem kan vara fel som användare stöter på när slutpunkten inte initierar eller startar, byggfel relaterade till containern eller problem under åtgärden eller körningen av modellen på slutpunkten.

Åtkomst till och granskningsloggar

Databricks rekommenderar att du granskar byggloggar för felsökning av fel i dina modellservingsarbetsbelastningar. Mer information om loggar och hur du visar dem finns i Övervaka modellkvalitet och slutpunktshälsa .

Anmärkning

Om din modellkod returnerar MlflowException fel förväntar du dig att svarskoden mappas till ett 4xx svar. Databricks anser att dessa modellkodfel är kundorsakade fel, eftersom de kan lösas baserat på det resulterande felmeddelandet. 5xx felkoder är reserverade för att kommunicera fel där Databricks har skulden.

Kontrollera händelseloggarna för modellen i arbetsytans användargränssnitt och sök efter ett meddelande om att containern har skapats. Om du inte ser något byggmeddelande efter en timme kontaktar du Databricks-supporten för hjälp.

Om bygget lyckas, men du stöter på andra fel, kan du läsa Felsökning efter att containerversionen har slutförts. Om bygget misslyckas kan du läsa Felsöka efter containergenereringsfel.

Installerade bibliotekspaketversioner

I byggloggarna kan du bekräfta de paketversioner som är installerade.

  • För MLflow-versioner använder modellservern den senaste versionen om du inte har någon angiven version.
  • För anpassad GPU-servering installerar Model Serving de rekommenderade versionerna av cuda och cuDNN enligt offentlig Dokumentation om PyTorch och Tensorflow.

Loggmodeller som kräver flash-attn

Om du loggar en modell som kräver flash-attnrekommenderar Databricks att du använder en anpassad hjulversion av flash-attn. I annat fall kan du skapa fel som ModuleNotFoundError: No module named 'torch' kan resultera.

Om du vill använda en specialanpassad wheel-version av flash-attn, anger du alla pipkrav som en lista och skickar den som en parameter till din mlflow.transformers.log_model-funktion. Du måste också ange de pytorch-, torch- och torchvision-versioner som är kompatibla med CUDA-versionen som anges i ditt flash attn wheel.

Databricks rekommenderar till exempel att du använder följande versioner och hjul för CUDA 11.8:


logged_model=mlflow.transformers.log_model(
transformers_model=test_pipeline,
       artifact_path="artifact_path",
       pip_requirements=["--extra-index-url https://download.pytorch.org/whl/cu118", "mlflow==2.13.1", "setuptools<70.0.0", "torch==2.0.1+cu118", "accelerate==0.31.0", "astunparse==1.6.3", "bcrypt==3.2.0", "boto3==1.34.39", "configparser==5.2.0", "defusedxml==0.7.1", "dill==0.3.6", "google-cloud-storage==2.10.0", "ipython==8.15.0", "lz4==4.3.2", "nvidia-ml-py==12.555.43", "optree==0.12.1", "pandas==1.5.3", "pyopenssl==23.2.0", "pytesseract==0.3.10", "scikit-learn==1.3.0", "sentencepiece==0.1.99", "torchvision==0.15.2+cu118", "transformers==4.41.2", "https://github.com/Dao-AILab/flash-attention/releases/download/v2.5.8/flash_attn-2.5.8+cu118torch2.0cxx11abiFALSE-cp311-cp311-linux_x86_64.whl"],
       input_example=input_example,
       registered_model_name=registered_model_name)

Valideringskontroller före modelldistribution

Databricks rekommenderar att du använder vägledningen i det här avsnittet innan du hanterar din modell. Följande parametrar kan fånga upp problem tidigt innan du väntar på slutpunkten. Se Verifiera modellindata innan du distribuerar för att verifiera dina modellindata innan du distribuerar din modell.

Testa förutsägelser före distribution

Innan du distribuerar din modell till tjänstslutpunkten ska du testa offlineförutsägelser i en virtuell miljö med mlflow.models.predict och indataexempel. MLflow tillhandahåller validerings-API:er som simulerar distributionsmiljön och tillåter testning av ändrade beroenden.

Det finns två valideringsalternativ före distributionen: MLflow Python API och MLflow CLI. Mer detaljerad vägledning finns i MLflow-dokumentation för att testa förutsägelser.

Du kan ange följande parametrar:

  • Den model_uri modell som distribueras till modellservern.
  • Något av följande:
    • I input_data det förväntade formatet för anropet mlflow.pyfunc.PyFuncModel.predict() av modellen.
    • Som input_path definierar en fil som innehåller indata som ska läsas in och användas för anropet till predict.
  • I content_typecsv - eller-formatet json .
  • Ett valfritt output_path alternativ för att skriva förutsägelserna till en fil. Om du utelämnar den här parametern skrivs förutsägelserna ut till stdout.
  • En miljöhanterare, env_manager, som används för att skapa miljön för att betjäna:
    • Standardvärdet är virtualenv. Rekommenderas för att hantera validering.
    • local är tillgänglig, men potentiellt felbenägen för att hantera validering. Används vanligtvis endast för snabb felsökning.
  • Om du vill installera den aktuella versionen av MLflow som finns i din miljö med den virtuella miljön med hjälp av install_mlflow. Den här inställningen är Falsesom standard .
  • Om du vill uppdatera och testa olika versioner av paketberoenden för felsökning eller avlusning. Du kan ange detta som en lista över åsidosättningar eller tillägg för strängberoende med hjälp av åsidosättningsargumentet pip_requirements_override.

Till exempel:

import mlflow

run_id = "..."
model_uri = f"runs:/{run_id}/model"

mlflow.models.predict(
  model_uri=model_uri,
  input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
  content_type="json",
  env_manager="virtualenv",
  install_mlflow=False,
  pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)

Uppdatera modellberoenden

Om det finns problem med de beroenden som anges med en loggad modell kan du uppdatera kraven med hjälp av MLflow CLI eller mlflow.models.model.update_model_requirements() I MLflow Python API utan att behöva logga en annan modell.

I följande exempel visas hur du uppdaterar en loggad modell pip_requirements.txt på plats.

Du kan uppdatera befintliga definitioner med angivna paketversioner eller lägga till icke-existerande krav i filen pip_requirements.txt. Den här filen finns i MLflow-modellartefakten på den angivna model_uri platsen.

from mlflow.models.model import update_model_requirements

update_model_requirements(
  model_uri=model_uri,
  operation="add",
  requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)

Verifiera modellindata före distribution

Modellbetjäningsslutpunkter förväntar sig ett särskilt format med json indata för att verifiera att dina modellindata fungerar på en betjäningsslutpunkt före distributionen. Du kan använda validate_serving_input i MLflow för att utföra en sådan validering.

Följande är ett exempel på den automatiskt genererade koden på fliken körningsartefakter om din modell loggas med ett giltigt indataexempel.

from mlflow.models import validate_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

serving_payload = """{
 "messages": [
   {
     "content": "How many product categories are there?",
     "role": "user"
   }
 ]
}
"""

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

Du kan också testa indataexempel mot den loggade modellen med hjälp av convert_input_example_to_serving_input API för att generera en giltig json-serveringsindata.

from mlflow.models import validate_serving_input
from mlflow.models import convert_input_example_to_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

# Define INPUT_EXAMPLE with your own input example to the model
# A valid input example is a data instance suitable for pyfunc prediction

serving_payload = convert_input_example_to_serving_input(INPUT_EXAMPLE)

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

Felsökning efter att containerbygget har slutförts

Även om containern byggs lyckosamt kan det uppstå problem när du kör modellen eller under själva slutpunktens drift. Följande underavsnitt beskriver vanliga problem och hur du felsöker och avlusar

Beroende saknas

Du kan få ett fel som An error occurred while loading the model. No module named <module-name>.. Det här felet kan tyda på att ett beroende saknas i containern. Kontrollera att du har markerat alla beroenden som ska ingå i byggandet av containern. Var särskilt uppmärksam på anpassade bibliotek och se till att .whl filerna ingår som artefakter.

Loopar för tjänstloggar

Om konstruktionen av containern misslyckas, kontrollerar du tjänstloggarna för att se om de går i en loop när slutpunkten försöker ladda modellen. Om du ser det här beteendet kan du prova följande steg:

  1. Öppna en notebook-fil och anslut till ett All-Purpose-kluster som använder en Databricks Runtime-version, inte Databricks Runtime för Machine Learning.
  2. Läs in modellen med MLflow och försök felsöka därifrån.

Du kan också läsa in modellen lokalt på datorn och felsöka därifrån. Läs in din modell lokalt med hjälp av följande:

import os
import mlflow

os.environ["MLFLOW_TRACKING_URI"] = "databricks://PROFILE"

ARTIFACT_URI = "model_uri"
if '.' in ARTIFACT_URI:
    mlflow.set_registry_uri('databricks-uc')
local_path = mlflow.artifacts.download_artifacts(ARTIFACT_URI)
print(local_path)

conda env create -f local_path/artifact_path/conda.yaml
conda activate mlflow-env

mlflow.pyfunc.load_model(local_path/artifact_path)

Modellen misslyckas eller överskrider tidsgränsen när begäranden skickas till slutpunkten

Du kan få ett fel som Encountered an unexpected error while evaluating the model. Verify that the input is compatible with the model for inference. när predict() anropas på din modell.

Det finns ett kodproblem i predict() funktionen. Databricks rekommenderar att du läser in modellen från MLflow i en notebook-fil och anropar den. När du gör det visas problemen i predict() funktionen, och du kan se var felet inträffar i metoden.

Grundorsaksanalys av misslyckade förfrågningar

Om en begäran till en slutpunkt misslyckas kan du utföra en rotorsaksanalys med hjälp av inferenstabeller. Slutsatsdragningstabeller loggar automatiskt alla begäranden och svar till slutpunkten i en Unity Catalog-tabell där du kan fråga.

För att köra förfrågningar mot inferenstabeller:

  1. På arbetsytan går du till fliken Servering och väljer slutpunktsnamnet.
  2. I avsnittet Slutsatsdragningstabeller hittar du slutsatsdragningstabellens fullständigt kvalificerade namn. Till exempel my-catalog.my-schema.my-table.
  3. Kör följande i en Databricks-notebook-fil:
    %sql
    SELECT * FROM my-catalog.my-schema.my-table
    
  4. Visa och filtrera på kolumner som request, responseoch request_timestatus_code för att förstå begäranden och begränsa resultaten.
    %sql
    SELECT * FROM my-catalog.my-schema.my-table
    WHERE status_code != 200
    
  5. Om du har aktiverat agentspårning för AI-agenter kan du läsa kolumnen Svar för att visa detaljerade spårningar. Se Aktivera slutsatsdragningstabeller för AI-agenter.

Arbetsytan överskrider etablerad samtidighet

Du kan få ett Workspace exceeded provisioned concurrency quota fel.

Du kan öka samtidigheten beroende på regionens tillgänglighet. Kontakta Databricks-teamet som ansvarar för ditt konto och ange ditt arbetsyte-ID för att begära ett ökat antal samtidiga processer.

Felsökning efter fel vid containerbygge

Det här avsnittet beskriver problem som kan uppstå när bygget misslyckas.

OSError: [Errno 28] No space left on device

Felet No space left kan bero på att för många stora artefakter loggas tillsammans med modellen i onödan. Granska i MLflow att onödiga artefakter inte loggas tillsammans med modellen och försök att driftsätta om det nedbantade paketet.

Azure Firewall-problem med serveringsmodeller från Unity Catalog

Du kan se felet: Build could not start due to an internal error. If you are serving a model from UC and Azure Firewall is enabled, this is not supported by default..

Kontakta ditt Databricks-kontoteam för att lösa problemet.

Byggfel på grund av bristande GPU-tillgänglighet

Du kan se felet: Build could not start due to an internal error - please contact your Databricks representative..

Kontakta ditt Databricks-kontoteam för att lösa problemet.