Dela via


Distribuera en maskininlärningsmodell till Azure Functions med Azure Cache for Redis

I den här artikeln distribuerar du en modell från Azure Machine Learning som en funktionsapp i Azure Functions med hjälp av en Azure Cache for Redis-instans.

Azure Cache for Redis är högpresterande och skalbart. När du parkopplas med en Azure Machine Learning-modell får du låg svarstid och högt dataflöde i ditt program. Ett par scenarier där en cache är fördelaktig: när du härleder data och för den faktiska modellinferensen. I båda scenariona lagras metadata eller resultat i minnet, vilket leder till ökad prestanda.

Kommentar

Även om både Azure Machine Learning och Azure Functions är allmänt tillgängliga är möjligheten att paketera en modell från Machine Learning-tjänsten för Functions i förhandsversion.

Förutsättningar

Viktigt!

Kodfragmenten i den här artikeln förutsätter att du har angett följande variabler:

  • ws – Din Azure Machine Learning-arbetsyta.
  • model – Den registrerade modell som ska distribueras.
  • inference_config – Inferenskonfigurationen för modellen.

Mer information om hur du ställer in dessa variabler finns i Distribuera modeller med Azure Machine Learning.

Skapa en Azure Cache for Redis-instans

Du kommer att kunna distribuera en maskininlärningsmodell till Azure Functions med valfri basic-, standard- eller Premium-cacheinstans. Följ dessa steg för att skapa en cacheinstans.

  1. Gå till startsidan för Azure Portal eller öppna sidomenyn och välj sedan Skapa en resurs.

  2. På sidan Nytt väljer du Databaser och sedan Azure Cache for Redis.

    Välj Azure Cache for Redis.

  3. På sidan Ny Redis Cache konfigurerar du inställningarna för din nya cache.

    Inställning Föreslaget värde beskrivning
    DNS-namn Ange ett globalt unikt namn. Cachenamnet måste vara en sträng mellan 1 och 63 tecken. Strängen får endast innehålla siffror, bokstäver eller bindestreck. Namnet måste börja och sluta med ett tal eller en bokstav och får inte innehålla bindestreck i följd. Värdnamnet för cacheinstansen är <DNS-namn.redis.cache.windows.net>.
    Abonnemang Listrutan och välj din prenumeration. Prenumerationen som den nya Azure Cache for Redis-instansen ska skapas under.
    Resursgrupp Listrutan och välj en resursgrupp eller välj Skapa ny och ange ett nytt resursgruppsnamn. Namn på den resursgrupp där cacheminnet och andra resurser ska skapas. Genom att placera alla dina appresurser i en resursgrupp kan du enkelt hantera eller ta bort dem tillsammans.
    Plats Listrutan och välj en plats. Välj en region nära andra tjänster som ska använda din cache.
    Prisnivå Listrutan och välj en prisnivå. Prisnivån avgör storlek, prestanda och funktioner som är tillgängliga för cacheminnet. Mer information finns i Översikt över Azure Cache for Redis.
  4. Välj fliken Nätverk eller välj knappen Nätverk längst ned på sidan.

  5. På fliken Nätverk väljer du din anslutningsmetod.

  6. Välj fliken Nästa: Avancerat eller välj knappen Nästa: Avancerat längst ned på sidan.

  7. På fliken Avancerat för en grundläggande cacheinstans eller standardcacheinstans väljer du aktivera om du vill aktivera en icke-TLS-port.

  8. På fliken Avancerat för Premium Cache-instans konfigurerar du inställningarna för icke-TLS-port, klustring och datapersistence.

  9. Välj fliken Nästa: Taggar eller välj knappen Nästa: Taggar längst ned på sidan.

  10. Du kan också ange namn och värde på fliken Taggar om du vill kategorisera resursen.

  11. Välj Granska + skapa. Du kommer till fliken Granska + skapa där Azure verifierar din konfiguration.

  12. När det gröna verifieringsmeddelandet har skickats väljer du Skapa.

Det tar en stund innan cacheminnet skapas. Du kan övervaka förloppet på översiktssidan för Azure Cache for Redis. När Status visas som Körs är cachen redo att användas.

Förbereda för distribution

