Risoluzione dei problemi relativi alla distribuzione modello remoto
Informazioni su come risolvere i problemi o trovare soluzioni alternative per gli errori comuni che possono verificarsi durante la distribuzione di un modello in Istanze di Azure Container (ACI) e al servizio Azure Kubernetes usando Azure Machine Learning.
Nota
Se si distribuisce un modello nel servizio Azure Kubernetes, è consigliabile abilitare Monitoraggio di Azure per il cluster. Ciò consente di comprendere l'integrità complessiva del cluster e l'utilizzo delle risorse. Potrebbero essere utili anche le risorse seguenti:
- Controllare la presenza di eventi di Integrità risorse che influiscono sul cluster del servizio Azure Kubernetes
- Diagnostica del servizio Azure Kubernetes
Se si sta tentando di distribuire un modello in un cluster non integro o sovraccarico, è prevedibile che si verifichino problemi. Per assistenza nella risoluzione dei problemi del cluster del servizio Azure Kubernetes, contattare il supporto del servizio Azure Kubernetes.
Prerequisiti
Una sottoscrizione di Azure. Provare la versione gratuita o a pagamento di Azure Machine Learning.
Estensione dell'interfaccia della riga di comando v1 per Azure Machine Learning.
Importante
Alcuni comandi dell'interfaccia della riga di comando (CLI) di Azure in questo articolo usano l'estensione
azure-cli-ml
, o v1, per Azure Machine Learning. L'assistenza per l'estensione v1 terminerà il 30 settembre 2025. Sarà possibile installare e usare l'estensione v1 fino a tale data.Consigliamo di passare all'estensione
ml
, o v2, prima del 30 settembre 2025. Per altre informazioni sull'estensione v2, vedere Estensione dell'interfaccia della riga di comando di Azure ML e l’SDK Python v2.
Passaggi per la distribuzione tramite Docker di modelli di Machine Learning
Quando si distribuisce un modello in un ambiente di calcolo non locale in Azure Machine Learning, vengono eseguite le operazioni seguenti:
- Il Dockerfile specificato nell'oggetto Environments in InferenceConfig viene inviato al cloud, insieme al contenuto della directory di origine
- Se non è disponibile un'immagine compilata in precedenza nel registro contenitori, una nuova immagine Docker viene compilata nel cloud e archiviata nel registro contenitori predefinito dell'area di lavoro.
- L'immagine Docker dal registro contenitori viene scaricata nella destinazione di calcolo.
- L'archivio BLOB predefinito dell'area di lavoro viene montato nella destinazione di calcolo, consentendo l'accesso ai modelli registrati
- Il server Web viene inizializzato eseguendo la funzione
init()
dello script di immissione - Quando il modello distribuito riceve una richiesta, la funzione
run()
gestisce tale richiesta
La differenza principale quando si usa una distribuzione locale è che l'immagine del contenitore è basata sul computer locale, motivo per cui è necessario che Docker sia installato per una distribuzione locale.
Comprendere questi passaggi generali consente di capire dove si verificano gli errori.
Ottenere i log di distribuzione
Il primo passaggio del debug degli errori consiste nell'ottenere i log di distribuzione. Innanzitutto, seguire le istruzioni qui per connettersi all'area di lavoro.
SI APPLICA A: Estensione ML dell’interfaccia della riga di comando di Azure v1
Per ottenere i log da un servizio Web distribuito, eseguire le operazioni seguenti:
az ml service get-logs --verbose --workspace-name <my workspace name> --name <service name>
Eseguire il debug in locale
Se si verificano problemi durante la distribuzione di un modello in ACI o AKS, distribuirlo come servizio Web locale. L'utilizzo di un servizio Web locale rende più semplice la risoluzione dei problemi. Per risolvere i problemi relativi a una distribuzione in locale, vedere l'articolo sulla risoluzione dei problemi locali.
Server HTTP di inferenza di Azure Machine Learning
Il server di inferenza locale consente di eseguire rapidamente il debug dello script di immissione (score.py
). Nel caso in cui lo script del punteggio sottostante abbia un bug, il server non riesce a inizializzare o gestire il modello. Genera invece un'eccezione e la posizione in cui si sono verificati i problemi. Altre informazioni sul server HTTP di inferenza di Azure Machine Learning
Installare il pacchetto
azureml-inference-server-http
dal feed pypi:python -m pip install azureml-inference-server-http
Avviare il server e impostare
score.py
come script di immissione:azmlinfsrv --entry_script score.py
Inviare una richiesta di assegnazione di punteggio al server tramite
curl
:curl -p 127.0.0.1:5001/score
Nota
Domande frequenti sul server HTTP di inferenza di Azure Machine Learning.
Non è possibile pianificare il contenitore
Quando si distribuisce un servizio in una destinazione di calcolo del servizio Kubernetes di Azure, Azure Machine Learning tenta di pianificare il servizio con la quantità di risorse richiesta. Se, dopo 5 minuti, nel cluster non sono disponibili nodi con la quantità appropriata di risorse, la distribuzione avrà esito negativo. Il messaggio di errore è Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00
. Per risolvere questo errore, è possibile aggiungere più nodi, modificare lo SKU dei nodi o modificare i requisiti di risorse del servizio.
Il messaggio di errore indicherà in genere la risorsa non sufficiente. Ad esempio, se viene visualizzato un messaggio di errore che indica 0/3 nodes are available: 3 Insufficient nvidia.com/gpu
, che significa che il servizio richiede GPU e che nel cluster sono presenti tre nodi che non hanno GPU disponibili. È possibile risolvere questo problema aggiungendo altri nodi se si usa uno SKU GPU, passando a uno SKU abilitato per GPU in caso contrario, o modificando l'ambiente in modo da non richiedere GPU.
Errore di avvio del servizio
Dopo aver creato correttamente l'immagine, il sistema tenta di avviare un contenitore usando la configurazione della distribuzione. Nell'ambito del processo di avvio del contenitore, il sistema richiama la funzione init()
nello script di assegnazione dei punteggi. Se la funzione init()
contiene eccezioni non rilevate, nel messaggio di errore potrebbe essere visualizzato l'errore CrashLoopBackOff.
Usare le informazioni presenti nell'articolo Esaminare il log di Docker.
Errore di avvio di azureml-fe-aci del contenitore
Quando si distribuisce un servizio in una destinazione di calcolo dell'istanza di contenitore di Azure, Azure Machine Learning tenta di creare un contenitore front-end con il nome azureml-fe-aci
per la richiesta di inferenza. Se azureml-fe-aci
si arresta in modo anomalo, è possibile visualizzare i log eseguendo az container logs --name MyContainerGroup --resource-group MyResourceGroup --subscription MySubscription --container-name azureml-fe-aci
. È possibile seguire il messaggio di errore nei log per apportare la correzione.
L'errore più comune per azureml-fe-aci
è che il certificato o la chiave SSL forniti non sono validi.
Errore della funzione: get_model_path()
Nella funzione init()
dello script di assegnazione dei punteggi viene spesso chiamata la funzione Model.get_model_path() per individuare un file di modello o una cartella di file di modello nel contenitore. Se non è possibile trovare il file o la cartella del modello, la funzione ha esito negativo. Il modo più semplice per eseguire il debug di questo errore consiste nell'eseguire il codice Python seguente nella shell del contenitore:
Si applica a: Python SDK azureml v1
from azureml.core.model import Model
import logging
logging.basicConfig(level=logging.DEBUG)
print(Model.get_model_path(model_name='my-best-model'))
Questo esempio consente di visualizzare il percorso locale (relativo a /var/azureml-app
) nel contenitore in cui si prevede che lo script di assegnazione dei punteggi trovi il file o la cartella di modello. È quindi possibile verificare se il file o la cartella si trova effettivamente dove dovrebbe essere.
L'impostazione del livello di registrazione su DEBUG potrebbe causare la registrazione di informazioni aggiuntive che potrebbero essere utili per identificare l'errore.
Errore della funzione: run(input_data)
Se il servizio viene distribuito correttamente, ma si arresta in modo anomalo quando si pubblicano dati nell'endpoint di assegnazione dei punteggi, è possibile aggiungere un'istruzione di rilevamento degli errori nella funzione run(input_data)
in modo che restituisca il messaggio di errore dettagliato. Ad esempio:
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})
Nota: la restituzione di messaggi di errore dalla chiamata a run(input_data)
dovrebbe essere eseguita solo a scopo di debug. Per motivi di sicurezza, non si devono restituire i messaggi di errore in questo modo in un ambiente di produzione.
Codice di stato HTTP 502
Un codice di stato 502 indica che il servizio ha generato un'eccezione o si è arrestato in modo anomalo nel metodo run()
del file score.py. Usare le informazioni presenti in questo articolo per eseguire il debug del file.
Codice di stato HTTP 503
Le distribuzioni del servizio Azure Kubernetes supportano il ridimensionamento automatico, che consente di aggiungere repliche per supportare un carico aggiuntivo. Il ridimensionamento automatico è progettato per gestire modifiche graduali nel carico. Se si ricevono picchi elevati di richieste al secondo, i client potrebbero ricevere un codice di stato HTTP 503. Anche se il ridimensionamento automatico reagisce rapidamente, il servizio Azure Kubernetes richiede molto tempo per creare più contenitori.
Le decisioni per aumentare o ridurre le prestazioni si basano sull'utilizzo delle repliche dei contenitori correnti. Il numero di repliche occupate (che hanno una richiesta di elaborazione in corso) diviso per il numero totale di repliche correnti è l'utilizzo corrente. Se questo numero supera autoscale_target_utilization
, vengono create più repliche. Se è inferiore, le repliche vengono ridotte. Le decisioni per aggiungere repliche sono veloci e immediate (circa 1 secondo). Le decisioni per rimuovere le repliche sono conservative (circa 1 minuto). Per impostazione predefinita, l'uso della destinazione per il ridimensionamento automatico è impostato su 70%, che significa che il servizio è in grado di gestire picchi di richieste al secondo (RPS) fino al 30%.
Esistono due elementi che consentono di prevenire codici di stato 503:
Suggerimento
Questi due approcci possono essere usati singolarmente o combinati.
Modificare il livello di utilizzo a cui il ridimensionamento automatico crea nuove repliche. È possibile regolare la destinazione di utilizzo impostando
autoscale_target_utilization
su un valore inferiore.Importante
Questa modifica non comporta la creazione di repliche più velocemente. Vengono invece create con una soglia di utilizzo inferiore. Anziché attendere fino al 70% di utilizzo del servizio, la modifica del valore su 30% comporta la creazione di repliche quando si verifica l'utilizzo al 30%.
Se il servizio Web sta già usando le repliche massime correnti e vengono ancora visualizzati codici di stato 503, aumentare il valore di
autoscale_max_replicas
per aumentare il numero massimo di repliche.Modificare il numero minimo di repliche. L'aumento delle repliche minime offre un pool più grande per gestire i picchi in ingresso.
Per aumentare il numero minimo di repliche, impostare
autoscale_min_replicas
su un valore più elevato. È possibile calcolare le repliche richieste usando il codice seguente, sostituendo i valori con valori specifici del progetto: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)
Nota
Se si ricevono picchi di richiesta di dimensioni maggiori di quelle che possono essere gestite dalle nuove repliche minime, si potrebbero ricevere nuovamente codici di stato 503. Ad esempio, mano a mano che il traffico verso il servizio aumenta, potrebbe essere necessario aumentare le repliche minime.
Per altre informazioni sull'impostazione di autoscale_target_utilization
, autoscale_max_replicas
e autoscale_min_replicas
, vedere il riferimento al modulo AksWebservice.
Codice di stato HTTP 504
Un codice di stato 504 indica che si è verificato il timeout della richiesta. Il timeout predefinito è 1 minuto.
È possibile aumentare il timeout o provare ad accelerare il servizio modificando il file score.py per rimuovere le chiamate non necessarie. Se queste azioni non consentono di risolvere il problema, usare le informazioni contenute in questo articolo per eseguire il debug del file score.py. Il codice potrebbe trovarsi in uno stato non reattivo o in un ciclo infinito.
Altri messaggi di errore
Eseguire queste azioni per gli errori seguenti:
Error | Risoluzione |
---|---|
errore di conflitto 409 | Quando un'operazione è già in corso, qualsiasi nuova operazione nello stesso servizio Web risponderà con un errore di conflitto 409. Ad esempio, se l'operazione di creazione o aggiornamento del servizio Web è in corso e, se si attiva una nuova operazione di eliminazione, viene generato un errore. |
Errore di compilazione di immagini durante la distribuzione del servizio Web | Aggiungere "pynacl==1.2.1" come dipendenza pip al file Conda per la configurazione dell'immagine |
['DaskOnBatch:context_managers.DaskOnBatch', 'setup.py']' died with <Signals.SIGKILL: 9> |
Modificare lo SKU per le macchine virtuali usate nella distribuzione in un'istanza con più memoria. |
Errore FPGA | Non è possibile distribuire i modelli in FPGA fino a quando non viene richiesta e approvata la quota FPGA. Per richiedere l'accesso, compilare il modulo di richiesta della quota: https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2nac9-PZhBDnNSV2ITz0LNUN0U5S0hXRkNITk85QURTWk9ZUUFUWkkyTC4u |
Debug avanzato
Potrebbe essere necessario eseguire il debug interattivo del codice Python contenuto nella distribuzione modello. Ad esempio, se l'esecuzione dello script di immissione non viene completata e non è possibile determinare il motivo con una registrazione aggiuntiva. Usando Visual Studio Code e debugpy, è possibile connettersi al codice in esecuzione all'interno del contenitore Docker.
Per altre informazioni, vedere il debug interattivo nella guida di VS Code.
Forum utenti sulla distribuzione modello
Passaggi successivi
Altre informazioni sulla distribuzione: