Problemen met de implementatie van externe modellen oplossen

Informatie over het oplossen en oplossen van veelvoorkomende fouten die kunnen optreden bij het implementeren van een model in Azure Container Instances (ACI) en Azure Kubernetes Service (AKS) met behulp van Azure Machine Learning.

Notitie

Als u een model implementeert naar Azure Kubernetes Service (AKS), raden we u aan om Azure Monitor voor dat cluster in te stellen. Dit helpt u inzicht te krijgen in de algehele clustertoestand en het resourcegebruik. Mogelijk vindt u de volgende resources ook nuttig:

Als u een model probeert te implementeren in een cluster dat niet in orde of overbelast is, zal dit naar verwachting problemen ervaren. Neem contact op met de ondersteuning van AKS als u hulp nodig hebt bij het oplossen van problemen met AKS-clusters.

Vereisten

Stappen voor docker-implementatie van machine learning modellen

Wanneer u een model implementeert op niet-lokale rekenkracht in Azure Machine Learning, gebeurt het volgende:

  1. Het Dockerfile dat u hebt opgegeven in het object Environments in uw InferenceConfig wordt verzonden naar de cloud, samen met de inhoud van uw bronmap
  2. Als een eerder gebouwde afbeelding niet beschikbaar is in uw containerregister, wordt er een nieuwe Docker-afbeelding in de cloud gebouwd en opgeslagen in het standaardcontainerregister van uw werkruimte.
  3. De Docker-afbeelding van uw containerregister wordt gedownload naar uw rekendoel.
  4. Het standaardblobopslag van uw werkruimte wordt aan uw rekendoel bevestigd, zodat u toegang hebt tot geregistreerde modellen
  5. Uw webserver wordt initialiseren door de functie van uw invoerscript uit te init() voeren
  6. Wanneer uw geïmplementeerde model een aanvraag ontvangt, verwerkt run() uw functie die aanvraag

Het belangrijkste verschil bij het gebruik van een lokale implementatie is dat de containerafbeelding is gebouwd op uw lokale computer. Daarom moet Docker zijn geïnstalleerd voor een lokale implementatie.

Als u deze stappen op hoog niveau begrijpt, kunt u beter begrijpen waar fouten optreden.

Implementatielogboeken op halen

De eerste stap bij het oplossen van fouten bestaat uit het opsporen van uw implementatielogboeken. Volg eerst de instructies hier om verbinding te maken met uw werkruimte.

Ga als volgende te werk om de logboeken van een geïmplementeerde webservice op te halen:

az ml service get-logs --verbose --workspace-name <my workspace name> --name <service name>

Lokaal fouten opsporen

Als u problemen hebt bij het implementeren van een model in ACI of AKS, implementeert u het als een lokale webservice. Het gebruik van een lokale webservice maakt het gemakkelijker om problemen op te lossen. Zie het artikel over lokale probleemoplossing als u lokale problemen met een implementatie wilt oplossen.

HTTP-server voor Azure Machine Learning-deferentie

Met de lokale deferentieserver 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 bedienen. In plaats daarvan wordt er een uitzondering & de locatie waar de problemen zijn opgetreden. Meer informatie over Azure Machine Learning http-server voor de deference

  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 in score.py als het invoerscript:

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

    curl -p 127.0.0.1:5001/score
    

Container kan niet worden gepland

Wanneer een service wordt geïmplementeerd in een Azure Kubernetes Service-rekendoel, wordt getracht de service te plannen met de aangevraagde hoeveelheid resources. Als er na vijf minuten geen knooppunten beschikbaar zijn in het cluster met de juiste hoeveelheid resources, mislukt de implementatie. Het foutbericht is Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00 . U kunt deze fout aanpakken door meer knooppunten toe te voegen, de SKU van uw knooppunten te wijzigen of de resourcevereisten van uw service te wijzigen.

Het foutbericht geeft doorgaans aan welke resource u meer nodig hebt, bijvoorbeeld als er een foutbericht wordt weergegeven dat aangeeft dat de service GPU's vereist en dat er drie knooppunten in het cluster zijn die geen beschikbare GPU's 0/3 nodes are available: 3 Insufficient nvidia.com/gpu hebben. Dit kan worden opgelost door meer knooppunten toe te voegen als u een GPU-SKU gebruikt. Schakel over naar een SKU met GPU als u dat niet doet of als u uw omgeving niet wilt wijzigen om geen GPU's te vereisen.

