Share via


Distribuire un modello di Machine Learning in Funzioni di Azure con cache di Azure per Redis

In questo articolo viene distribuito un modello da Azure Machine Learning come app per le funzioni in Funzioni di Azure usando un'istanza di cache di Azure per Redis.

cache di Azure per Redis è efficiente e scalabile. Quando si associa un modello di Azure Machine Learning, si ottiene una bassa latenza e una velocità effettiva elevata nell'applicazione. Un paio di scenari in cui una cache è utile: quando si inferiscono i dati e per i risultati effettivi dell'inferenza del modello. In uno scenario, i metadati o i risultati vengono archiviati in memoria, che comporta un aumento delle prestazioni.

Nota

Sebbene sia Azure Machine Learning che Funzioni di Azure siano disponibili a livello generale, la possibilità di creare un pacchetto di un modello dal servizio Machine Learning per Funzioni è in anteprima.

Prerequisiti

Importante

I frammenti di codice in questo articolo presuppongono che siano state impostate le variabili seguenti:

  • ws - Area di lavoro di Azure Machine Learning.
  • model - Modello registrato che verrà distribuito.
  • inference_config - Configurazione dell'inferenza per il modello.

Per altre informazioni sull'impostazione di queste variabili, vedere Distribuire modelli con Azure Machine Learning.

Creare un'istanza di Azure Cache per Redis

Sarà possibile distribuire un modello di Machine Learning in Funzioni di Azure con qualsiasi istanza di cache Basic, Standard o Premium. Per creare un'istanza della cache, seguire questa procedura.

  1. Passare alla home page portale di Azure o aprire il menu della barra laterale, quindi selezionare Crea una risorsa.

  2. Nella pagina Nuovo selezionare Database e quindi Cache di Azure per Redis.

    Selezionare cache di Azure per Redis.

  3. Nella pagina Nuova cache Redis configurare le impostazioni per la nuova cache.

    Impostazione Valore consigliato Descrizione
    Nome DNS Immettere un nome univoco globale. Il nome della cache deve essere una stringa compresa tra 1 e 63 caratteri. La stringa può contenere solo numeri, lettere o trattini. Il nome deve iniziare e terminare con un numero o una lettera e non può contenere trattini consecutivi. Il nome host dell'istanza della cache sarà <nome> DNS.redis.cache.windows.net.
    Sottoscrizione Nell'elenco a discesa selezionare la sottoscrizione. Sottoscrizione in cui creare la nuova istanza della cache di Azure per Redis.
    Gruppo di risorse Nell'elenco a discesa selezionare un gruppo di risorse oppure scegliere Crea nuovo e immettere il nome di un nuovo gruppo di risorse. Nome del gruppo di risorse in cui creare la cache e altre risorse. L'inserimento di tutte le risorse di un'app in un unico gruppo di risorse ne semplifica la gestione o l'eliminazione.
    Posizione Nell'elenco a discesa selezionare una località. Selezionare un'area in prossimità di altri servizi che useranno la cache.
    Piano tariffario Nell'elenco a discesa selezionare un piano tariffario. Il piano tariffario determina le dimensioni, le prestazioni e le funzionalità disponibili per la cache. Per altre informazioni, vedere la panoramica su Cache Redis di Azure.
  4. Selezionare la scheda Rete o selezionare il pulsante Rete nella parte inferiore della pagina.

  5. Nella scheda Rete selezionare il metodo di connettività.

  6. Selezionare la scheda Avanti: Avanzate o selezionare il pulsante Avanti: Avanzate nella parte inferiore della pagina.

  7. Nella scheda Avanzate per un'istanza della cache Basic o Standard selezionare l'interruttore Abilita se si vuole abilitare una porta non TLS.

  8. Nella scheda Avanzate per l'istanza della cache Premium configurare le impostazioni per la porta non TLS, il clustering e la persistenza dei dati.

  9. Selezionare la scheda Avanti: tag o selezionare il pulsante Avanti: Tag nella parte inferiore della pagina.

  10. Facoltativamente, nella scheda Tag immettere il nome e il valore se si vuole categorizzare la risorsa.

  11. Selezionare Rivedi e crea. Si viene reindirizzati alla scheda Rivedi e crea in cui Azure convalida la configurazione.

  12. Quando viene visualizzato il messaggio di convalida verde, selezionare Crea.

La creazione della cache richiede un po' di tempo. È possibile monitorare lo stato di avanzamento nella pagina Panoramica della cache di Azure per Redis. Quando l'elemento Stato indica In esecuzione, la cache è pronta per l'uso.

Preparare la distribuzione

Prima di distribuire, è necessario definire gli elementi necessari per eseguire il modello come servizio Web. L'elenco seguente descrive gli elementi principali necessari per una distribuzione:

  • Script di voce. Questo script accetta richieste, assegna un punteggio alla richiesta usando il modello e restituisce i risultati.

    Importante

    Lo script di voce è specifico del modello; deve comprendere il formato dei dati della richiesta in ingresso, il formato dei dati previsti dal modello e il formato dei dati restituiti ai client.

    Se i dati della richiesta sono in un formato non utilizzabile dal modello, lo script può trasformarli in un formato accettabile. Può anche trasformare la risposta prima di restituirla al client.

    Per impostazione predefinita, quando viene eseguito il pacchetto per le funzioni, l'input viene considerato come testo. Se si è interessati a usare i byte non elaborati dell'input (ad esempio per i trigger BLOB), è consigliabile usare AMLRequest per accettare dati non elaborati.

Per la funzione di esecuzione, assicurarsi che si connette a un endpoint Redis.

import json
import numpy as np
import os
import redis
from sklearn.externals import joblib

def init():
    global model
    global azrediscache
    azrediscache = redis.StrictRedis(host='<host_url>', port=6380, password="<access_key>", ssl=True)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    model = joblib.load(model_path)

@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        input = azrediscache.get(data)
        result = model.predict(input)
        data = np.array(json.loads(data))
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

Per altre informazioni sullo script di immissione, vedere Definire il codice di assegnazione dei punteggi.

  • Dipendenze, ad esempio script helper o pacchetti Python/Conda necessari per eseguire lo script di voce o il modello

Queste entità vengono incapsulate in una configurazione di inferenza. La configurazione di inferenza fa riferimento allo script di avvio e ad altre dipendenze.

Importante

Quando si crea una configurazione di inferenza da usare con Funzioni di Azure, è necessario usare un oggetto Environment. Si noti che se si definisce un ambiente personalizzato, è necessario aggiungere azureml-defaults con la versione >= 1.0.45 come dipendenza pip. Questo pacchetto contiene le funzionalità necessarie per ospitare il modello come servizio Web. L'esempio seguente illustra la creazione di un oggetto ambiente e l'uso con una configurazione di inferenza:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults', 'redis'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

Per altre informazioni sugli ambienti, vedere Creare e gestire ambienti per il training e la distribuzione.

Per altre informazioni sulla configurazione dell'inferenza, vedere Distribuire modelli con Azure Machine Learning.

Importante

Quando si distribuisce in Funzioni, non è necessario creare una configurazione di distribuzione.

Installare il pacchetto di anteprima SDK per il supporto di Funzioni

Per compilare pacchetti per Funzioni di Azure, è necessario installare il pacchetto di anteprima dell'SDK.

pip install azureml-contrib-functions

Creare l'immagine

Per creare l'immagine Docker distribuita in Funzioni di Azure, usare azureml.contrib.functions.package o la funzione del pacchetto specifica per il trigger che si vuole usare. Il frammento di codice seguente illustra come creare un nuovo pacchetto con un trigger HTTP dalla configurazione del modello e dell'inferenza:

Nota

Il frammento di codice presuppone che model contenga un modello registrato e che inference_config contenga la configurazione per l'ambiente di inferenza. Per altre informazioni, vedere Distribuire modelli con Azure Machine Learning.

from azureml.contrib.functions import package
from azureml.contrib.functions import HTTP_TRIGGER
model_package = package(ws, [model], inference_config, functions_enabled=True, trigger=HTTP_TRIGGER)
model_package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(model_package.location)

Quando show_output=True, viene visualizzato l'output del processo di compilazione Docker. Al termine del processo, l'immagine è stata creata nel Registro Azure Container per l'area di lavoro. Dopo aver compilato l'immagine, viene visualizzata la posizione nel Registro Azure Container. Il percorso restituito è nel formato <acrinstance>.azurecr.io/package@sha256:<imagename>.

Nota

La creazione di pacchetti per Funzioni supporta attualmente trigger HTTP, trigger BLOB e trigger del bus di servizio. Per altre informazioni sui trigger, vedere associazioni Funzioni di Azure.

Importante

Salvare le informazioni sulla posizione, perché vengono usate durante la distribuzione dell'immagine.

