Come eseguire Transformers.js sulle GPU di Cloud Run

1. Introduzione

Panoramica

Cloud Run ha recentemente aggiunto il supporto GPU. È disponibile come anteprima pubblica con lista d'attesa. Se ti interessa provare la funzionalità, compila questo modulo per entrare nella lista d'attesa. Cloud Run è una piattaforma di container su Google Cloud che semplifica l'esecuzione del codice in un container, senza richiedere la gestione di un cluster.

Oggi, le GPU che rendiamo disponibili sono le GPU Nvidia L4 con 24 GB di vRAM. C'è una GPU per istanza Cloud Run e la scalabilità automatica di Cloud Run è ancora applicabile. Ciò include lo scale out fino a 5 istanze (con aumento della quota disponibile), nonché lo scale down fino a zero istanze quando non ci sono richieste.

Transformers.js è progettato per essere funzionalmente equivalente alla libreria Python transformers di Hugging Face, il che significa che puoi eseguire gli stessi modelli preaddestrati utilizzando un'API molto simile. Puoi scoprire di più sul sito web di Transformers.js.

In questo codelab, creerai ed eseguirai il deployment di un'app su Cloud Run che utilizza Transformers.js e GPU.

Cosa imparerai a fare

  • Come eseguire un'app utilizzando Transformers.js su Cloud Run con le GPU

2. Abilita le API e imposta le variabili di ambiente

Prima di poter iniziare a utilizzare questo codelab, devi abilitare diverse API. Questo codelab richiede l'utilizzo delle seguenti API. Puoi abilitare queste API eseguendo il seguente comando:

gcloud services enable run.googleapis.com \
    storage.googleapis.com \
    cloudbuild.googleapis.com \

Poi puoi impostare le variabili di ambiente che verranno utilizzate durante questo codelab.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Crea l'app Transformers.js

Innanzitutto, crea una directory per il codice sorgente e accedi tramite cd.

mkdir transformers-js-codelab && cd $_

Crea un file package.json.

{
    "name": "huggingface",
    "version": "1.0.0",
    "main": "index.js",
    "type": "module",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "description": "",
    "dependencies": {
      "@huggingface/transformers": "^3.0.0-alpha.8",
      "@xenova/transformers": "^2.17.2",
      "express": "^4.17.1"
    }
  }

Crea un file denominato index.js

import { pipeline } from "@xenova/transformers";

import express from 'express';

// make sure the text-generation pipeline is created first
// before anyone can access the routes
const generator = await pipeline('text-generation', 'Xenova/llama2.c-stories15M', {
    device: 'cuda',
    dtype: 'fp32',
});

// now create the app and routes
const app = express();

app.get('/', async (req, res) => {
  const text = 'A long time ago in a galaxy far far away,';
  const output = await generator(text, { max_new_tokens: 50 });
  res.send(output);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
  console.log(`transformers-js app: listening on port ${port}`);
});

Crea un Dockerfile. Il Dockerfile installerà i driver NVIDIA aggiuntivi necessari per Transformers.js

FROM node:20
WORKDIR /usr/src/app

RUN apt-get update && \
 apt-get install software-properties-common -y && \
 wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb && \
 dpkg -i cuda-keyring_1.1-1_all.deb && \
 add-apt-repository contrib && \
 apt-get update && \
 apt-get -y install cuda-toolkit-12-6 && \
 apt-get -y install cudnn-cuda-12

EXPOSE 8080
COPY package.json .

RUN npm install

COPY index.js .
ENTRYPOINT ["node", "index.js"]

4. Crea ed esegui il deployment del servizio Cloud Run

Crea un repository in Artifact Registry.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

Invia il codice a Cloud Build.

IMAGE=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/gpu-transformers-js
gcloud builds submit --tag $IMAGE

Passaggio successivo: esegui il deployment in Cloud Run

gcloud beta run deploy transformers-js-codelab \
 --image=$IMAGE \
 --cpu 8 --memory 32Gi \
 --gpu=1 --no-cpu-throttling --gpu-type nvidia-l4 \
 --allow-unauthenticated \
 --region us-central1 \
 --project=$PROJECT_ID \
 --max-instances 1

5. Testare il servizio

Puoi testare il servizio eseguendo questo comando:

SERVICE_URL=$(gcloud run services describe transformers-js-codelab --region $REGION --format 'value(status.url)')

curl $SERVICE_URL

e vedrai un risultato simile al seguente:

[{"generated_text":"A long time ago in a galaxy far far away, there was a beautiful garden. Every day, the little girl would go to the garden and look at the flowers. She loved the garden so much that she would come back every day to visit it.\nOne day, the little girl was walking through"}]

6. Complimenti!

Congratulazioni per aver completato il codelab.

Ti consigliamo di consultare la documentazione sulle GPU di Cloud Run.

Argomenti trattati

  • Come eseguire un'app utilizzando Transformers.js su Cloud Run con le GPU

7. Esegui la pulizia

Per evitare addebiti involontari (ad esempio, se i servizi Cloud Run vengono richiamati inavvertitamente più volte rispetto all'allocazione mensile di chiamate a Cloud Run nel livello senza costi), puoi eliminare Cloud Run o il progetto che hai creato nel passaggio 2.

Per eliminare il servizio Cloud Run, vai alla console Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il servizio transformers-js-codelab.

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai cambiare progetto in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.