Bereitstellen von benutzerdefinierten Modellen
In diesem Artikel wird die Unterstützung für das Bereitstellen eines benutzerdefinierten Modells mithilfe von Mosaic AI Model Serving beschrieben. Darüber hinaus enthält er Details zu unterstützten Modellprotokollierungsoptionen und Computetypen, zum Packen von Modellabhängigkeiten für die Bereitstellung sowie zur Erstellung und Skalierung von Endpunkten.
Was sind benutzerdefinierte Modelle?
Model Serving kann jedes Python-Modell als API auf Produktionsniveau bereitstellen. Databricks bezeichnet solche Modelle als benutzerdefinierte Modelle. Diese ML-Modelle können mit ML-Standardbibliotheken wie scikit-learn, XGBoost, PyTorch und HuggingFace-Transformatoren trainiert werden und können jeden Python-Code enthalten.
So stellen Sie ein benutzerdefiniertes Modell bereit:
- Protokollieren Sie das Modell oder den Code im MLflow-Format, indem Sie entweder systemeigene integrierte MLflow-Varianten oder Pyfunc verwenden.
- Registrieren Sie das Modell anschließend im Unity Catalog (empfohlen) oder in der Arbeitsbereichsregistrierung.
- Jetzt können Sie einen Modellbereitstellungsendpunkt erstellen, um Ihr Modell bereitzustellen und abzufragen.
- Weitere Informationen finden Sie unter Erstellen von benutzerdefinierten Modellbereitstellungsendpunkten.
- Siehe Abfragen von Bereitstellungsendpunkten für benutzerdefinierte Modelle.
Ein vollständiges Tutorial zum Bereitstellen von benutzerdefinierten Modellen auf Databricks finden Sie im Modellbereitstellungstutorial.
Databricks unterstützt auch die Bereitstellung generativer KI-Modelle für generative KI-Anwendungen. Siehe Foundation Model-APIs und externe Modelle für unterstützte Modelle und Computeangebote.
Wichtig
Wenn Sie Anaconda nutzen, finden weitere Informationen in den Vertragsbedingungen.
Protokollieren von ML-Modellen
Es gibt verschiedene Methoden zum Protokollieren Ihres ML-Modells für die Modellbereitstellung. In der folgenden Liste sind die unterstützten Methoden und Beispiele zusammengefasst.
Automatische Protokollierung: Diese Methode wird automatisch aktiviert, wenn Databricks Runtime für ML verwendet wird.
import mlflow from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import load_iris iris = load_iris() model = RandomForestRegressor() model.fit(iris.data, iris.target)
Protokollieren mit integrierten MLflow-Varianten: Sie können diese Methode verwenden, wenn Sie das Modell manuell protokollieren möchten, um eine detailliertere Steuerung zu erhalten.
import mlflow from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() model = RandomForestClassifier() model.fit(iris.data, iris.target) with mlflow.start_run(): mlflow.sklearn.log_model(model, "random_forest_classifier")
Benutzerdefinierte Protokollierung mit
pyfunc
: Sie können diese Methode verwenden, um beliebige Python-Codemodelle bereitzustellen oder zusätzlichen Code zusammen mit Ihrem Modell bereitzustellen.import mlflow import mlflow.pyfunc class Model(mlflow.pyfunc.PythonModel): def predict(self, context, model_input): return model_input * 2 with mlflow.start_run(): mlflow.pyfunc.log_model("custom_model", python_model=Model())
Downloaden von HuggingFace. Sie können ein Modell direkt von Hugging Face herunterladen und dieses Modell zur Bereitstellung protokollieren. Beispiele finden Sie unter Notebookbeispiele.
Signatur- und Eingabebeispiele
Das Hinzufügen eines Signatur- und Eingabebeispiels zu MLflow wird empfohlen. Signaturen sind für die Protokollierung von Modellen im Unity Catalog erforderlich.
Nachfolgend sehen Sie ein Signaturbeispiel:
from mlflow.models.signature import infer_signature
signature = infer_signature(training_data, model.predict(training_data))
mlflow.sklearn.log_model(model, "model", signature=signature)
Nachfolgend sehen Sie ein Eingabebeispiel:
input_example = {"feature1": 0.5, "feature2": 3}
mlflow.sklearn.log_model(model, "model", input_example=input_example)
Computetyp
Mosaic AI Model Serving bietet eine Vielzahl von CPU- und GPU-Optionen für die Bereitstellung Ihres Modells. Bei der Bereitstellung mit einer GPU ist es wichtig, sicherzustellen, dass Ihr Code so eingerichtet ist, dass Vorhersagen mithilfe der von Ihrem Framework bereitgestellten Methoden auf der GPU ausgeführt werden. MLflow führt dies automatisch für Modelle aus, die mit den PyTorch- oder Transformers-Varianten protokolliert werden.
Workloadtyp | GPU-Instanz | Arbeitsspeicher |
---|---|---|
CPU |
4 GB pro Parallelität | |
GPU_SMALL |
1xT4 | 16 GB |
GPU_LARGE |
1xA100 | 80GB |
GPU_LARGE_2 |
2xA100 | 160GB |
Bereitstellungscontainer und Abhängigkeiten
Während der Bereitstellung wird ein Container auf Produktionsniveau erstellt und als Endpunkt bereitgestellt. Dieser Container enthält Bibliotheken, die automatisch erfasst oder im MLflow-Modell angegeben werden.
Der Modellbereitstellungscontainer enthält keine vorinstallierten Abhängigkeiten, was zu Abhängigkeitsfehlern führen kann, wenn nicht alle erforderlichen Abhängigkeiten im Modell enthalten sind. Wenn Modellbereitstellungsprobleme auftreten, empfiehlt Databricks, das Modell lokal zu testen.
Paket- und Codeabhängigkeiten
Benutzerdefinierte oder private Bibliotheken können Ihrer Bereitstellung hinzugefügt werden. Siehe Verwenden benutzerdefinierter Python-Bibliotheken mit Model Serving.
Bei nativen MLflow-Modellvarianten werden die erforderlichen Paketabhängigkeiten automatisch erfasst.
Für benutzerdefinierte pyfunc
/Modelle können Abhängigkeiten explizit hinzugefügt werden.
So können Sie Paketabhängigkeiten hinzufügen:
Mithilfe des
pip_requirements
-Parameters:mlflow.sklearn.log_model(model, "sklearn-model", pip_requirements = ["scikit-learn", "numpy"])
Mithilfe des
conda_env
-Parameters:conda_env = { 'channels': ['defaults'], 'dependencies': [ 'python=3.7.0', 'scikit-learn=0.21.3' ], 'name': 'mlflow-env' } mlflow.sklearn.log_model(model, "sklearn-model", conda_env = conda_env)
Verwenden Sie
extra_pip_requirements
, um zusätzliche Anforderungen, die nicht automatisch erfasst werden, einzuschließen.mlflow.sklearn.log_model(model, "sklearn-model", extra_pip_requirements = ["sklearn_req"])
Wenn Sie über Codeabhängigkeiten verfügen, können diese mithilfe von code_path
angegeben werden.
mlflow.sklearn.log_model(model, "sklearn-model", code_path=["path/to/helper_functions.py"],)
Abhängigkeitsüberprüfung
Bevor Sie ein benutzerdefiniertes MLflow-Modell bereitstellen, sollten Sie überprüfen, ob das Modell auch bedient werden kann. MLflow bietet eine API zur Validierung des Modellartefakts, die sowohl die Umgebung der Bereitstellung simuliert als auch das Testen von geänderten Abhängigkeiten ermöglicht.
Es gibt zwei APIs für die Validierung vor der Bereitstellung, die MLflow Python API und die MLflow CLI.
Mit einer dieser beiden APIs können Sie Folgendes angeben.
- Die
model_uri
des Modells, das für die Modellverwaltung bereitgestellt wird. - Einer der folgenden:
- Die
input_data
im erwarteten Format für denmlflow.pyfunc.PyFuncModel.predict()
-Aufruf des Modells. - Den
input_path
, der eine Datei mit Eingabedaten definiert, die geladen und für den Aufruf vonpredict
verwendet werden.
- Die
- Den
content_type
imcsv
- oderjson
-Format. - Einen optionalen
output_path
zum Schreiben der Vorhersagen in eine Datei. Wenn Sie diesen Parameter weglassen, werden die Vorhersagen instdout
geschrieben. - Ein Umgebungsmanager,
env_manager
, der zum Erstellen der Umgebung für die Bereitstellung verwendet wird:- Der Standardwert ist
virtualenv
. Empfohlen für die Überprüfung. local
ist verfügbar, aber möglicherweise fehleranfällig für die Überprüfung. Wird in der Regel nur für schnelles Debuggen verwendet.
- Der Standardwert ist
- Ob die aktuelle Version von MLflow, die sich in Ihrer Umgebung befindet, mit der virtuellen Umgebung über
install_mlflow
installiert werden soll. Diese Einstellung ist standardmäßig aufFalse
festgelegt. - Ob Sie verschiedene Versionen von Paketabhängigkeiten zur Problembehandlung oder Fehlersuche aktualisieren und testen möchten. Sie können dies als Liste von Zeichenfolgenabhängigkeiten angeben, die Sie mit dem Override-Argument
pip_requirements_override
überschreiben oder hinzufügen.
Zum Beispiel:
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"],
)
Updates für Abhängigkeiten
Wenn es Probleme mit den Abhängigkeiten gibt, die mit einem protokollierten Modell angegeben wurden, können Sie die Anforderungen mit Hilfe der MLflow CLI oder mlflow.models.model.update_model_requirements()
in der MLflow Python API aktualisieren, ohne ein weiteres Modell protokollieren zu müssen.
Das folgende Beispiel zeigt, wie Sie die pip_requirements.txt
eines protokollierten Modells direkt aktualisieren.
Sie können vorhandene Definitionen mit angegebenen Paketversionen aktualisieren oder der Datei pip_requirements.txt
nicht vorhandene Anforderungen hinzufügen. Diese Datei befindet sich im MLflow-Modellartefakt am angegebenen Speicherort model_uri
.
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"],
)
Erwartungen und Einschränkungen
In den folgenden Abschnitten werden bekannte Erwartungen und Einschränkungen für die Bereitstellung von benutzerdefinierten Modellen mithilfe von Model Serving beschrieben.
Erwartungen an die Erstellung und Aktualisierung von Endpunkten
Hinweis
Die Informationen in diesem Abschnitt gelten nicht für Endpunkte, die Basismodelle oder externe Modelle bereitstellen.
Die Bereitstellung einer neu registrierten Modellversion umfasst das Packen des Modells und seiner Modellumgebung sowie die Bereitstellung des Modellendpunkts selbst. Dieser Prozess kann ca. 10 Minuten dauern.
Azure Databricks führt ein Update ohne Ausfallzeiten für Endpunkte durch, indem die vorhandene Endpunktkonfiguration so lange beibehalten wird, bis der neue Endpunkt bereit ist. Dadurch wird das Risiko von Unterbrechungen für verwendete Endpunkte reduziert.
Wenn die Modellberechnung länger als 120 Sekunden dauert, wird ein Timeout für Anforderungen ausgeführt. Wenn Sie glauben, dass ihre Modellberechnung länger als 120 Sekunden dauert, wenden Sie sich an Ihr Azure Databricks-Kontoteam.
Databricks führt gelegentlich Systemupdates ohne Downtime und Wartung auf vorhandenen Modellbereitstellungsendpunkten durch. Während der Wartung lädt Databricks Modelle neu und kennzeichnet einen Endpunkt als fehlerhaft, wenn ein Modell nicht neu geladen werden kann. Stellen Sie sicher, dass Ihre angepassten Modelle robust sind und jederzeit neu geladen werden können.
Erwartungen an die Endpunktskalierung
Hinweis
Die Informationen in diesem Abschnitt gelten nicht für Endpunkte, die Basismodelle oder externe Modelle bereitstellen.
Die Bereitstellung von Endpunkten wird basierend auf dem Datenverkehr und der Kapazität der bereitgestellten Parallelitätseinheiten automatisch skaliert.
- Bereitgestellte Parallelität: Die maximale Anzahl paralleler Anforderungen, die das System verarbeiten kann. Sie können die erforderliche bereitgestellte Parallelität mithilfe der folgenden Formel schätzen: bereitgestellte Parallelität = Abfragen pro Sekunde (QPS) * Modellausführungszeit (s).
- Skalierungsverhalten: Endpunkte skalieren bei erhöhtem Datenverkehr fast sofort hoch, und sie skalieren alle fünf Minuten nach unten, um sich dem reduzierten Datenverkehr anzupassen.
- Skalierung auf Null: Endpunkte können nach 30 Minuten Inaktivität auf Null skaliert werden. Die erste Anforderung nach dem Skalieren auf Null erfährt einen „Kaltstart“, was zu einer höheren Latenz führt. Bei latenzsensiblen Anwendungen sollten Sie Strategien in Betracht ziehen, um diese Funktion effektiv zu verwalten.
Einschränkungen der GPU-Workload
Die folgenden Einschränkungen gelten für die Bereitstellung von Endpunkten mit GPU-Workloads:
- Das Erstellen von Containerimages für GPU-Bereitstellungen dauert aufgrund der Modellgröße und erhöhter Installationsanforderungen für Modelle, die auf der GPU bereitgestellt werden, länger als die Imageerstellung für die CPU-Bereitstellung.
- Bei der Bereitstellung sehr großer Modelle könnte ein Timeout für der Bereitstellungsprozess auftreten, wenn die Containerbuild- und Modellimplementierung eine Dauer von 60 Minuten überschreitet. In diesem Fall sollte das Modell beim Wiederholen des Prozesses erfolgreich bereitgestellt werden.
- Die automatische Skalierung dauert für die GPU-Bereitstellung länger als für die CPU-Bereitstellung.
- Die GPU-Kapazität wird beim Skalieren auf Null nicht garantiert. GPU-Endpunkte erwarten bei der ersten Anfrage nach der Skalierung auf Null möglicherweise eine besonders lange Wartezeit.
- Diese Funktionalität ist in
northcentralus
nicht verfügbar.
Anaconda-Lizenzierungsupdate
Der folgende Hinweis richtet sich an Kunden, die sich auf Anaconda verlassen.
Wichtig
Anaconda Inc. hat die Vertragsbedingungen für die Kanäle von anaconda.org aktualisiert. Gemäß den neuen Vertragsbedingungen benötigen Sie nun möglicherweise eine kommerzielle Lizenz für die Nutzung der Paket- und Verteilungslösung von Anaconda. Weitere Informationen finden Sie unter Anaconda Commercial Edition FAQ (Häufig gestellte Fragen zu Anaconda Commercial Edition). Jegliche Nutzung von Anaconda-Kanälen unterliegt den Anaconda-Vertragsbedingungen.
MLflow-Modelle, die vor v1.18 (Databricks Runtime 8.3 ML oder früher) wurden standardmäßig mit dem conda-defaults
Kanal (https://repo.anaconda.com/pkgs/) als Abhängigkeit protokolliert. Aufgrund dieser Lizenzänderung hat Databricks die Verwendung des defaults
-Kanals für Modelle beendet, die mit MLflow v1.18 und höher protokolliert werden. Der protokollierte Standardkanal ist jetzt conda-forge
, der auf die verwaltete Community https://conda-forge.org/ verweist.
Wenn Sie ein Modell vor MLflow v1.18 protokolliert haben, ohne den Kanal defaults
aus der conda-Umgebung für das Modell auszuschließen, hat dieses Modell möglicherweise eine Abhängigkeit vom Kanal defaults
, den die Sie möglicherweise nicht beabsichtigt haben.
Um manuell zu überprüfen, ob ein Modell diese Abhängigkeit aufweist, können Sie den Wert von channel
in der Datei conda.yaml
untersuchen, die mit dem protokollierten Modell gepackt ist. Beispielsweise sieht die Datei conda.yaml
eines Modells mit einer Abhängigkeit vom Kanal defaults
wie folgt aus:
channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
- mlflow
- scikit-learn==0.23.2
- cloudpickle==1.6.0
name: mlflow-env
Da Databricks nicht bestimmen kann, ob Ihre Verwendung des Anaconda-Repositorys für die Interaktion mit Ihren Modellen gemäß Ihrer Beziehung mit Anaconda zulässig ist, erzwingt Databricks keine Änderungen von der Kundschaft. Wenn Ihre Nutzung des Anaconda.com-Repositorys über die Verwendung von Databricks unter den Bedingungen von Anaconda zulässig ist, müssen Sie keine Maßnahmen ergreifen.
Wenn Sie den Kanal ändern möchten, der in der Umgebung eines Modells verwendet wird, können Sie das Modell mit einer neuen Datei conda.yaml
erneut bei der Modellregistrierung registrieren. Dazu geben Sie den Kanal im conda_env
-Parameter von log_model()
an.
Weitere Informationen zur log_model()
-API finden Sie in der MLflow-Dokumentation für die Modellvariante, mit der Sie arbeiten, zum Beispiel log_model für scikit-learn.
Weitere Informationen zu conda.yaml
-Dateien finden Sie in der MLflow-Dokumentation.
Zusätzliche Ressourcen
- Erstellen von benutzerdefinierten Modellbereitstellungsendpunkten
- Abfragen von Bereitstellungsendpunkten für benutzerdefinierte Modelle
- Verwenden benutzerdefinierter Python-Bibliotheken mit der Modellbereitstellung
- Packen von benutzerdefinierten Artefakten für die Modellbereitstellung
- Bereitstellen von Python-Code mit Model Serving
- Konfigurieren der Routenoptimierung für die Bereitstellung von Endpunkten
- Konfigurieren des Zugriffs auf Ressourcen über Modellbereitstellungsendpunkte