Verpacken eines registrierten Modells mit Docker
In diesem Artikel wird gezeigt, wie ein registriertes Azure Machine Learning-Modell mit Docker verpackt werden kann.
Voraussetzungen
In diesem Artikel wird davon ausgegangen, dass Sie bereits ein Modell in Ihrem Machine Learning-Arbeitsbereich trainiert und registriert haben. In diesem Tutorial erfahren Sie, wie Sie ein Scikit-learn-Modell trainieren und registrieren können.
Paketmodelle
In einigen Fällen kann es ratsam sein, ein Docker-Image zu erstellen, ohne das Modell bereitzustellen. Oder Sie möchten das Image herunterladen und in einer lokalen Docker-Installation ausführen. Es könnte sogar vorkommen, dass Sie die für die Imageerstellung verwendeten Dateien herunterladen, untersuchen und ändern und das Image dann manuell erstellen möchten.
Diese Schritte können Sie bei der Modellpaketerstellung ausführen. Dabei werden alle Ressourcen, die zum Hosten eines Modells als Webdienst benötigt werden, in einem Paket zusammengefasst, und Sie erhalten die Möglichkeit, entweder ein vollständig erstelltes Docker-Image oder die zum Erstellen eines solchen Images erforderlichen Dateien herunterzuladen. Es gibt zwei Möglichkeiten, die Modellpaketerstellung zu verwenden:
Herunterladen eines Modellpakets: Laden Sie ein Docker-Image herunter, in dem das Modell und die anderen Dateien enthalten sind, die dazu erforderlich sind, es als Webdienst zu hosten.
Generieren eines Dockerfile: Laden Sie das Dockerfile, das Modell, das Eingabeskript und andere Ressourcen herunter, die zum Erstellen eines Docker-Images benötigt werden. Sie können dann die Dateien untersuchen oder Änderungen daran vornehmen, bevor Sie das Image lokal erstellen.
Beide Pakete können verwendet werden, um ein lokales Docker-Image abzurufen.
Tipp
Das Erstellen eines Pakets ist mit dem Bereitstellen eines Modells vergleichbar. Sie verwenden ein registriertes Modell und eine Rückschlusskonfiguration.
Wichtig
Damit Sie ein vollständig erstelltes Image herunterladen oder ein Image lokal erstellen können, muss Docker in Ihrer Entwicklungsumgebung installiert sein.
Herunterladen eines Modellpakets
Im folgenden Beispiel wird ein Image erstellt, das in der Azure-Containerregistrierung für Ihren Arbeitsbereich registriert wird:
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
Nachdem Sie ein Paket erstellt haben, können Sie package.pull()
verwenden, um das Image per Pullvorgang in Ihre lokale Docker-Umgebung zu übertragen. In der Ausgabe dieses Befehls wird der Name des Images angezeigt. Beispiel:
Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338
.
Nachdem Sie das Modell heruntergeladen haben, verwenden Sie den docker images
-Befehl, um die lokalen Images aufzulisten:
REPOSITORY TAG IMAGE ID CREATED SIZE
myworkspacef78fd10.azurecr.io/package 20190822181338 7ff48015d5bd 4 minutes ago 1.43 GB
Um einen lokalen Container auf Basis dieses Images zu starten, verwenden Sie den folgenden Befehl, um einen benannten Container aus der Shell oder Befehlszeile zu starten. Ersetzen Sie den <imageid>
-Wert durch die Image-ID, die vom Befehl docker images
zurückgegeben wurde.
docker run -p 6789:5001 --name mycontainer <imageid>
Mit diesem Befehl wird die aktuelle Version des Images mit dem Namen myimage
gestartet. Der Befehl ordnet den lokalen Port 6789 dem Port des Containers zu, an dem der Webdienst lauscht (5001). Außerdem weist der Befehl dem Container den Namen mycontainer
zu, wodurch ein Beenden des Containers vereinfacht wird. Nachdem der Container gestartet wurde, können Sie Anforderungen an http://localhost:6789/score
senden.
Generieren eines Dockerfile und Generieren von Abhängigkeiten
Im folgenden Beispiel wird gezeigt, wie Sie das Dockerfile, das Modell und andere Ressourcen herunterladen, die erforderlich sind, um ein Image lokal zu erstellen. Mit dem Parameter generate_dockerfile=True
ist angegeben, dass Sie kein vollständig erstelltes Image, sondern die Dateien herunterladen möchten.
package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)
Mit diesem Code werden die Dateien heruntergeladen, die zum Erstellen des Images im Verzeichnis imagefiles
benötigt werden. Das Dockerfile, das zu den gespeicherten Dateien gehört, verweist auf ein Basisimage in einer Azure-Containerregistrierung. Wenn Sie das Image in Ihrer lokalen Docker-Installation erstellen, müssen Sie die Adresse, den Benutzernamen und das Kennwort verwenden, um die Authentifizierung bei der Registrierung vorzunehmen. Führen Sie die folgenden Schritte aus, um das Image durch Verwenden einer lokalen Docker-Installation zu erstellen:
Verwenden Sie in einer Shell- oder Befehlszeilensitzung den folgenden Befehl, um für Docker die Authentifizierung bei Azure-Containerregistrierung durchzuführen. Ersetzen Sie
<address>
,<username>
und<password>
durch die Werte, die mitpackage.get_container_registry()
abgerufen wurden.docker login <address> -u <username> -p <password>
Verwenden Sie den folgenden Befehl, um das Image zu erstellen. Ersetzen Sie
<imagefiles>
durch den Pfad des Verzeichnisses, in dem die Dateien mitpackage.save()
gespeichert wurden.docker build --tag myimage <imagefiles>
Mit diesem Befehl wird der Imagename auf
myimage
festgelegt.
Verwenden Sie den Befehl docker images
, um zu überprüfen, ob das Image erstellt wurde. In der Liste sollte das Image myimage
angezeigt werden:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 2d5ee0bf3b3b 49 seconds ago 1.43 GB
myimage latest 739f22498d64 3 minutes ago 1.43 GB
Verwenden Sie den folgenden Befehl, um basierend auf diesem Image einen neuen Container zu starten:
docker run -p 6789:5001 --name mycontainer myimage:latest
Mit diesem Befehl wird die aktuelle Version des Images mit dem Namen myimage
gestartet. Der Befehl ordnet den lokalen Port 6789 dem Port des Containers zu, an dem der Webdienst lauscht (5001). Außerdem weist der Befehl dem Container den Namen mycontainer
zu, wodurch ein Beenden des Containers vereinfacht wird. Nachdem der Container gestartet wurde, können Sie Anforderungen an http://localhost:6789/score
senden.
Beispielclient zum Testen des lokalen Containers
Der folgende Code ist ein Beispiel für einen Python-Client, der mit dem Container verwendet werden kann:
import requests
import json
# URL for the web service.
scoring_uri = 'http://localhost:6789/score'
# Two sets of data to score, so we get two results back.
data = {"data":
[
[ 1,2,3,4,5,6,7,8,9,10 ],
[ 10,9,8,7,6,5,4,3,2,1 ]
]
}
# Convert to JSON string.
input_data = json.dumps(data)
# Set the content type.
headers = {'Content-Type': 'application/json'}
# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Beispielclients in anderen Programmiersprachen finden Sie unter Nutzen eines als Webdienst bereitgestellten Azure Machine Learning-Modells.
Beenden des Docker-Containers
Verwenden Sie zum Beenden des Containers den folgenden Befehl über eine andere Shell- oder Befehlszeileninstanz:
docker kill mycontainer
Nächste Schritte
- Problembehandlung bei einer fehlerhaften Bereitstellung
- Bereitstellen für Azure Kubernetes Service
- Erstellen von Clientanwendungen zum Nutzen von Webdiensten
- Aktualisieren des Webdiensts
- Wie man ein Modell mit einem benutzerdefinierten Docker-Image bereitstellt
- Verwenden von TLS zum Absichern eines Webdiensts mit Azure Machine Learning
- Überwachen Ihrer Azure Machine Learning-Modelle mit Application Insights
- Sammeln von Daten für Modelle in der Produktion
- Erstellen von Ereigniswarnungen und Triggern für Modellbereitstellungen