Problemen oplossen met een implementatie van een lokaal model

Probeer een implementatie van een lokaal model als eerste stap bij het oplossen van problemen met de implementatie van Azure Container Instances (ACI) of Azure Kubernetes Service (AKS). Het gebruik van een lokale webservice maakt het gemakkelijker om veelvoorkomende implementatiefouten in Azure Machine Learning Docker-webservice te herkennen en op te lossen.

Vereisten

  • Een Azure-abonnement. Probeer de gratis of betaalde versie van Azure Machine Learning.
  • Optie A (aanbevolen): lokaal fouten opsporen in Azure Machine Learning Compute-exemplaar
    • Een Azure Machine Learning-werkruimte met een rekenproces dat wordt uitgevoerd
  • Optie B: lokaal fouten opsporen op uw rekenproces
  • Optie C: lokale foutopsporing inschakelen met Azure Machine Learning-deductie-HTTP-server.
    • De HTTP-server voor deductie van Azure Machine Learning is een Python-pakket waarmee u eenvoudig uw invoerscript (score.py) in een lokale ontwikkelomgeving kunt valideren. Als er een probleem is met het scorescript, retourneert de server een fout. Ook wordt de locatie van de fout geretourneerd.
    • De server kan ook worden gebruikt bij het maken van validatiepoorten in een pijplijn voor continue integratie en implementatie. Start bijvoorbeeld de server met het kandidaatscript en voer de testsuite uit op het lokale eindpunt.

HTTP-server voor azure Machine Learning-deductie

Met de lokale deductieserver kunt u snel fouten opsporen in uw invoerscript (score.py). Als het onderliggende scorescript een fout heeft, kan de server het model niet initialiseren of leveren. In plaats daarvan genereert het een uitzondering en de locatie waar de problemen zijn opgetreden. Meer informatie over HTTP-server voor azure Machine Learning-deductie

  1. Installeer het azureml-inference-server-http pakket vanuit de pypi-feed :

    python -m pip install azureml-inference-server-http
    
  2. Start de server en stel score.py deze in als het invoerscript:

    azmlinfsrv --entry_script score.py
    
  3. Verzend een scoreaanvraag naar de server met behulp van curl:

    curl -p 127.0.0.1:5001/score
    

Notitie

Meer informatie over veelgestelde vragen over Deductie-HTTP-server voor Azure Machine Learning.

Lokaal fouten opsporen

U vindt een voorbeeld van een lokaal implementatienotitieblok in de opslagplaats machineLearningNotebooks om een voorbeeld te verkennen dat kan worden uitgevoerd.

Waarschuwing

Implementaties van lokale webservices worden niet ondersteund voor productiescenario's.

Als u lokaal wilt implementeren, wijzigt u de code die u wilt gebruiken LocalWebservice.deploy_configuration() om een implementatieconfiguratie te maken. Gebruik vervolgens Model.deploy() om de service te implementeren. In het volgende voorbeeld wordt een model (opgenomen in de modelvariabele) geïmplementeerd als een lokale webservice:

VAN TOEPASSING OP: Python SDK azureml v1

from azureml.core.environment import Environment
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice


# Create inference configuration based on the environment definition and the entry script
myenv = Environment.from_conda_specification(name="env", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
# Create a local deployment, using port 8890 for the web service endpoint
deployment_config = LocalWebservice.deploy_configuration(port=8890)
# Deploy the service
service = Model.deploy(
    ws, "mymodel", [model], inference_config, deployment_config)
# Wait for the deployment to complete
service.wait_for_deployment(True)
# Display the port that the web service is available on
print(service.port)

Als u uw eigen YAML voor conda-specificatie definieert, geeft u versie azureml-defaults >= 1.0.45 weer als pip-afhankelijkheid. Dit pakket is nodig om het model als een webservice te hosten.

Op dit moment kunt u als normaal met de service werken. De volgende code laat zien hoe gegevens naar de service worden verzonden:

import json

test_sample = json.dumps({'data': [
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
]})

test_sample = bytes(test_sample, encoding='utf8')

prediction = service.run(input_data=test_sample)
print(prediction)

Zie Omgevingen maken en beheren voor training en implementatie voor meer informatie over het aanpassen van uw Python-omgeving.

De service bijwerken

Tijdens lokale tests moet u het score.py bestand mogelijk bijwerken om logboekregistratie toe te voegen of om eventuele problemen op te lossen die u hebt gedetecteerd. Als u wijzigingen in het score.py bestand opnieuw wilt laden, gebruikt u reload(). Met de volgende code wordt bijvoorbeeld het script voor de service opnieuw geladen en worden er vervolgens gegevens naar verzonden. De gegevens worden beoordeeld met behulp van het bijgewerkte score.py bestand:

Belangrijk

De reload methode is alleen beschikbaar voor lokale implementaties. Zie hoe u uw webservice bijwerkt voor informatie over het bijwerken van een implementatie naar een ander rekendoel.

service.reload()
print(service.run(input_data=test_sample))

Notitie

Het script wordt opnieuw geladen vanaf de locatie die is opgegeven door het InferenceConfig object dat door de service wordt gebruikt.

Als u het model, Conda-afhankelijkheden of de implementatieconfiguratie wilt wijzigen, gebruikt u update(). In het volgende voorbeeld wordt het model bijgewerkt dat door de service wordt gebruikt:

service.update([different_model], inference_config, deployment_config)

De service verwijderen

Als u de service wilt verwijderen, gebruikt u delete().

Het Docker-logboek inspecteren

U kunt gedetailleerde logboekberichten van docker-engine afdrukken vanuit het serviceobject. U kunt het logboek voor ACI-, AKS- en lokale implementaties bekijken. In het volgende voorbeeld ziet u hoe u de logboeken afdrukt.

# if you already have the service object handy
print(service.get_logs())

# if you only know the name of the service (note there might be multiple services with the same name but different version number)
print(ws.webservices['mysvc'].get_logs())

Als de regel Booting worker with pid: <pid> meerdere keren in de logboeken optreedt, betekent dit dat er onvoldoende geheugen is om de werkrol te starten. U kunt de fout oplossen door de waarde van memory_gb in te verhogen deployment_config

Volgende stappen

Meer informatie over implementatie: