Distribuire un modello in un cluster servizio Azure Kubernetes con v1

Importante

Questo articolo illustra come usare l'interfaccia della riga di comando di Azure Machine Learning (v1) e Azure Machine Learning SDK per Python (v1) per distribuire un modello. Per l'approccio consigliato per la versione 2, vedere Distribuire e assegnare punteggi a un modello di Machine Learning usando un endpoint online.

Informazioni su come usare Azure Machine Learning per distribuire un modello come servizio Web in servizio Azure Kubernetes (servizio Azure Kubernetes). Il servizio Azure Kubernetes è utile per le distribuzioni di produzione su larga scala. Usare il servizio Azure Kubernetes se sono necessarie una o più delle funzionalità seguenti:

  • Tempo di risposta rapido
  • Scalabilità automatica del servizio distribuito
  • Registrazione
  • Raccolta di dati del modello
  • Autenticazione
  • Terminazione TLS
  • Opzioni di accelerazione hardware, ad esempio GPU e array di gate programmabili sul campo (FPGA)

Quando si esegue la distribuzione nel servizio Azure Kubernetes, si esegue la distribuzione in un cluster del servizio Azure Kubernetes connesso all'area di lavoro. Per informazioni sulla connessione di un cluster del servizio Azure Kubernetes all'area di lavoro, vedere Creare e collegare un cluster servizio Azure Kubernetes.

Importante

È consigliabile eseguire il debug in locale prima della distribuzione nel servizio Web. Per altre informazioni, vedere Risoluzione dei problemi con una distribuzione del modello locale.

È anche possibile fare riferimento a Deploy to local notebook on GitHub (Distribuire nel notebook locale in GitHub).

Nota

Gli endpoint di Azure Machine Learning (v2) offrono un'esperienza di distribuzione più semplice e migliorata. Gli endpoint supportano scenari di inferenza batch e in tempo reale. Gli endpoint forniscono un'interfaccia unificata per richiamare e gestire le distribuzioni di modelli tra i tipi di calcolo. Vedere Che cosa sono gli endpoint di Azure Machine Learning?.

Prerequisiti

  • Un'area di lavoro di Azure Machine Learning. Per altre informazioni, vedere Creare un'area di lavoro di Azure Machine Learning.

  • Un modello di Machine Learning registrato nell'area di lavoro. Se non si ha un modello registrato, vedere Distribuire modelli di Machine Learning in Azure.

  • Estensione dell'interfaccia della riga di comando di Azure (v1) per il servizio Machine Learning, Azure Machine Learning Python SDK o l'estensione Azure Machine Learning Visual Studio Code.

    Importante

    Alcuni comandi dell'interfaccia della riga di comando di Azure in questo articolo usano l'estensione azure-cli-ml, o v1, per Azure Machine Learning. Il supporto per l'estensione v1 terminerà il 30 settembre 2025. Sarà possibile installare e usare l'estensione v1 fino a tale data.

    È consigliabile 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 Python SDK v2.

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

    • ws - Impostare l'area di lavoro.
    • model - Impostare sul modello registrato.
    • inference_config - Impostare sulla configurazione dell'inferenza per il modello.

    Per altre informazioni sull'impostazione di queste variabili, vedere Come e dove distribuire i modelli.

  • I frammenti dell'interfaccia della riga di comando in questo articolo presuppongono che sia già stato creato un documento inferenceconfig.json . Per altre informazioni sulla creazione di questo documento, vedere Distribuire modelli di Machine Learning in Azure.

  • Un cluster del servizio Azure Kubernetes connesso all'area di lavoro. Per altre informazioni, vedere Creare e collegare un cluster servizio Azure Kubernetes.

    • Se si vogliono distribuire modelli in nodi GPU o nodi FPGA (o qualsiasi prodotto specifico), è necessario creare un cluster con il prodotto specifico. Non è disponibile alcun supporto per la creazione di un pool di nodi secondario in un cluster esistente e la distribuzione di modelli nel pool di nodi secondari.

Informazioni sui processi di distribuzione

La distribuzione di parole viene usata sia in Kubernetes che in Azure Machine Learning. La distribuzione ha significati diversi in questi due contesti. In Kubernetes una distribuzione è un'entità concreta, specificata con un file YAML dichiarativo. Una distribuzione Kubernetes ha un ciclo di vita definito e relazioni concrete con altre entità Kubernetes, ad Pods esempio e ReplicaSets. Per informazioni su Kubernetes, vedere la documentazione e i video in Che cos'è Kubernetes?.

In Azure Machine Learning, la distribuzione viene usata nel senso più generale di rendere disponibili e pulire le risorse del progetto. I passaggi che Azure Machine Learning considera parte della distribuzione sono:

  1. Comprimere i file nella cartella del progetto, ignorando quelli specificati in .amlignore o .gitignore
  2. Aumento delle prestazioni del cluster di calcolo (correlato a Kubernetes)
  3. Compilazione o download del dockerfile nel nodo di calcolo (correlato a Kubernetes)
    1. Il sistema calcola un hash di:
    2. Il sistema usa questo hash come chiave in una ricerca dell'area di lavoro Registro Azure Container (ACR)
    3. Se non viene trovato, cerca una corrispondenza nel Registro Azure Container globale
    4. Se non viene trovato, il sistema compila una nuova immagine memorizzata nella cache e inserita nel Registro Azure Container dell'area di lavoro
  4. Download del file di progetto compresso nell'archiviazione temporanea nel nodo di calcolo
  5. Decomprimere il file di progetto
  6. Nodo di calcolo in esecuzione python <entry script> <arguments>
  7. Salvataggio di log, file di modello e altri file scritti in ./output nell'account di archiviazione associato all'area di lavoro
  8. Riduzione delle prestazioni di calcolo, inclusa la rimozione dell'archiviazione temporanea (correlata a Kubernetes)

Router di Azure Machine Learning

Il componente front-end (azureml-fe) che instrada le richieste di inferenza in ingresso ai servizi distribuiti viene ridimensionato automaticamente in base alle esigenze. Il ridimensionamento di azureml-fe si basa sullo scopo e sulle dimensioni del cluster del servizio Azure Kubernetes (numero di nodi). Lo scopo e i nodi del cluster vengono configurati quando si crea o si collega un cluster del servizio Azure Kubernetes. È disponibile un servizio azureml-fe per ogni cluster, che potrebbe essere in esecuzione in più pod.

Importante

Quando si usa un cluster configurato come dev-test, il ridimensionatore automatico è disabilitato. Anche per i cluster FastProd/DenseProd, Self-Scaler è abilitato solo quando i dati di telemetria indicano che è necessario.

Nota

Il payload massimo della richiesta è 100 MB.

Azureml-fe aumenta (verticalmente) per usare più core e out (orizzontalmente) per usare più pod. Quando si prende la decisione di aumentare le prestazioni, viene usato il tempo necessario per instradare le richieste di inferenza in ingresso. Se questo tempo supera la soglia, si verifica una scalabilità orizzontale. Se il tempo necessario per instradare le richieste in ingresso continua a superare la soglia, si verifica un aumento del numero di istanze.

In caso di riduzione e riduzione delle prestazioni, viene usato l'utilizzo della CPU. Se viene raggiunta la soglia di utilizzo della CPU, il front-end viene prima ridimensionato. Se l'utilizzo della CPU scende alla soglia di scalabilità orizzontale, si verifica un'operazione di ridimensionamento. L'aumento e il numero di istanze si verifica solo se sono disponibili risorse cluster sufficienti.

Quando si aumentano o si riduceno le prestazioni, i pod azureml-fe vengono riavviati per applicare le modifiche di cpu/memoria. I riavvii non influiscono sulle richieste di inferenza.

Informazioni sui requisiti di connettività per il cluster di inferenza del servizio Azure Kubernetes

Quando Azure Machine Learning crea o collega un cluster del servizio Azure Kubernetes, il cluster del servizio Azure Kubernetes viene distribuito con uno dei due modelli di rete seguenti:

  • Rete Kubenet: le risorse di rete vengono in genere create e configurate durante la distribuzione del cluster del servizio Azure Kubernetes.
  • Rete CNI (Azure Container Networking Interface): il cluster del servizio Azure Kubernetes è connesso a una risorsa e configurazioni di rete virtuale esistenti.

Per la rete Kubenet, la rete viene creata e configurata correttamente per il servizio Azure Machine Learning. Per la rete CNI, è necessario comprendere i requisiti di connettività e garantire la risoluzione DNS e la connettività in uscita per l'inferenza del servizio Azure Kubernetes. Ad esempio, è possibile usare un firewall per bloccare il traffico di rete.

Il diagramma seguente illustra i requisiti di connettività per l'inferenza del servizio Azure Kubernetes. Le frecce nere rappresentano le comunicazioni effettive e le frecce blu rappresentano i nomi di dominio. Potrebbe essere necessario aggiungere voci per questi host al firewall o al server DNS personalizzato.

Diagram that shows connectivity requirements for AKS inferencing.

Per i requisiti generali di connettività del servizio Azure Kubernetes, vedere Limitare il traffico di rete con Firewall di Azure nel servizio Azure Kubernetes.

Per accedere ai servizi di Azure Machine Learning dietro un firewall, vedere Configurare il traffico di rete in ingresso e in uscita.

Requisiti generali di risoluzione DNS

