Condividi tramite


Risoluzione dei problemi relativi alla distribuzione di un modello locale

Provare una distribuzione del modello locale come primo passaggio nella risoluzione dei problemi di distribuzione in Istanze di Azure Container o nel servizio Azure Kubernetes. L'utilizzo di un servizio Web locale semplifica la localizzazione e la correzione di errori comuni di distribuzione del servizio Web Docker di Azure Machine Learning.

Prerequisiti

  • Una sottoscrizione di Azure. Provare la versione gratuita o a pagamento di Azure Machine Learning.
  • Opzione A (consigliata) - Eseguire il debug in locale nell'istanza di ambiente di calcolo di Azure Machine Learning
  • Opzione B - Eseguire il debug in locale nel computer
  • Opzione C - Abilitare il debug locale con il server HTTP di inferenza di Azure Machine Learning.
    • Il server HTTP di inferenza di Azure Machine Learning è un pacchetto Python che consente di convalidare facilmente lo script di immissione (score.py) in un ambiente di sviluppo locale. Se si verifica un problema con lo script di assegnazione dei punteggi, il server restituirà un errore. Restituirà anche la posizione in cui si è verificato l'errore.
    • Il server può essere usato anche quando si creano controlli di convalida in una pipeline di integrazione e distribuzione continue. Ad esempio, avviare il server con lo script candidato ed eseguire il gruppo di test sull'endpoint locale.

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 di punteggio sottostante abbia un bug, il server non riuscirà a inizializzare o gestire il modello. Genererà invece un'eccezione e la posizione in cui si sono verificati i problemi. Altre informazioni sul server HTTP di inferenza di Azure Machine Learning

  1. Installare il pacchetto azureml-inference-server-http dal feed pypi:

    python -m pip install azureml-inference-server-http
    
  2. Avviare il server e impostare score.py come script di immissione:

    azmlinfsrv --entry_script score.py
    
  3. Inviare una richiesta di assegnazione di punteggio al server tramite curl:

    curl -p 127.0.0.1:5001/score
    

Nota

Domande frequenti di Learn sul server HTTP di inferenza di Azure Machine Learning.

Eseguire il debug in locale

È possibile trovare un notebook di distribuzione locale di esempio nel repository MachineLearningNotebooks per esplorare un esempio eseguibile.

Avviso

Le distribuzioni di servizi Web locali non sono supportate per gli scenari di produzione.

Per eseguire la distribuzione localmente, modificare il codice per usare LocalWebservice.deploy_configuration() per creare una configurazione della distribuzione. Usare quindi Model.deploy() per distribuire il servizio. Nell'esempio seguente viene distribuito un modello (contenuto nella variabile del modello) come servizio Web locale:

Si applica a: 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)

Se si definisce una specifica CONDA YAML personalizzata, elencare la versione azureml-defaults >= 1.0.45 come dipendenza pip. Questo pacchetto è necessario per ospitare il modello come servizio Web.

A questo punto, è possibile usare il servizio come di consueto. Ad esempio, il codice seguente dimostra l'invio di dati al servizio:

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)

Per altre informazioni sulla personalizzazione dell'ambiente Python, vedere Creare e gestire ambienti per il training e la distribuzione.

Aggiornare il servizio

Durante i test locali, potrebbe essere necessario aggiornare il file score.py per aggiungere la registrazione o tentare di risolvere eventuali problemi individuati. Per ricaricare le modifiche apportate al file di score.py, usare reload(). Il codice seguente, ad esempio, consente di ricaricare lo script per il servizio e quindi di inviarvi dati. Il punteggio dei dati viene assegnato tramite il file score.py aggiornato:

Importante

Il metodo reload è disponibile solo per le distribuzioni locali. Per informazioni sull'aggiornamento di una distribuzione a un'altra destinazione di calcolo, vedere Come aggiornare il servizio Web.

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

Nota

Lo script viene ricaricato dalla posizione specificata dall'oggetto InferenceConfig usato dal servizio.

Per modificare il modello, le dipendenze Conda o la configurazione della distribuzione, usare update(). Nell'esempio seguente viene aggiornato il modello usato dal servizio:

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

Eliminare il servizio

Per eliminare il servizio, usare delete().

Esaminare il log di Docker

È possibile visualizzare i messaggi dettagliati del log del motore Docker dall'oggetto di servizio. È possibile visualizzare il log per ACI, AKS e distribuzioni locali. L'esempio seguente illustra come stampare i log.

# 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())

Se la riga Booting worker with pid: <pid> ricorre più volte nei log, significa che non è disponibile memoria sufficiente per avviare il ruolo di lavoro. È possibile risolvere l'errore aumentando il valore di memory_gb in deployment_config

Passaggi successivi

Altre informazioni sulla distribuzione: