Esegui l'inferenza LLM sulle GPU Cloud Run con Gemma 3 e Ollama


Obiettivi

Questa guida mostra come eseguire l'inferenza LLM sulle GPU Cloud Run con Gemma 3 e Ollama e ha i seguenti obiettivi:

  • Esegui il deployment di Ollama con il modello Gemma 3 su un servizio Cloud Run con GPU abilitata.
  • Invia richieste al servizio Ollama sul relativo endpoint privato.

Per scoprire un modo alternativo per eseguire il deployment dei modelli open di Gemma 3 su Cloud Run utilizzando un container predefinito, consulta Eseguire i modelli Gemma 3 su Cloud Run.

Costi

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

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi Google Cloud utenti potrebbero avere diritto a 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 la 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.
  9. Ruoli obbligatori

    Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel 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.

    Concedi i ruoli

    Console

    1. Nella console Google Cloud vai alla pagina IAM.

      Vai a IAM
    2. Seleziona il progetto.
    3. Fai clic su Concedi l'accesso.
    4. Nel campo Nuovi principali, inserisci il tuo identificatore utente. In genere, si tratta dell'indirizzo email dell'Account Google utilizzato per eseguire il deployment del servizio Cloud Run.

    5. Nell'elenco Seleziona un ruolo, seleziona un ruolo.
    6. Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo.
    7. Fai clic su Salva.

    gcloud

    Per concedere i ruoli IAM richiesti al tuo account nel progetto:

         gcloud projects add-iam-policy-binding PROJECT_ID \
             --member=PRINCIPAL \
             --role=ROLE
         

    Sostituisci:

    • PROJECT_NUMBER con il numero Google Cloud del progetto.
    • PROJECT_ID con il tuo Google Cloud ID progetto.
    • PRINCIPAL con l'account per cui stai aggiungendo il collegamento. In genere, si tratta dell'indirizzo email dell'Account Google utilizzato per eseguire il deployment del servizio Cloud Run.
    • ROLE con il ruolo che stai aggiungendo all'account di deployment.

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 hai creato per questo tutorial. In questo modo, tutte le schede in questa pagina che fanno riferimento a PROJECT_ID avranno già inserito il valore corretto.

  2. Configura Google Cloud CLI in modo da utilizzare la regione europe-west1 per i comandi Cloud Run.

    gcloud config set run/region europe-west1

Utilizzare 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 con i seguenti contenuti:

    FROM ollama/ollama:latest
    
    # 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 gemma3:4b
    RUN ollama serve & sleep 5 && ollama pull $MODEL
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]
    

Memorizza i pesi del modello nell'immagine del contenitore per avviare più velocemente le istanze

Google consiglia di memorizzare i pesi del modello per Gemma 3 (4 miliardi) e modelli di dimensioni simili direttamente nell'immagine del contenitore.

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 la latenza delle richieste. Se il tempo di avvio dell'istanza del contenitore è lento, il servizio impiega più tempo per scalare da zero a un'istanza e per eseguire lo scaling up durante un picco di traffico.

Per garantire un avvio rapido, archivia i file del modello nell'immagine del contenitore stessa. Questa operazione è più rapida e affidabile rispetto al download dei file da una posizione remota durante l'avvio. Lo spazio di archiviazione delle immagini container interno di Cloud Run è ottimizzato per gestire i picchi di traffico, consentendo di configurare rapidamente il file system del container all'avvio di un'istanza.

Tieni presente che i pesi del modello per Gemma 3 (4B) occupano 8 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. Consulta la sezione Best practice: inferenza AI su Cloud Run con GPU per una panoramica dei compromessi.

Crea ed esegui il deployment del servizio Cloud Run

Crea ed esegui il deployment del servizio in Cloud Run:

gcloud run deploy ollama-gemma \
  --source . \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 1 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --no-gpu-zonal-redundancy \
  --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.
  • --max-instances 1 specifica il numero massimo di istanze a cui eseguire il ridimensionamento. Deve essere uguale o inferiore alla quota di GPU NVIDIA L4 (Total Nvidia L4 GPU allocation, per project per region) del progetto.
  • --no-allow-unauthenticated 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 è obbligatorio per attivare la GPU.
  • --no-gpu-zonal-redundancy imposta le opzioni di ridondanza zonale in base ai requisiti di failover zonale e alla quota disponibile. Per maggiori dettagli, consulta le opzioni di ridondanza zonale delle GPU.

Impostazione della contemporaneità per prestazioni ottimali

Questa sezione fornisce il contesto sulle impostazioni di concorrenza consigliate. Per una latenza delle richieste ottimale, assicurati che l'impostazione --concurrency sia uguale alla variabile di ambiente OLLAMA_NUM_PARALLEL di Ollama.

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

Se --concurrency supera OLLAMA_NUM_PARALLEL, Cloud Run può inviare più richieste a un modello in Ollama di quante ne abbia disponibili. Ciò comporta la formazione di una coda di richieste in Ollama, con conseguente aumento della latenza delle richieste per le richieste in coda. Inoltre, comporta una scalabilità automatica meno reattiva, poiché le richieste in coda non attivano Cloud Run per eseguire lo scaling out e avviare 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 ciò comporti l'inserimento delle richieste in coda in Ollama, può contribuire a migliorare l'utilizzo: le istanze Ollama possono elaborare immediatamente le richieste dalla coda e le code contribuiscono 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 saperne di più sull'autenticazione service-to-service su Cloud Run, consulta Autenticazione service-to-service.

Per inviare richieste al servizio Ollama, aggiungi un'intestazione con un token OIDC valido alle 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": "gemma3:4b",
      "prompt": "Why is the sky blue?"
    }'

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

    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.641492408Z","response":"That","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.687529153Z","response":"'","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.753284927Z","response":"s","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.812957381Z","response":" a","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.889102649Z","response":" fantastic","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.925748116Z","response":",","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.958391572Z","response":" decept","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.971035028Z","response":"ively","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.989678484Z","response":" tricky","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.999321940Z","response":" question","done":false}
    ...
    

Esegui la pulizia

Elimina le seguenti Google Cloud risorse create in questo tutorial:

Passaggi successivi