Transformers.js auf Cloud Run-GPUs ausführen

1. Einführung

Übersicht

Cloud Run bietet seit Kurzem GPU-Unterstützung. Sie ist als öffentliche Vorschau mit Warteliste verfügbar. Wenn Sie die Funktion ausprobieren möchten, füllen Sie dieses Formular aus, um sich auf die Warteliste setzen zu lassen. Cloud Run ist eine Containerplattform in Google Cloud, mit der Sie Ihren Code ganz einfach in einem Container ausführen können, ohne einen Cluster verwalten zu müssen.

Derzeit stellen wir Nvidia L4-GPUs mit 24 GB vRAM zur Verfügung. Pro Cloud Run-Instanz gibt es eine GPU. Das Autoscaling von Cloud Run gilt weiterhin. Dazu gehört das Hochskalieren auf bis zu fünf Instanzen (bei verfügbarer Kontingenterhöhung) sowie das Herunterskalieren auf null Instanzen, wenn keine Anfragen vorhanden sind.

Transformers.js entspricht funktional der Transformer-Python-Bibliothek von Hugging Face. Das bedeutet, dass Sie dieselben vortrainierten Modelle mit einer sehr ähnlichen API ausführen können. Weitere Informationen finden Sie auf der Transformers.js-Website.

In diesem Codelab erstellen und stellen Sie eine Anwendung in Cloud Run bereit, die Transformers.js und GPUs verwendet.

Aufgaben in diesem Lab

  • Eine Anwendung mit Transformers.js in Cloud Run mit GPUs ausführen

2. APIs aktivieren und Umgebungsvariablen festlegen

Bevor Sie dieses Codelab verwenden können, müssen Sie mehrere APIs aktivieren. Für dieses Codelab müssen die folgenden APIs verwendet werden. Sie können diese APIs aktivieren, indem Sie den folgenden Befehl ausführen:

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

Dann können Sie Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Transformers.js-App erstellen

Erstellen Sie zunächst ein Verzeichnis für den Quellcode und speichern Sie das Verzeichnis mit cd.

mkdir transformers-js-codelab && cd $_

Erstellen Sie eine package.json-Datei.

{
    "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"
    }
  }

Erstellen Sie eine Datei mit dem Namen 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}`);
});

Erstellen Sie einen Dockerfile. Das Dockerfile installiert zusätzliche NVIDIA-Treiber, die für Transformers.js erforderlich sind.

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. Cloud Run-Dienst erstellen und bereitstellen

Erstellen Sie ein Repository in Artifact Registry.

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

Reichen Sie Ihren Code bei Cloud Build ein.

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

Als Nächstes in Cloud Run bereitstellen

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. Dienst testen

Sie können den Dienst mit dem folgenden Befehl testen:

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

curl $SERVICE_URL

Die Ausgabe sollte in etwa so aussehen:

[{"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. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Lesen Sie die Dokumentation zu Cloud Run-GPUs.

Behandelte Themen

  • Eine Anwendung mit Transformers.js in Cloud Run mit GPUs ausführen

7. Bereinigen

Wenn Sie versehentliche Kosten vermeiden möchten, z. B. wenn die Cloud Run-Dienste versehentlich häufiger aufgerufen werden als Ihre monatliche Cloud Run-Aufrufzuweisung in der kostenlosen Stufe, können Sie entweder Cloud Run oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie den Cloud Run-Dienst löschen möchten, rufen Sie die Cloud Console für Cloud Run unter https://console.cloud.google.com/run auf und löschen Sie den Dienst transformers-js-codelab.

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Mit gcloud projects list können Sie eine Liste aller verfügbaren Projekte aufrufen.