La risoluzione DNS all'interno di una rete virtuale esistente è sotto il controllo. Ad esempio, un firewall o un server DNS personalizzato. Gli host seguenti devono essere raggiungibili:

Nome host Usato da
<cluster>.hcp.<region>.azmk8s.io Server API del servizio Azure Kubernetes
mcr.microsoft.com Registro Container Microsoft (MCR)
<ACR name>.azurecr.io Registro Azure Container (ACR) dell'utente
<account>.table.core.windows.net Account di archiviazione di Azure (archiviazione tabelle)
<account>.blob.core.windows.net Account di archiviazione di Azure (archiviazione BLOB)
api.azureml.ms Autenticazione Microsoft Entra
ingest-vienna<region>.kusto.windows.net Endpoint Kusto per il caricamento dei dati di telemetria
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com Nome di dominio dell'endpoint, se viene generato automaticamente con Azure Machine Learning. Se è stato usato un nome di dominio personalizzato, questa voce non è necessaria.

requisiti di Connessione ivity in ordine cronologico

Nel processo di creazione o collegamento del servizio Azure Kubernetes, il router di Azure Machine Learning (azureml-fe) viene distribuito nel cluster del servizio Azure Kubernetes. Per distribuire il router di Azure Machine Learning, il nodo servizio Azure Kubernetes deve essere in grado di:

  • Risolvere il DNS per il server API del servizio Azure Kubernetes
  • Risolvere il DNS per MCR per scaricare le immagini Docker per il router di Azure Machine Learning
  • Scaricare immagini da MCR, dove è necessaria la connettività in uscita

Subito dopo la distribuzione di azureml-fe, tenta di avviare e questo richiede:

  • Risolvere il DNS per il server API del servizio Azure Kubernetes
  • Eseguire query sul server API del servizio Azure Kubernetes per individuare altre istanze di se stesso (si tratta di un servizio multi-pod)
  • Connessione ad altre istanze di se stesso

Dopo l'avvio di azureml-fe, è necessaria la connettività seguente per il corretto funzionamento:

  • Connessione a Archiviazione di Azure per scaricare la configurazione dinamica
  • Risolvere il DNS per il server di autenticazione Microsoft Entra api.azureml.ms e comunicare con esso quando il servizio distribuito usa l'autenticazione Microsoft Entra.
  • Eseguire query sul server API del servizio Azure Kubernetes per individuare i modelli distribuiti
  • Comunicare con i POD del modello distribuiti

In fase di distribuzione del modello, per una corretta distribuzione del modello, il nodo del servizio Azure Kubernetes deve essere in grado di:

  • Risolvere il DNS per il Registro Azure Container del cliente
  • Scaricare immagini dal Registro Azure Container del cliente
  • Risolvere IL DNS per BLOB di Azure in cui è archiviato il modello
  • Scaricare modelli da BLOB di Azure

Dopo l'avvio del modello e l'avvio del servizio, azureml-fe lo individua automaticamente usando l'API del servizio Azure Kubernetes ed è pronto per instradare la richiesta. Deve essere in grado di comunicare con i POD del modello.

Nota

Se il modello distribuito richiede connettività ( ad esempio, esecuzione di query su database esterno o altro servizio REST o download di un BLOB), è necessario abilitare sia la risoluzione DNS che la comunicazione in uscita per questi servizi.

Distribuire in servizio Azure Kubernetes

Per distribuire un modello nel servizio Azure Kubernetes, creare una configurazione di distribuzione che descrive le risorse di calcolo necessarie. Ad esempio, il numero di core e memoria. È necessaria anche una configurazione di inferenza, che descrive l'ambiente necessario per ospitare il modello e il servizio Web. Per altre informazioni sulla creazione della configurazione dell'inferenza, vedere Come e dove distribuire i modelli.

Nota

Il numero di modelli da distribuire è limitato a 1.000 modelli per distribuzione (per contenitore).

SI APPLICA A:Python SDK azureml v1

from azureml.core.webservice import AksWebservice, Webservice
from azureml.core.model import Model
from azureml.core.compute import AksCompute

aks_target = AksCompute(ws,"myaks")
# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and AML components.
deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config, aks_target)
service.wait_for_deployment(show_output = True)
print(service.state)
print(service.get_logs())

Per altre informazioni sulle classi, i metodi e i parametri usati in questo esempio, vedere i documenti di riferimento seguenti:

Scalabilità automatica

SI APPLICA A:Python SDK azureml v1

Il componente che gestisce la scalabilità automatica per le distribuzioni di modelli di Azure Machine Learning è azureml-fe, ovvero un router di richiesta intelligente. Poiché tutte le richieste di inferenza passano attraverso di esso, dispone dei dati necessari per ridimensionare automaticamente i modelli distribuiti.

Importante

  • Non abilitare Kubernetes Horizontal Pod Autoscaler (HPA) per le distribuzioni di modelli. In questo modo i due componenti di ridimensionamento automatico possono competere tra loro. Azureml-fe è progettato per ridimensionare automaticamente i modelli distribuiti da Azure Machine Learning, in cui HPA deve indovinare o approssimare l'utilizzo del modello da una metrica generica, ad esempio l'utilizzo della CPU o una configurazione della metrica personalizzata.

  • Azureml-fe non ridimensiona il numero di nodi in un cluster del servizio Azure Kubernetes, perché ciò potrebbe causare un aumento imprevisto dei costi. Ridimensiona invece il numero di repliche per il modello entro i limiti del cluster fisico. Se è necessario dimensionare il numero di nodi all'interno del cluster, è possibile dimensionare manualmente il cluster o configurare il dimensionamento automatico del cluster del servizio Azure Kubernetes.

La scalabilità automatica può essere controllata impostando autoscale_target_utilization, autoscale_min_replicase autoscale_max_replicas per il servizio Web del servizio Azure Kubernetes. L'esempio seguente illustra come abilitare la scalabilità automatica:

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                autoscale_target_utilization=30,
                                                autoscale_min_replicas=1,
                                                autoscale_max_replicas=4)

Le decisioni per aumentare o ridurre le prestazioni si basano sull'utilizzo delle repliche dei contenitori correnti. Il numero di repliche occupato (elaborazione di una richiesta) 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. Per impostazione predefinita, l'utilizzo della destinazione è del 70%.

Le decisioni per aggiungere repliche sono ansiose e veloci (circa 1 secondo). Le decisioni per rimuovere le repliche sono conservatrici (circa 1 minuto).

È possibile calcolare le repliche necessarie usando il codice seguente:

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)

Per altre informazioni sull'impostazione autoscale_target_utilizationdi , autoscale_max_replicase autoscale_min_replicas, vedere le informazioni di riferimento sul modulo AksWebservice .

Autenticazione dei servizi Web

Quando si esegue la distribuzione in servizio Azure Kubernetes, l'autenticazione basata su chiave è abilitata per impostazione predefinita. È anche possibile abilitare l'autenticazione basata su token. L'autenticazione basata su token richiede ai client di usare un account Microsoft Entra per richiedere un token di autenticazione, usato per effettuare richieste al servizio distribuito.

Per disabilitare l'autenticazione, impostare il auth_enabled=False parametro durante la creazione della configurazione della distribuzione. L'esempio seguente disabilita l'autenticazione con l'SDK:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, auth_enabled=False)

Per informazioni sull'autenticazione da un'applicazione client, vedere Usare un modello di Azure Machine Learning distribuito come servizio Web.

Autenticazione con chiavi

Se l'autenticazione della chiave è abilitata, è possibile usare il get_keys metodo per recuperare una chiave di autenticazione primaria e secondaria:

primary, secondary = service.get_keys()
print(primary)

Importante

Se è necessario rigenerare una chiave, usare service.regen_key.

Autenticazione con token

Per abilitare l'autenticazione token, impostare il parametro durante la token_auth_enabled=True creazione o l'aggiornamento di una distribuzione. L'esempio seguente abilita l'autenticazione del token usando l'SDK:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, token_auth_enabled=True)

Se l'autenticazione del token è abilitata, è possibile usare il get_token metodo per recuperare un token JWT e l'ora di scadenza del token:

token, refresh_by = service.get_token()
print(token)

Importante

È necessario richiedere un nuovo token dopo il tempo del refresh_by token.

Microsoft consiglia vivamente di creare l'area di lavoro di Azure Machine Learning nella stessa area del cluster del servizio Azure Kubernetes. Per eseguire l'autenticazione con un token, il servizio Web effettua una chiamata all'area in cui viene creata l'area di lavoro di Azure Machine Learning. Se l'area dell'area di lavoro non è disponibile, non è possibile recuperare un token per il servizio Web anche se il cluster si trova in un'area diversa rispetto all'area di lavoro. In questo modo, l'autenticazione basata su token non sarà disponibile finché l'area dell'area di lavoro non sarà nuovamente disponibile. Inoltre, maggiore è la distanza tra l'area del cluster e l'area dell'area di lavoro, più tempo è necessario recuperare un token.

Per recuperare un token, è necessario usare Azure Machine Learning SDK o il comando az ml service get-access-token .

Analisi delle vulnerabilità

Microsoft Defender for Cloud offre la gestione unificata della sicurezza e la protezione avanzata dalle minacce nei carichi di lavoro su cloud ibrido. È consigliabile consentire a Microsoft Defender per il cloud di analizzare le risorse e seguire le raccomandazioni. Per altre informazioni, vedere Sicurezza dei contenitori in Microsoft Defender per contenitori.