Esegui l'inferenza LLM su GPU Cloud Run con Ollama


In questo tutorial imparerai a eseguire il deployment di Gemma 2 di Google, un modello linguistico di grandi dimensioni (LLM) aperto, su un servizio Cloud Run abilitato per GPU (per un'inferenza rapida).

Utilizzerai Ollama, un server di inferenza LLM per i modelli aperti. Una volta completato il tutorial, non esitare a esplorare anche altri modelli aperti supportati da Ollama, tra cui Llama 3.1 (8B), Mistral (7B) e Qwen2 (7B).

Obiettivi

  • Esegui il deployment di Ollama con Gemma 2 su un servizio Cloud Run abilitato per GPU.
  • Invia richieste al servizio Ollama sul relativo endpoint privato.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. Installa e inizializza gcloud CLI.
  8. Richiedi una quota Total Nvidia L4 GPU allocation, per project per region nell'API Cloud Run Admin nella pagina Quote e limiti di sistema per completare questo tutorial.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per completare il tutorial: chiedi all'amministratore di concederti i seguenti ruoli IAM sul tuo progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Configura gcloud

Per configurare Google Cloud CLI per il tuo servizio Cloud Run:

  1. Imposta il progetto predefinito:

    gcloud config set project PROJECT_ID

    Fai clic sull'icona per sostituire la variabile PROJECT_ID con il nome del progetto che per questo tutorial. In questo modo, tutte le schede in questa pagina il riferimento PROJECT_ID contiene già il valore corretto viene compilata.

  2. Configura Google Cloud CLI in modo che utilizzi la regione us-central1 per Cloud Run tramite comandi SQL.

    gcloud config set run/region us-central1

Crea un repository Docker di Artifact Registry

Crea un repository Docker in cui archiviare le immagini container per questo tutorial:

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

Sostituisci REPOSITORY con il nome del repository. Ad esempio, repo.

Usa Docker per creare un'immagine container con Ollama e Gemma

  1. Crea una directory per il servizio Ollama e imposta la directory di lavoro su questa nuova directory:

    mkdir ollama-backend
    cd ollama-backend
  2. Crea un file Dockerfile

    FROM ollama/ollama:0.3.6
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # Store model weight files in /models
    ENV OLLAMA_MODELS /models
    
    # Reduce logging verbosity
    ENV OLLAMA_DEBUG false
    
    # Never unload model weights from the GPU
    ENV OLLAMA_KEEP_ALIVE -1 
    
    # Store the model weights in the container image
    ENV MODEL gemma2:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

Archivia i pesi del modello nell'immagine container per avviare più rapidamente le istanze

Google consiglia di archiviare i pesi del modello Gemma 2 (9B) e modelli di dimensioni simili direttamente nell'immagine container.

I pesi del modello sono i parametri numerici che definiscono il comportamento di un LLM. Prima di poter iniziare a soddisfare le richieste di inferenza, Ollama deve leggere completamente questi file e caricare i pesi nella memoria della GPU (VRAM) durante l'avvio dell'istanza del contenitore.

In Cloud Run, un avvio rapido delle istanze di container è importante per ridurre al minimo latenza delle richieste. Se il tempo di avvio dell'istanza del contenitore è lento, il servizio impiega più tempo per eseguire il ridimensionamento da zero a un'istanza e per eseguire il ridimensionamento in aumento durante un picco di traffico.

Per garantire un avvio rapido, archivia i file del modello nell'immagine del contenitore stessa. Questa procedura è più veloce e affidabile rispetto al download dei file da una posizione remota durante l'avvio. L'archiviazione interna delle immagini dei container di Cloud Run è ottimizzata per la gestione dei picchi di traffico, consentendo di configurare rapidamente il file del container all'avvio di un'istanza.

Tieni presente che i pesi del modello per Gemma 2 (9B) occupano 5,4 GB di spazio di archiviazione. I modelli più grandi hanno file di peso del modello più grandi e potrebbero non essere pratici da archiviare nell'immagine del contenitore. Per una panoramica dei compromessi, consulta Best practice: inferenza AI su Cloud Run con GPU.

Creare l'immagine container con Cloud Build

Per creare l'immagine container con Cloud Build ed eseguire il push nel repository Artifact Registry:

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

Tieni presente quanto segue:

  • Per una compilazione più rapida, questo comando seleziona un tipo di macchina potente con più CPU e larghezza di banda di rete.
  • La compilazione dovrebbe richiedere circa 7 minuti.
  • Un'alternativa è creare l'immagine in locale con Docker ed eseguirne il push su Artifact Registry. L'operazione potrebbe essere più lenta rispetto all'esecuzione su Cloud Build, a seconda della larghezza di banda della rete.

Esegui il deployment di Ollama come servizio Cloud Run

Ora che l'immagine container è archiviata in un repository Artifact Registry, puoi eseguire il deployment di Ollama come servizio Cloud Run.

Crea un account di servizio dedicato

Crea un account di servizio dedicato che il servizio Ollama utilizza come identità di servizio:

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

Sostituisci OLLAMA_IDENTITY con il nome dell'account di servizio che vuoi creare, ad esempio, ollama.

È buona prassi creare un account di servizio dedicato per ogni servizio Cloud Run con l'insieme di autorizzazioni minime richieste. Il servizio Ollama non deve chiamare API Google Cloud, il che significa che non è necessario concedere autorizzazioni al suo account di servizio.

Esegui il deployment del servizio

Esegui il deployment del servizio in Cloud Run:

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
  --timeout=600

Tieni presente i seguenti flag importanti in questo comando:

  • --concurrency 4 è impostato in modo da corrispondere al valore della variabile di ambiente OLLAMA_NUM_PARALLEL.
  • --gpu 1 con --gpu-type nvidia-l4 assegna 1 GPU NVIDIA L4 a ogni istanza Cloud Run nel servizio.
  • --no-allow-authenticated limita l'accesso non autenticato al servizio. Mantenendo il servizio privato, puoi fare affidamento sull'autenticazione Identity and Access Management (IAM) integrata di Cloud Run per la comunicazione tra servizi. Consulta Gestire l'accesso utilizzando IAM.
  • --no-cpu-throttling è necessario per attivare la GPU.
  • --service-account imposta l'identità del servizio.

Impostazione della concorrenza per prestazioni ottimali

Questa sezione fornisce il contesto sulle impostazioni di contemporaneità consigliate. Per ottimizzare latenza di richiesta, assicurati che l'impostazione --concurrency sia uguale a quella di Ollama Variabile di ambiente OLLAMA_NUM_PARALLEL.

  • OLLAMA_NUM_PARALLEL determina il numero di slot di richiesta disponibili per per gestire contemporaneamente le richieste di inferenza.
  • --concurrency determina quante richieste invia Cloud Run contemporaneamente a un'istanza Ollama.

Se --concurrency supera OLLAMA_NUM_PARALLEL, Cloud Run può inviare più richieste a un modello in Ollama rispetto al numero di slot di richiesta disponibili. Ciò comporta la formazione di una coda di richieste in Ollama, con un conseguente aumento della latenza delle richieste in coda. Inoltre, comporta una scalabilità automatica meno reattiva, dato che non attivano Cloud Run per lo scale out e l'avvio di nuove istanze.

Ollama supporta anche la pubblicazione di più modelli da una GPU. Per evitare completamente la formazione di code di richieste nell'istanza Ollama, devi comunque impostare --concurrency in modo che corrisponda a OLLAMA_NUM_PARALLEL.

È importante notare che l'aumento di OLLAMA_NUM_PARALLEL prolunga anche il tempo di esecuzione delle richieste parallele.

Ottimizzazione dell'utilizzo

Per un utilizzo ottimale della GPU, aumenta --concurrency mantenendolo entro il doppio del valore di OLLAMA_NUM_PARALLEL. Sebbene questo porti all'accodamento delle richieste in Ollama, può contribuire a migliorare l'utilizzo: le istanze Ollama possono elaborare immediatamente le richieste dalla coda e le code aiutano ad assorbire i picchi di traffico.

Testa il servizio Ollama di cui è stato eseguito il deployment con curl

Ora che hai eseguito il deployment del servizio Ollama, puoi inviargli richieste. Tuttavia, se invii una richiesta direttamente, Cloud Run risponde con HTTP 401 Unauthorized. Questo è intenzionale, perché un'API di inferenza LLM è destinata ad essere chiamata da altri servizi, ad esempio un'applicazione frontend. Per ulteriori informazioni sui servizi su Cloud Run, consulta Autenticazione tra servizi.

Per inviare richieste al servizio Ollama, aggiungi un'intestazione con un token OIDC valido a le richieste, ad esempio utilizzando il proxy per sviluppatori di Cloud Run:

  1. Avvia il proxy e, quando ti viene chiesto di installare il componente cloud-run-proxy, scegli Y:

    gcloud run services proxy ollama-gemma --port=9090
  2. Invia una richiesta in una scheda del terminale separata, lasciando il proxy in esecuzione. Tieni presente che il proxy viene eseguito su localhost:9090:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

    Questo comando dovrebbe fornire un output di streaming simile al seguente:

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

Esegui la pulizia

  1. Elimina le altre risorse Google Cloud create in questo tutorial:

Passaggi successivi