Starten van service mislukt

Nadat de installatie afbeelding is gemaakt, probeert het systeem een container te starten met behulp van uw implementatieconfiguratie. Als onderdeel van het op starten van een container wordt de init() functie in uw scorescript aangeroepen door het systeem. Als er niet-gevonden uitzonderingen in de init() functie zijn, ziet u mogelijk de CrashLoopBackOff-fout in het foutbericht.

Gebruik de informatie in het artikel Het Docker-logboek inspecteren.

Functie mislukt: get_model_path()

In de functie in het scorescript wordt init() vaak Model.get_model_path()-functie aangeroepen om een modelbestand of een map met modelbestanden in de container te zoeken. Als het modelbestand of de map niet wordt gevonden, mislukt de functie. De eenvoudigste manier om deze fout op te sporen, is door de onderstaande Python-code uit te voeren in de Container shell:

from azureml.core.model import Model
import logging
logging.basicConfig(level=logging.DEBUG)
print(Model.get_model_path(model_name='my-best-model'))

In dit voorbeeld wordt het lokale pad (ten opzichte van ) afgedrukt in de container waarin het scorescript verwacht het modelbestand of /var/azureml-app de modelmap te vinden. Vervolgens kunt u controleren of het bestand of de map inderdaad is waar het zich naar verwachting zou moeten zijn.

Als u het logboekregistratieniveau instelt op FOUTEN OPSPOREN, kan dit ertoe leiden dat er aanvullende informatie wordt geregistreerd. Dit kan handig zijn bij het identificeren van de fout.

Functie mislukt: run(input_data)

Als de service is geïmplementeerd, maar deze vast loopt wanneer u gegevens op het scoring-eindpunt plaatst, kunt u de instructie voor het verzamelen van fouten toevoegen aan uw functie, zodat er in plaats daarvan een gedetailleerd foutbericht wordt run(input_data) weergegeven. Bijvoorbeeld:

def run(input_data):
    try:
        data = json.loads(input_data)['data']
        data = np.array(data)
        result = model.predict(data)
        return json.dumps({"result": result.tolist()})
    except Exception as e:
        result = str(e)
        # return error message back to the client
        return json.dumps({"error": result})

Opmerking: het retourneren van foutberichten van run(input_data) de aanroep mag alleen worden uitgevoerd voor foutopsporing. Uit veiligheidsoverwegingen moet u geen foutberichten op deze manier retourneren in een productieomgeving.

HTTP-statuscode 502

Een 502-statuscode geeft aan dat de service een uitzondering heeft geworpen of is vastgelopen in de methode van het run() score.py bestand. Gebruik de informatie in dit artikel om fouten in het bestand op te sporen.

HTTP-statuscode 503

Azure Kubernetes Service implementaties bieden ondersteuning voor automatisch schalen, waardoor replica's kunnen worden toegevoegd ter ondersteuning van extra belasting. De automatische schaalverdeder is ontworpen om geleidelijke wijzigingen in de belasting af te handelen. Als u grote pieken in aanvragen per seconde ontvangt, kunnen clients een HTTP-statuscode 503 ontvangen. Hoewel de automatische schaalverdeder snel reageert, kost het AKS veel tijd om extra containers te maken.

Beslissingen voor omhoog/omlaag schalen zijn gebaseerd op het gebruik van de huidige containerreplica's. Het aantal replica's dat bezet is (een aanvraag verwerken) gedeeld door het totale aantal huidige replica's is het huidige gebruik. Als dit aantal groter is autoscale_target_utilization dan , worden er meer replica's gemaakt. Als deze lager is, worden replica's verminderd. Beslissingen voor het toevoegen van replica's zijn gretig en snel (ongeveer 1 seconde). Beslissingen voor het verwijderen van replica's zijn voorzichtig (ongeveer 1 minuut). Standaard wordt het doelgebruik voor automatisch schalen ingesteld op 70%, wat betekent dat de service pieken in aanvragen per seconde (RPS) van maximaal 30% kan verwerken.

