Een machine learning-model implementeren in Azure Functions met Azure Cache voor Redis
In dit artikel implementeert u een model van Azure Machine Learning als functie-app in Azure Functions met behulp van een Azure Cache voor Redis exemplaar.
Azure Cache voor Redis is presterend en schaalbaar. Wanneer u bent gekoppeld aan een Azure Machine Learning-model, krijgt u lage latentie en hoge doorvoer in uw toepassing. Een aantal scenario's waarbij een cache nuttig is: bij het deductie van de gegevens en voor de werkelijke modeldeductieresultaten. In beide scenario's worden de metagegevens of resultaten opgeslagen in het geheugen, wat leidt tot betere prestaties.
Notitie
Hoewel zowel Azure Machine Learning als Azure Functions algemeen beschikbaar zijn, is de mogelijkheid om een model te verpakken vanuit de Machine Learning-service voor Functions in preview.
Vereisten
- Azure-abonnement: maak er gratis een.
- Een Azure Machine Learning-werkruimte. Zie het artikel Een werkruimte maken voor meer informatie.
- Azure CLI.
- Een getraind machine learning-model dat is geregistreerd in uw werkruimte. Als u geen model hebt, gebruikt u de zelfstudie afbeeldingsclassificatie: train model om er een te trainen en te registreren.
Belangrijk
Bij de codefragmenten in dit artikel wordt ervan uitgegaan dat u de volgende variabelen hebt ingesteld:
ws
- Uw Azure Machine Learning-werkruimte.model
- Het geregistreerde model dat wordt geïmplementeerd.inference_config
- De deductieconfiguratie voor het model.
Zie Modellen implementeren met Azure Machine Learning voor meer informatie over het instellen van deze variabelen.
Een instantie van Azure Cache voor Redis maken
U kunt een machine learning-model implementeren in Azure Functions met elk Basic-, Standard- of Premium-cache-exemplaar. Volg deze stappen om een cache-exemplaar te maken.
Ga naar de startpagina van Azure Portal of open het zijbalkmenu en selecteer Een resource maken.
Selecteer op de pagina Nieuw de optie Databases en selecteer vervolgens Azure Cache voor Redis.
Configureer op de pagina Nieuwe Redis-cache de instellingen voor de nieuwe cache.
Instelling Voorgestelde waarde Beschrijving DNS-naam Voer een wereldwijd unieke naam in. De cachenaam moet een tekenreeks tussen 1 en 63 tekens zijn. De tekenreeks kan alleen cijfers, letters of afbreekstreepjes bevatten. De naam moet beginnen en eindigen met een cijfer of letter en mag geen opeenvolgende afbreekstreepjes bevatten. De hostnaam van uw cache-exemplaar is <DNS-naam.redis.cache.windows.net>. Abonnement Open de vervolgkeuzelijst en selecteer uw abonnement. Het abonnement waarmee dit nieuwe Azure Cache voor Redis-exemplaar wordt gemaakt. Resourcegroep Open de vervolgkeuzelijst en selecteer een resourcegroep of kies Nieuwe maken en geef een naam voor de nieuwe resourcegroep op. Naam voor de resourcegroep waarin de cache en andere resources moeten worden gemaakt. Door al uw app-resources in één resourcegroep te plaatsen, kunt u ze eenvoudig beheren of verwijderen. Location Open de vervolgkeuzelijst en selecteer een locatie. Selecteer een regio in de buurt van andere services die gaan gebruikmaken van de cache. Prijscategorie Open de vervolgkeuzelijst en selecteer een Prijscategorie. De prijscategorie bepaalt de grootte, prestaties en functies die beschikbaar zijn voor de cache. Zie het Azure Cache voor Redis-overzicht voor meer informatie. Selecteer het tabblad Netwerken of selecteer de knop Netwerken onderaan de pagina.
Selecteer uw verbindingsmethode op het tabblad Netwerk.
Selecteer het tabblad Volgende: Geavanceerd of selecteer de knop Volgende: Geavanceerd onderaan de pagina.
Selecteer in het tabblad Geavanceerd voor een basic of standard cache-exemplaar de schakeloptie inschakelen als u een niet-TLS-poort wilt inschakelen.
Configureer in het tabblad Geavanceerd voor premium cache-exemplaar de instellingen voor een niet-TLS-poort, clustering en gegevenspersistentie.
Selecteer het tabblad Volgende: Tags of selecteer de knop Volgende: Tags onderaan de pagina.
Voer desgewenst in het tabblad Tags de naam en waarde in om de resource te categoriseren.
Selecteer Controleren + maken. Het tabblad Beoordelen + maken wordt weergegeven, waar uw configuratie wordt gevalideerd in Azure.
Selecteer Maken nadat het groene bericht Validatie geslaagd verschijnt.
Het duurt even voor de cache is gemaakt. U kunt de voortgang bekijken op de overzichtspagina van Azure Cache voor Redis. Als u bij Status Wordt uitgevoerd ziet staan, kunt u de cache gebruiken.
Implementatie voorbereiden
Voordat u het implementeert, moet u definiëren wat er nodig is om het model als een webservice uit te voeren. In de volgende lijst worden de kernitems beschreven die nodig zijn voor een implementatie:
Een invoerscript. Dit script accepteert aanvragen, beoordeelt de aanvraag met behulp van het model en retourneert de resultaten.
Belangrijk
Het invoerscript is specifiek voor uw model; het moet inzicht hebben in de indeling van de binnenkomende aanvraaggegevens, de indeling van de gegevens die door uw model worden verwacht en de indeling van de gegevens die worden geretourneerd aan clients.
Als de aanvraaggegevens een indeling hebben die niet kan worden gebruikt door uw model, kan het script deze transformeren in een acceptabele indeling. Het kan ook het antwoord transformeren voordat het naar de client wordt geretourneerd.
Bij het verpakken van functies wordt de invoer standaard behandeld als tekst. Als u geïnteresseerd bent in het verbruik van de onbewerkte bytes van de invoer (bijvoorbeeld voor Blob-triggers), moet u AMLRequest gebruiken om onbewerkte gegevens te accepteren.
Zorg ervoor dat de run-functie verbinding maakt met een Redis-eindpunt.
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
Zie Scorecode definiëren voor meer informatie over invoerscripts.
- Afhankelijkheden, zoals helperscripts of Python/Conda-pakketten die nodig zijn om het invoerscript of model uit te voeren
Deze entiteiten worden ingekapseld in een deductieconfiguratie. De deductieconfiguratie verwijst naar het invoerscript en andere afhankelijkheden.
Belangrijk
Wanneer u een deductieconfiguratie maakt voor gebruik met Azure Functions, moet u een omgevingsobject gebruiken. Als u een aangepaste omgeving definieert, moet u azureml-defaults toevoegen met versie >= 1.0.45 als pip-afhankelijkheid. Dit pakket bevat de functionaliteit die nodig is om het model als webservice te hosten. In het volgende voorbeeld ziet u hoe u een omgevingsobject maakt en gebruikt met een deductieconfiguratie:
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)
Zie Omgevingen maken en beheren voor training en implementatie voor meer informatie over omgevingen.
Zie Modellen implementeren met Azure Machine Learning voor meer informatie over deductieconfiguratie.
Belangrijk
Bij de implementatie in Functions hoeft u geen implementatieconfiguratie te maken.
Het SDK-preview-pakket voor Functions-ondersteuning installeren
Als u pakketten voor Azure Functions wilt bouwen, moet u het SDK Preview-pakket installeren.
pip install azureml-contrib-functions
De installatiekopie maken
Als u de Docker-installatiekopie wilt maken die is geïmplementeerd in Azure Functions, gebruikt u azureml.contrib.functions.package of de specifieke pakketfunctie voor de trigger die u wilt gebruiken. In het volgende codefragment ziet u hoe u een nieuw pakket maakt met een HTTP-trigger vanuit het model en deductieconfiguratie:
Notitie
In het codefragment wordt ervan uitgegaan dat het model
een geregistreerd model bevat en dat inference_config
de configuratie voor de deductieomgeving bevat. Zie Modellen implementeren met Azure Machine Learning voor meer informatie.
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)
Wanneer show_output=True
wordt de uitvoer van het Docker-buildproces weergegeven. Zodra het proces is voltooid, is de installatiekopieën gemaakt in Azure Container Registry voor uw werkruimte. Zodra de installatiekopie is gemaakt, wordt de locatie in uw Azure Container Registry weergegeven. De geretourneerde locatie heeft de indeling <acrinstance>.azurecr.io/package@sha256:<imagename>
.
Notitie
Pakketten voor Functies ondersteunen momenteel HTTP-triggers, Blob-triggers en Service Bus-triggers. Zie Azure Functions-bindingen voor meer informatie over triggers.
Belangrijk
Sla de locatiegegevens op, omdat deze wordt gebruikt bij het implementeren van de installatiekopieën.
Installatiekopieën implementeren als een web-app
Gebruik de volgende opdracht om de aanmeldingsreferenties op te halen voor azure Container Registry die de installatiekopieën bevat. Vervang
<myacr>
door de waarde die eerder is geretourneerd doorpackage.location
:az acr credential show --name <myacr>
De uitvoer van deze opdracht is vergelijkbaar met het volgende JSON-document:
{ "passwords": [ { "name": "password", "value": "abcdefghijklmmopqrstuv1234567890" }, { "name": "password2", "value": "1234567890abcdefghijklmmopqrstuv" } ], "username": "charlie.roy" }
Sla de waarde voor de gebruikersnaam en een van de wachtwoorden op.
Als u nog geen resourcegroep of app service-plan hebt om de service te implementeren, laten deze opdrachten zien hoe u beide kunt maken:
az group create --name myresourcegroup --location "West Europe" az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
In dit voorbeeld wordt een Basisprijscategorie (
--sku B1
) voor Linux gebruikt.Belangrijk
Installatiekopieën die zijn gemaakt door Azure Machine Learning maken gebruik van Linux, dus u moet de
--is-linux
parameter gebruiken.Maak het opslagaccount dat moet worden gebruikt voor de webtaakopslag en haal de bijbehorende verbindingsreeks op. Vervang
<webjobStorage>
door de naam die u wilt gebruiken.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
Gebruik de volgende opdracht om de functie-app te maken. Vervang
<app-name>
door de naam die u wilt gebruiken. Vervang<acrinstance>
en<imagename>
door de waarden die u eerder hebt geretourneerdpackage.location
. Vervang<webjobStorage>
door de naam van het opslagaccount uit de vorige stap:az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
Belangrijk
Op dit moment is de functie-app gemaakt. Omdat u echter niet de verbindingsreeks hebt opgegeven voor de HTTP-trigger of referenties voor de Azure Container Registry die de installatiekopieën bevat, is de functie-app niet actief. In de volgende stappen geeft u de verbindingsreeks en de verificatiegegevens voor het containerregister op.
Als u de functie-app wilt voorzien van de referenties die nodig zijn voor toegang tot het containerregister, gebruikt u de volgende opdracht. Vervang
<app-name>
door de naam van de functie-app. Vervang<acrinstance>
en<imagetag>
door de waarden uit de AZ CLI-aanroep in de vorige stap. Vervang en vervang<username>
de<password>
ACR-aanmeldingsgegevens die u eerder hebt opgehaald: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>
Met deze opdracht wordt informatie geretourneerd die vergelijkbaar is met het volgende JSON-document:
[ { "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" } ]
Op dit moment begint de functie-app met het laden van de afbeelding.
Belangrijk
Het kan enkele minuten duren voordat de installatiekopieën zijn geladen. U kunt de voortgang bewaken met behulp van Azure Portal.
HTTP-trigger van Azure Functions testen
We gaan nu de HTTP-trigger van Azure Functions uitvoeren en testen.
- Ga naar uw functie-app in Azure Portal.
- Selecteer onder Ontwikkelaar de optie Code + Test.
- Selecteer aan de rechterkant het tabblad Invoer .
- Selecteer op de knop Uitvoeren om de HTTP-trigger van Azure Functions te testen.
U hebt nu een model vanuit Azure Machine Learning geïmplementeerd als een functie-app met behulp van een Azure Cache voor Redis-exemplaar. Meer informatie over Azure Cache voor Redis vindt u door naar de koppelingen in de onderstaande sectie te navigeren.
Resources opschonen
Als u verder wilt gaan met de volgende zelfstudie, kunt u de resources die u in deze snelstart hebt gemaakt, behouden en opnieuw gebruiken.
Als u klaar bent met de quickstart, kunt u de Azure-resources die u in deze quickstart hebt gemaakt, verwijderen om kosten te voorkomen.
Belangrijk
Het verwijderen van een resourcegroep kan niet ongedaan worden gemaakt. Wanneer u een resourcegroep verwijdert, worden alle resources in de groep definitief verwijderd. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de resources hebt gemaakt voor het hosten van dit voorbeeld in een bestaande resourcegroep die resources bevat die u wilt behouden, kunt u elke resource afzonderlijk aan de linkerkant verwijderen in plaats van de resourcegroep te verwijderen.
Een resourcegroep verwijderen
Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.
Typ in het vak Filteren op naam... de naam van de resourcegroep. Selecteer in de resourcegroep, in de resultatenlijst, de optie .... Selecteer vervolgens Resourcegroep verwijderen.
U wordt gevraagd om het verwijderen van de resourcegroep te bevestigen. Typ ter bevestiging de naam van de resourcegroep. Selecteer vervolgens Verwijderen.
Na enkele ogenblikken worden de resourcegroep en alle bijbehorende resources verwijderd.
Volgende stappen
- Meer informatie over Azure Cache voor Redis
- Meer informatie over het configureren van uw functie-app in de Functions-documentatie .
- Naslaginformatie voor API
- Een Python-app maken die gebruikmaakt van Azure Cache voor Redis