Exécuter Transformers.js sur des GPU Cloud Run

1. Introduction

Présentation

Cloud Run a récemment ajouté la prise en charge des GPU. Elle est disponible en version Preview publique sur liste d'attente. Si vous souhaitez essayer cette fonctionnalité, remplissez ce formulaire pour rejoindre la liste d'attente. Cloud Run est une plate-forme de conteneurs sur Google Cloud qui vous permet d'exécuter facilement votre code dans un conteneur, sans avoir à gérer de cluster.

Aujourd'hui, les GPU que nous mettons à disposition sont des GPU Nvidia L4 avec 24 Go de VRAM. Il existe un GPU par instance Cloud Run, et l'autoscaling Cloud Run s'applique toujours. Cela inclut le scaling horizontal jusqu'à cinq instances (avec une augmentation de quota disponible), ainsi que le scaling à zéro instance lorsqu'aucune requête n'est reçue.

Transformers.js est conçu pour être fonctionnellement équivalent à la bibliothèque Python Transformers de Hugging Face, ce qui signifie que vous pouvez exécuter les mêmes modèles pré-entraînés à l'aide d'une API très similaire. Pour en savoir plus, consultez le site Web de Transformers.js.

Dans cet atelier de programmation, vous allez créer et déployer une application sur Cloud Run qui utilise Transformers.js et des GPU.

Points abordés

  • Exécuter une application à l'aide de Transformers.js sur Cloud Run à l'aide de GPU

2. Activer les API et définir les variables d'environnement

Avant de commencer cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite l'utilisation des API suivantes. Vous pouvez activer ces API en exécutant la commande suivante :

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

Vous pouvez ensuite définir des variables d'environnement qui seront utilisées tout au long de cet atelier de programmation.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. Créer l'application Transformers.js

Tout d'abord, créez un répertoire pour le code source et accédez-y.

mkdir transformers-js-codelab && cd $_

Créez un fichier 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"
    }
  }

Créez un fichier nommé 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}`);
});

Créez un Dockerfile. Le Dockerfile installera les pilotes NVIDIA supplémentaires nécessaires pour 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. Créer et déployer le service Cloud Run

Créez un dépôt dans Artifact Registry.

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

Envoyez votre code à Cloud Build.

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

Ensuite, déployez-le sur 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. Tester le service

Vous pouvez tester le service en exécutant la commande suivante :

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

curl $SERVICE_URL

Vous verrez alors un résultat semblable à celui-ci :

[{"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. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Nous vous recommandons de consulter la documentation sur les GPU Cloud Run.

Points abordés

  • Exécuter une application à l'aide de Transformers.js sur Cloud Run à l'aide de GPU

7. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si les services Cloud Run sont appelés par inadvertance plus de fois que votre allocation mensuelle d'appels Cloud Run dans le niveau sans frais), vous pouvez supprimer Cloud Run ou le projet que vous avez créé à l'étape 2.

Pour supprimer le service Cloud Run, accédez à Cloud Run dans Cloud Console à l'adresse https://console.cloud.google.com/run, puis supprimez le service transformers-js-codelab.

Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez modifier les projets dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.