Risolvere i problemi di distribuzione dei modelli
La distribuzione di un servizio coinvolge numerosi elementi, tra cui il modello sottoposto a training, la configurazione dell'ambiente di runtime, lo script di assegnazione dei punteggi, l'immagine del contenitore e l'host contenitore. La risoluzione dei problemi relativi a una distribuzione non riuscita, o di un errore durante l'utilizzo di un servizio distribuito, può essere complessa.
Controllare lo stato del servizio
Come primo passaggio per la risoluzione dei problemi, è possibile controllare lo stato di un servizio:
from azureml.core.webservice import AksWebservice
# Get the deployed service
service = AksWebservice(name='classifier-service', workspace=ws)
# Check its state
print(service.state)
Nota
Per visualizzare lo stato di un servizio, è necessario usare il tipo di servizio specifico della risorsa di calcolo (ad esempio AksWebservice) e non un oggetto WebService generico.
Lo stato di un servizio operativo deve essere Integro.
Esaminare i log del servizio
Se un servizio non è integro o si verificano errori durante l'uso, è possibile esaminare i relativi log:
print(service.get_logs())
I log includono informazioni dettagliate sul provisioning del servizio e sulle richieste elaborate e spesso possono consentire di risalire alla causa di errori imprevisti.
Eseguire la distribuzione in un contenitore locale
Gli errori di distribuzione e di runtime possono essere più semplici da diagnosticare se si distribuisce il servizio come contenitore in un'istanza locale di Docker, come indicato di seguito:
from azureml.core.webservice import LocalWebservice
deployment_config = LocalWebservice.deploy_configuration(port=8890)
service = Model.deploy(ws, 'test-svc', [model], inference_config, deployment_config)
È quindi possibile testare il servizio distribuito localmente con l'SDK:
print(service.run(input_data = json_data))
Si possono poi risolvere i problemi di runtime apportando modifiche al file di punteggio a cui si fa riferimento nella configurazione dell'inferenza e ricaricando il servizio senza ridistribuirlo (operazione che può essere eseguita solo con un servizio locale):
service.reload()
print(service.run(input_data = json_data))