Condividi tramite


Esercitazione: Distribuire NVIDIA Llama3 NIM in App contenitore di Azure

I microservizi di inferenza NVIDIA sono ottimizzati, microservizi di inferenza di intelligenza artificiale in contenitori che semplificano e accelerano la creazione di applicazioni di intelligenza artificiale. Questi modelli sono preconfezionati, scalabili e ottimizzati per le prestazioni per la distribuzione diretta come endpoint sicuri in App Azure Container. Quando si usano app contenitore di Azure con GPU serverless, è possibile eseguire queste NIC in modo efficiente senza dover gestire l'infrastruttura sottostante.

In questo tutorial imparerai a distribuire un NIM NVIDIA Llama3 in Azure Container Apps utilizzando GPU serverless.

Questa esercitazione usa un'istanza Premium di Registro Azure Container per migliorare le prestazioni di avvio a freddo quando si usano GPU serverless. Se non si vuole usare un’istanza Premium di Registro Azure Container Premium, per questa esercitazione modificare il comando az acr create in modo da impostare --sku su basic.

Prerequisiti

Risorsa Description
Account di Azure Un account Azure con una sottoscrizione attiva.

Se non hai un account, puoi crearlo gratuitamente.
Azure CLI Installare l'interfaccia della riga di comando di Azure.
Chiave API NVIDIA NGC È possibile ottenere una chiave API dal sito Web NVIDIA GPU Cloud (NGC).

Configurazione

Per accedere ad Azure dall'interfaccia della riga di comando, eseguire il comando seguente e seguire le istruzioni per completare il processo di autenticazione.

az login

Per assicurarsi di eseguire l'ultima versione dell'interfaccia della riga di comando, eseguire il comando di upgrade.

az upgrade

Installare o aggiornare quindi l'estensione App contenitore di Azure per l'interfaccia della riga di comando.

Se ricevi errori relativi ai parametri mancanti quando esegui comandi nell'Azure CLI o cmdlet nel modulo az containerapp di PowerShell, assicurati di avere installato la versione più recente dell'estensione Azure Container Apps.

az extension add --name containerapp --upgrade

Annotazioni

A partire da maggio 2024, le estensioni dell'interfaccia della riga di comando di Azure non abilitano più le funzionalità di anteprima per impostazione predefinita. Per accedere alle funzionalità di anteprima di App contenitore, installare l'estensione App contenitore con --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Ora che l'estensione o il modulo corrente è installato, registrate gli spazi dei nomi Microsoft.App e Microsoft.OperationalInsights.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
  1. Configurare le variabili di ambiente assegnando un nome al gruppo di risorse e impostando la posizione.

    RESOURCE_GROUP="my-resource-group"
    LOCATION="swedencentral"
    

    Generare quindi un nome univoco per il registro dei contenitori.

    SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 6)
    ACR_NAME="mygpututorialacr${SUFFIX}"
    

    Impostare infine le variabili per assegnare un nome all'ambiente e identificare l'ambiente, il tipo di profilo del carico di lavoro, il nome dell'app contenitore e il contenitore.

    CONTAINERAPPS_ENVIRONMENT="my-environment-name"
    GPU_TYPE="Consumption-GPU-NC24-A100"
    CONTAINER_APP_NAME="llama3-nim"
    CONTAINER_AND_TAG="meta/llama-3.1-8b-instruct:latest"
    NGC_SECRET=<Your NVIDIA NGC API Key>
    

Creare un gruppo di risorse di Azure

Creare un gruppo di risorse per organizzare i servizi correlati alla distribuzione dell'app contenitore.

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION
  1. Creare un Registro Azure Container (ACR).

    Annotazioni

    Questa esercitazione usa un Registro Azure Container Premium per migliorare le prestazioni di avvio a freddo quando si usano GPU serverless. Se non si desidera utilizzare un Azure Container Registry di tipo premium, modificare il comando seguente e impostare l'opzione su --skubasic.

    az acr create \
      --resource-group $RESOURCE_GROUP \
      --name $ACR_NAME \
      --location $LOCATION \
      --sku premium
    

Importare l'immagine NVIDIA NIM nel Registro Azure Container

Importare quindi l'immagine da NVIDIA GPU Cloud in Registro Azure Container.

Annotazioni

Le schede di interfaccia di rete NVIDIA hanno i propri requisiti hardware. Assicurarsi che il tipo di GPU selezionato supporti l'NIM preferito. Llama3 NIM usato in questa esercitazione può essere eseguito su GPU NVIDIA A100.

  1. Eseguire l'autenticazione in Registro Azure Container.

    az acr login --name $ACR_NAME
    
  2. Eseguire il push dell'immagine su Azure Container Registry.

    az acr import \
        --name $ACR_NAME \
        --source nvcr.io/nim/$CONTAINER_AND_TAG \
        --image $CONTAINER_AND_TAG \
        --username '$oauthtoken' \
        --password $NGC_SECRET
    
    

Quando viene eseguita, l'app contenitore esegue il pull del contenitore dal registro contenitori. Quando si hanno immagini di dimensioni maggiori, ad esempio nel caso di carichi di lavoro di intelligenza artificiale, il pull dell'immagine potrebbe richiedere del tempo. Abilitando lo streaming degli artefatti, l'app contenitore caricherà prima le parti essenziali dell'immagine, riducendo la quantità di tempo per avviare il contenitore. Usare la procedura seguente per abilitare lo streaming degli artefatti.

Annotazioni

Il completamento dei comandi seguenti può richiedere molto tempo.

  1. Abilitare la funzionalità di streaming degli artefatti nel registro dei container.

    az acr artifact-streaming update \
        --name $ACR_NAME \
        --repository llama-3.1-8b-instruct \
        --enable-streaming True
    
  2. Abilitare lo streaming degli artefatti nell'immagine del contenitore.

    az acr artifact-streaming create \
      --name $ACR_NAME \
      --image $CONTAINER_AND_TAG
    

Crea la tua applicazione contenitore

Successivamente si crea un'app contenitore con la chiave API NVIDIA GPU Cloud.

  1. Creare l'ambiente app contenitore.

    az containerapp env create \
      --name $CONTAINERAPPS_ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    
  2. Aggiungi il profilo del carico di lavoro GPU all'ambiente.

    az containerapp env workload-profile add \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --workload-profile-type $GPU_TYPE \
        --workload-profile-name LLAMA_PROFILE
    
  3. Creare l'applicazione contenitore.

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $CONTAINERAPPS_ENVIRONMENT \
      --image $ACR_NAME.azurecr.io/$CONTAINER_AND_TAG \
      --cpu 24 \
      --memory 220 \
      --target-port 8000 \
      --ingress external \
      --secrets ngc-api-key=<PASTE_NGC_API_KEY_HERE> \
      --env-vars NGC_API_KEY=secretref:ngc-api-key \
      --registry-server $ACR_NAME.azurecr.io \
      --workload-profile-name LLAMA_PROFILE \
      --query properties.configuration.ingress.fqdn
    

    Questo comando restituisce l'URL dell'app contenitore. Impostare questo valore da parte in un editor di testo da usare in un comando seguente.

Annotazioni

Alcune NIC hanno tempi di avvio più lunghi. Per tenere conto di questo problema, è possibile configurare una sonda di controllo integrità o impostare il conteggio minimo di repliche dell'app contenitore con --min-replicas 1 per mantenere una replica sempre in esecuzione.

Verificare che l'applicazione funzioni

È possibile verificare una distribuzione corretta inviando una richiesta POST all'applicazione.

Prima di eseguire questo comando, assicurarsi di sostituire l'URL con l'URL <YOUR_CONTAINER_APP_URL> dell'app contenitore restituito dal comando precedente.

curl -X POST \
  'http://<YOUR_CONTAINER_APP_URL>/v1/completions' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "meta/llama-3.1-8b-instruct",
    "prompt":  [{"role":"user", "content":"Once upon a time..."}],
    "max_tokens": 64
  }'

Miglioramento delle prestazioni con il montaggio del volume (facoltativo)

Durante l’avvio e l’utilizzo dello streaming degli artefatti con Registro Azure Container, App contenitore di Azure continua a eseguire il pull delle immagini dal registro contenitori all'avvio. Questa azione comporta un avvio a freddo anche con lo streaming degli artefatti ottimizzato.

Per tempi di avvio a freddo ancora più veloci, molti dei microservizi NIM forniscono un percorso di montaggio del volume per memorizzare l'immagine in una directory della cache. È possibile usare questa directory della cache per archiviare i pesi del modello e altri file necessari per l'esecuzione di NIM.

Per configurare un montaggio del volume per il NIM llama3, è necessario configurare un montaggio del volume su ./opt/nim/.cache come specificato nella documentazione di NVIDIA Llama-3.1-8b. A tale scopo, seguire la procedura descritta nell’esercitazione sul montaggio del volume e impostare il percorso di montaggio del volume su /opt/nim/.cache.

Pulire le risorse

Se non si intende continuare a usare questa applicazione, eseguire il comando seguente per eliminare il gruppo di risorse insieme a tutte le risorse create in questa esercitazione.

Attenzione

Nell'esempio seguente, il gruppo di risorse specificato e tutte le risorse al suo interno vengono eliminati. Questo comando elimina anche tutte le risorse esterne all'ambito di questa esercitazione presenti in questo gruppo di risorse.

az group delete --name $RESOURCE_GROUP

Suggerimento

Problemi? Fatecelo sapere su GitHub aprendo un problema nel repository di Azure Container Apps.