Share via


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:

  1. 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 mit package.get_container_registry() abgerufen wurden.

    docker login <address> -u <username> -p <password>
    
  2. Verwenden Sie den folgenden Befehl, um das Image zu erstellen. Ersetzen Sie <imagefiles> durch den Pfad des Verzeichnisses, in dem die Dateien mit package.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