Er zijn twee dingen die kunnen helpen om 503-statuscodes te voorkomen:

Tip

Deze twee benaderingen kunnen afzonderlijk of in combinatie worden gebruikt.

  • Wijzig het gebruiksniveau waarmee met automatische schalen nieuwe replica's worden gemaakt. U kunt het gebruiksdoel aanpassen door de in autoscale_target_utilization te stellen op een lagere waarde.

    Belangrijk

    Deze wijziging zorgt er niet voor dat replica's sneller worden gemaakt. In plaats daarvan worden ze gemaakt met een lagere drempelwaarde voor gebruik. In plaats van te wachten tot de service 70% wordt gebruikt, zorgt het wijzigen van de waarde in 30% ervoor dat replica's worden gemaakt wanneer 30% gebruik plaatsvindt.

    Als de webservice al gebruik maakt van de huidige maximale replica's en u nog steeds 503 statuscodes ziet, verhoogt u de waarde om het maximum aantal autoscale_max_replicas replica's te verhogen.

  • Wijzig het minimum aantal replica's. Het verhogen van de minimale replica's biedt een grotere pool voor het afhandelen van de binnenkomende pieken.

    Als u het minimale aantal replica's wilt verhogen, stelt autoscale_min_replicas u in op een hogere waarde. U kunt de vereiste replica's berekenen met behulp van de volgende code, en waarden vervangen door waarden die specifiek zijn voor uw project:

    from math import ceil
    # target requests per second
    targetRps = 20
    # time to process the request (in seconds)
    reqTime = 10
    # Maximum requests per container
    maxReqPerContainer = 1
    # target_utilization. 70% in this example
    targetUtilization = .7
    
    concurrentRequests = targetRps * reqTime / targetUtilization
    
    # Number of container replicas
    replicas = ceil(concurrentRequests / maxReqPerContainer)
    

    Notitie

    Als u aanvraagpieken ontvangt die groter zijn dan de nieuwe minimale replica's kunnen verwerken, ontvangt u mogelijk opnieuw 503-aanvragen. Als het verkeer naar uw service bijvoorbeeld toeneemt, moet u mogelijk de minimale replica's verhogen.

Zie de naslaginformatie over de autoscale_target_utilization autoscale_max_replicas autoscale_min_replicas AksWebservice-module voor meer informatie over het instellen van , en voor.

HTTP-statuscode 504

Een 504-statuscode geeft aan dat er een time-out is voor de aanvraag. De standaard time-out is 1 minuut.

U kunt de time-out verhogen of de service versnellen door de score.py onnodige aanroepen te verwijderen. Als deze acties het probleem niet oplossen, gebruikt u de informatie in dit artikel om fouten in het score.py op te sporen. De code heeft mogelijk een niet-responsieve status of een oneindige lus.

Andere foutberichten

Neem deze acties voor de volgende fouten:

Fout Oplossing
Fout bij het bouwen van afbeeldingen bij het implementeren van de webservice Voeg 'pynacl==1.2.1' toe als pip-afhankelijkheid aan het Conda-bestand voor de configuratie van afbeeldingen
['DaskOnBatch:context_managers.DaskOnBatch', 'setup.py']' died with <Signals.SIGKILL: 9> Wijzig de SKU voor VM's die in uw implementatie worden gebruikt in een SKU met meer geheugen.
FPGA-fout U kunt geen modellen implementeren op FPGA's totdat u het FPGA-quotum hebt aangevraagd en goedgekeurd. Als u toegang wilt aanvragen, vult u het quotumaanvraagformulier in: https://aka.ms/aml-real-time-ai

Geavanceerde debugging

Mogelijk moet u interactief fouten opsporen in de Python-code die in uw modelimplementatie is opgenomen. Bijvoorbeeld als het invoerscript mislukt en de reden niet kan worden bepaald door aanvullende logboekregistratie. Met behulp Visual Studio Code en de foutopsporingsopsporingscode kunt u koppelen aan de code die wordt uitgevoerd in de Docker-container.

Ga naar de handleiding interactieve debugging in VS Code voor meer informatie.

Gebruikersforum voor modelimplementatie

Volgende stappen

Meer informatie over implementatie: