Dela via


Paketera en registrerad modell med Docker

Den här artikeln visar hur du paketar en registrerad Azure Mašinsko učenje-modell med Docker.

Förutsättningar

Den här artikeln förutsätter att du redan har tränat och registrerat en modell på din maskininlärningsarbetsyta. Följ den här självstudien om du vill lära dig hur du tränar och registrerar en scikit-learn-modell.

Paketmodeller

I vissa fall kanske du vill skapa en Docker-avbildning utan att distribuera modellen. Eller så kanske du vill ladda ned avbildningen och köra den på en lokal Docker-installation. Du kanske till och med vill ladda ned de filer som används för att skapa avbildningen, inspektera dem, ändra dem och skapa avbildningen manuellt.

Med modellpaketering kan du göra dessa saker. Alla tillgångar som behövs för att vara värd för en modell paketeras som en webbtjänst och gör att du kan ladda ned antingen en färdigbyggd Docker-avbildning eller de filer som behövs för att skapa en. Det finns två sätt att använda modellpaketering:

Ladda ned en paketerad modell: Ladda ned en Docker-avbildning som innehåller modellen och andra filer som behövs för att vara värd för den som en webbtjänst.

Generera en Dockerfile: Ladda ned Dockerfile, modell, postskript och andra tillgångar som behövs för att skapa en Docker-avbildning. Du kan sedan inspektera filerna eller göra ändringar innan du skapar avbildningen lokalt.

Båda paketen kan användas för att hämta en lokal Docker-avbildning.

Dricks

Att skapa ett paket påminner om att distribuera en modell. Du använder en registrerad modell och en slutsatsdragningskonfiguration.

Viktigt!

Om du vill ladda ned en helt byggd avbildning eller skapa en avbildning lokalt måste du ha Docker installerat i utvecklingsmiljön.

Ladda ned en paketerad modell

I följande exempel skapas en avbildning som är registrerad i Azure-containerregistret för din arbetsyta:

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)

När du har skapat ett paket kan du använda package.pull() för att hämta avbildningen till din lokala Docker-miljö. Utdata från det här kommandot visar namnet på avbildningen. Till exempel:

Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338.

När du har laddat ned modellen använder docker images du kommandot för att lista de lokala avbildningarna:

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
myworkspacef78fd10.azurecr.io/package    20190822181338      7ff48015d5bd        4 minutes ago       1.43 GB

Om du vill starta en lokal container baserat på den här avbildningen använder du följande kommando för att starta en namngiven container från gränssnittet eller kommandoraden. Ersätt värdet <imageid> med det avbildnings-ID som returneras av docker images kommandot.

docker run -p 6789:5001 --name mycontainer <imageid>

Det här kommandot startar den senaste versionen av avbildningen med namnet myimage. Den mappar lokal port 6789 till porten i containern där webbtjänsten lyssnar (5001). Det tilldelar också namnet mycontainer till containern, vilket gör containern enklare att stoppa. När containern har startats kan du skicka begäranden till http://localhost:6789/score.

Generera en Dockerfile och beroenden

I följande exempel visas hur du laddar ned Dockerfile, modellen och andra tillgångar som behövs för att skapa en avbildning lokalt. Parametern generate_dockerfile=True anger att du vill ha filerna, inte en helt byggd avbildning.

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)

Den här koden laddar ned de filer som behövs för att skapa avbildningen imagefiles till katalogen. Dockerfile som ingår i de sparade filerna refererar till en basavbildning som lagras i ett Azure-containerregister. När du skapar avbildningen på din lokala Docker-installation måste du använda adressen, användarnamnet och lösenordet för att autentisera till registret. Använd följande steg för att skapa avbildningen med hjälp av en lokal Docker-installation:

  1. Använd följande kommando från ett gränssnitt eller en kommandoradssession för att autentisera Docker med Azure-containerregistret. Ersätt <address>, <username>och <password> med de värden som hämtas av package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Använd följande kommando för att skapa avbildningen. Ersätt <imagefiles> med sökvägen till katalogen där package.save() filerna sparades.

    docker build --tag myimage <imagefiles>
    

    Det här kommandot anger avbildningsnamnet till myimage.

Om du vill kontrollera att avbildningen har skapats använder du docker images kommandot . Du bör se bilden myimage i listan:

REPOSITORY      TAG                 IMAGE ID            CREATED             SIZE
<none>          <none>              2d5ee0bf3b3b        49 seconds ago      1.43 GB
myimage         latest              739f22498d64        3 minutes ago       1.43 GB

Om du vill starta en ny container baserat på den här avbildningen använder du följande kommando:

docker run -p 6789:5001 --name mycontainer myimage:latest

Det här kommandot startar den senaste versionen av avbildningen med namnet myimage. Den mappar lokal port 6789 till porten i containern där webbtjänsten lyssnar (5001). Det tilldelar också namnet mycontainer till containern, vilket gör containern enklare att stoppa. När containern har startats kan du skicka begäranden till http://localhost:6789/score.

Exempelklient för att testa den lokala containern

Följande kod är ett exempel på en Python-klient som kan användas med containern:

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)

Exempelklienter på andra programmeringsspråk finns i Använda modeller som distribuerats som webbtjänster.

Stoppa Docker-containern

Om du vill stoppa containern använder du följande kommando från ett annat gränssnitt eller en annan kommandorad:

docker kill mycontainer

Nästa steg