Innan du distribuerar måste du definiera vad som krävs för att köra modellen som en webbtjänst. I följande lista beskrivs de kärnobjekt som behövs för en distribution:

  • Ett postskript. Det här skriptet accepterar begäranden, poängsätter begäran med hjälp av modellen och returnerar resultatet.

    Viktigt!

    Postskriptet är specifikt för din modell. Den måste förstå formatet på inkommande begärandedata, formatet på de data som förväntas av din modell och formatet på de data som returneras till klienterna.

    Om begärandedata är i ett format som inte kan användas av din modell kan skriptet omvandla dem till ett acceptabelt format. Det kan också transformera svaret innan det returneras till klienten.

    Som standard när du paketerar för funktioner behandlas indata som text. Om du är intresserad av att använda rådata för indata (till exempel blobutlösare) bör du använda AMLRequest för att acceptera rådata.

För körningsfunktionen kontrollerar du att den ansluter till en Redis-slutpunkt.

import json
import numpy as np
import os
import redis
from sklearn.externals import joblib

def init():
    global model
    global azrediscache
    azrediscache = redis.StrictRedis(host='<host_url>', port=6380, password="<access_key>", ssl=True)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    model = joblib.load(model_path)

@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        input = azrediscache.get(data)
        result = model.predict(input)
        data = np.array(json.loads(data))
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

Mer information om inmatningsskript finns i Definiera poängkod.

  • Beroenden, till exempel hjälpskript eller Python/Conda-paket som krävs för att köra inmatningsskriptet eller modellen

Dessa entiteter kapslas in i en inferenskonfiguration. Inferenskonfigurationen refererar till startskriptet och andra beroenden.

Viktigt!

När du skapar en slutsatsdragningskonfiguration för användning med Azure Functions måste du använda ett miljöobjekt . Observera att om du definierar en anpassad miljö måste du lägga till azureml-defaults med version >= 1.0.45 som ett pip-beroende. Det här paketet innehåller de funktioner som krävs för att vara värd för modellen som en webbtjänst. I följande exempel visas hur du skapar ett miljöobjekt och använder det med en slutsatsdragningskonfiguration:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults', 'redis'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

Mer information om miljöer finns i Skapa och hantera miljöer för utbildning och distribution.

Mer information om slutsatsdragningskonfiguration finns i Distribuera modeller med Azure Machine Learning.

Viktigt!

När du distribuerar till Functions behöver du inte skapa någon distributionskonfiguration.

Installera SDK-förhandsversionspaketet för functions-stöd

Om du vill skapa paket för Azure Functions måste du installera SDK-förhandsversionspaketet.

pip install azureml-contrib-functions

Skapa avbildningen

Om du vill skapa Docker-avbildningen som distribueras till Azure Functions använder du azureml.contrib.functions.package eller den specifika paketfunktionen för den utlösare som du vill använda. Följande kodfragment visar hur du skapar ett nytt paket med en HTTP-utlösare från modellen och inferenskonfigurationen:

Kommentar

Kodfragmentet förutsätter att det model innehåller en registrerad modell och som inference_config innehåller konfigurationen för slutsatsdragningsmiljön. Mer information finns i Distribuera modeller med Azure Machine Learning.

from azureml.contrib.functions import package
from azureml.contrib.functions import HTTP_TRIGGER
model_package = package(ws, [model], inference_config, functions_enabled=True, trigger=HTTP_TRIGGER)
model_package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(model_package.location)

När show_output=Truevisas utdata från Docker-byggprocessen. När processen är klar har avbildningen skapats i Azure Container Registry för din arbetsyta. När avbildningen har skapats visas platsen i Azure Container Registry. Platsen som returneras är i formatet <acrinstance>.azurecr.io/package@sha256:<imagename>.

Kommentar

Paketering för Functions stöder för närvarande HTTP-utlösare, blobutlösare och Service Bus-utlösare. Mer information om utlösare finns i Azure Functions-bindningar.

Viktigt!

Spara platsinformationen eftersom den används när avbildningen distribueras.