Distribuire un'immagine come app Web

  1. Usare il comando seguente per ottenere le credenziali di accesso per il Registro Azure Container che contiene l'immagine. Sostituire <myacr> con il valore restituito in precedenza da package.location:

    az acr credential show --name <myacr>
    

    L'output di questo comando è simile al documento JSON seguente:

    {
    "passwords": [
        {
        "name": "password",
        "value": "abcdefghijklmmopqrstuv1234567890"
        },
        {
        "name": "password2",
        "value": "1234567890abcdefghijklmmopqrstuv"
        }
    ],
    "username": "charlie.roy"
    }
    

    Salvare il valore per nome utente e una delle password.

  2. Se non si ha già un gruppo di risorse o un piano di servizio app per distribuire il servizio, questi comandi illustrano come creare entrambi:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    In questo esempio viene usato un piano tariffario di base (--sku B1).

    Importante

    Le immagini create da Azure Machine Learning usano Linux, quindi è necessario usare il --is-linux parametro .

  3. Creare l'account di archiviazione da usare per l'archiviazione del processo Web e ottenere la relativa stringa di connessione. Sostituire <webjobStorage> con il nome che si vuole usare.

    az storage account create --name <webjobStorage> --location westeurope --resource-group myresourcegroup --sku Standard_LRS
    
    az storage account show-connection-string --resource-group myresourcegroup --name <webJobStorage> --query connectionString --output tsv
    
  4. Per creare l'app per le funzioni, usare il comando seguente. Sostituire <app-name> con il nome che si vuole usare. Sostituire <acrinstance> e <imagename> con i valori restituiti in precedenza package.location . Sostituire <webjobStorage> con il nome dell'account di archiviazione del passaggio precedente:

    az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
    

    Importante

    A questo punto, l'app per le funzioni è stata creata. Tuttavia, poiché non è stata specificata la stringa di connessione per il trigger HTTP o le credenziali per il Registro Azure Container che contiene l'immagine, l'app per le funzioni non è attiva. Nei passaggi successivi si specificano la stringa di connessione e le informazioni di autenticazione per il registro contenitori.

  5. Per fornire all'app per le funzioni le credenziali necessarie per accedere al registro contenitori, usare il comando seguente. Sostituire <app-name> con il nome dell'app per le funzioni. Sostituire <acrinstance> e <imagetag> con i valori della chiamata dell'interfaccia della riga di comando az nel passaggio precedente. Sostituire <username> e <password> con le informazioni di accesso del Registro Azure Container recuperate in precedenza:

    az functionapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package:<imagetag> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    Questo comando restituisce informazioni simili al documento JSON seguente:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "[server-name].azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "[username]"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|[server-name].azurecr.io/package:20190827195524"
    }
    ]
    

A questo punto, l'app per le funzioni inizia a caricare l'immagine.

Importante

Il caricamento dell'immagine potrebbe richiedere alcuni minuti. È possibile monitorare lo stato di avanzamento usando il portale di Azure.

Testare Funzioni di Azure trigger HTTP

A questo punto verrà eseguito e testato il trigger HTTP Funzioni di Azure.

  1. Passare all'app per le funzioni nel portale di Azure.
  2. In Sviluppatore selezionare Codice e test.
  3. Sul lato destro selezionare la scheda Input .
  4. Selezionare il pulsante Esegui per testare il trigger HTTP Funzioni di Azure.

È stato ora distribuito un modello da Azure Machine Learning come app per le funzioni usando un'istanza di cache di Azure per Redis. Per altre informazioni su cache di Azure per Redis, passare ai collegamenti nella sezione seguente.

Pulire le risorse

Se si prosegue con l'esercitazione successiva, è possibile conservare le risorse create in questa guida introduttiva e riutilizzarle.

In caso contrario, se la guida introduttiva è stata completata, è possibile eliminare le risorse di Azure create in questa guida introduttiva per evitare addebiti.

Importante

L'eliminazione di un gruppo di risorse è irreversibile. Quando si elimina un gruppo di risorse, tutte le risorse in esso contenute vengono eliminate in modo permanente. Assicurarsi di non eliminare accidentalmente il gruppo di risorse sbagliato o le risorse errate. Se sono state create le risorse per l'hosting di questo esempio all'interno di un gruppo di risorse esistente che contiene le risorse da mantenere, è possibile eliminare ogni risorsa singolarmente a sinistra anziché eliminare il gruppo di risorse.

Per eliminare un gruppo di risorse

  1. Accedere al portale di Azure e selezionare Gruppi di risorse.

  2. Nella casella Filtra per nome immettere il nome del gruppo di risorse. Nel gruppo di risorse, nell'elenco dei risultati, selezionare... e quindi Elimina gruppo di risorse.

Verrà chiesto di confermare l'eliminazione del gruppo di risorse. Digitare il nome del gruppo di risorse per confermare e quindi selezionare Elimina.

Dopo qualche istante, il gruppo di risorse e tutte le risorse che contiene vengono eliminati.

Passaggi successivi