Distribuera avbildning som en webbapp

  1. Använd följande kommando för att hämta inloggningsuppgifterna för Azure Container Registry som innehåller avbildningen. Ersätt <myacr> med värdet som returnerades tidigare från package.location:

    az acr credential show --name <myacr>
    

    Utdata från det här kommandot liknar följande JSON-dokument:

    {
    "passwords": [
        {
        "name": "password",
        "value": "abcdefghijklmmopqrstuv1234567890"
        },
        {
        "name": "password2",
        "value": "1234567890abcdefghijklmmopqrstuv"
        }
    ],
    "username": "charlie.roy"
    }
    

    Spara värdet för användarnamn och ett av lösenorden.

  2. Om du inte redan har en resursgrupp eller apptjänstplan för att distribuera tjänsten visar dessa kommandon hur du skapar båda:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    I det här exemplet används en grundläggande prisnivå för Linux (--sku B1).

    Viktigt!

    Avbildningar som skapats av Azure Machine Learning använder Linux, så du måste använda parametern --is-linux .

  3. Skapa lagringskontot som ska användas för lagring av webbjobb och få dess anslutningssträng. Ersätt <webjobStorage> med det namn som du vill använda.

    az storage account create --name <webjobStorage> --location westeurope --resource-group myresourcegroup --sku Standard_LRS
    
    az storage account show-connection-string --resource-group myresourcegroup --name <webJobStorage> --query connectionString --output tsv
    
  4. Använd följande kommando för att skapa funktionsappen. Ersätt <app-name> med det namn som du vill använda. Ersätt <acrinstance> och <imagename> med värdena från som returnerades package.location tidigare. Ersätt <webjobStorage> med namnet på lagringskontot från föregående steg:

    az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
    

    Viktigt!

    Nu har funktionsappen skapats. Men eftersom du inte har angett anslutningssträng för HTTP-utlösaren eller autentiseringsuppgifterna till Azure Container Registry som innehåller avbildningen är funktionsappen inte aktiv. I nästa steg anger du anslutningssträng och autentiseringsinformation för containerregistret.

  5. Använd följande kommando för att ge funktionsappen de autentiseringsuppgifter som krävs för att komma åt containerregistret. Ersätt <app-name> med namnet på funktionsappen. Ersätt <acrinstance> och <imagetag> med värdena från AZ CLI-anropet i föregående steg. Ersätt <username> och <password> med ACR-inloggningsinformationen som hämtades tidigare:

    az functionapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package:<imagetag> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    Det här kommandot returnerar information som liknar följande JSON-dokument:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "[server-name].azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "[username]"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|[server-name].azurecr.io/package:20190827195524"
    }
    ]
    

Nu börjar funktionsappen läsa in avbildningen.

Viktigt!

Det kan ta flera minuter innan avbildningen har lästs in. Du kan övervaka förloppet med hjälp av Azure Portal.

Testa AZURE Functions HTTP-utlösare

Nu ska vi köra och testa vår Azure Functions HTTP-utlösare.

  1. Gå till funktionsappen i Azure Portal.
  2. Under utvecklare väljer du Kod + Test.
  3. Välj fliken Indata till höger.
  4. Välj knappen Kör för att testa HTTP-utlösaren för Azure Functions.

Nu har du distribuerat en modell från Azure Machine Learning som en funktionsapp med hjälp av en Azure Cache for Redis-instans. Läs mer om Azure Cache for Redis genom att gå till länkarna i avsnittet nedan.

Rensa resurser

Om du tänker fortsätta till nästa självstudie kan du behålla resurserna som du har skapat i den här självstudien och använda dem igen.

Om du är klar med snabbstarten kan du ta bort de Azure-resurser som du skapade i den här snabbstarten för att undvika avgifter.

Viktigt!

Att ta bort en resursgrupp kan inte ångras. När du tar bort en resursgrupp tas alla resurser som ingår i den bort permanent. Kontrollera att du inte av misstag tar bort fel resursgrupp eller resurser. Om du har skapat resurserna för att vara värd för det här exemplet i en befintlig resursgrupp som innehåller resurser som du vill behålla kan du ta bort varje resurs individuellt till vänster i stället för att ta bort resursgruppen.

Ta bort en resursgrupp

  1. Logga in på Azure-portalen och välj Resursgrupper.

  2. Skriv namnet på din resursgrupp i rutan Filtrera efter namn.... På din resursgrupp i resultatlistan väljer du ... och sedan Ta bort resursgrupp.

Du blir ombedd att bekräfta borttagningen av resursgruppen. Skriv namnet på din resursgrupp för att bekräfta och välj sedan Ta bort.

Efter en liten stund tas resursgruppen och de resurser som finns i den bort.

Nästa steg