Exécuter Transformers.js sur des GPU Cloud Run

1. Introduction

Présentation

Cloud Run est depuis peu compatible avec les GPU. Elle est disponible en version Preview publique sur liste d'attente. Si vous souhaitez tester cette fonctionnalité, remplissez ce formulaire pour vous inscrire sur 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 à votre disposition sont des GPU Nvidia L4 avec 24 Go de vRAM. Un GPU est associé à chaque instance Cloud Run, et l'autoscaling Cloud Run s'applique toujours. Cela inclut un scaling horizontal jusqu'à cinq instances (avec une augmentation de quota disponible), ainsi qu'un scaling à la baisse jusqu'à zéro instance en l'absence de requêtes.

Transformers.js est conçu pour être fonctionnellement équivalent à la bibliothèque Python Transformer 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 dans Cloud Run qui utilise Transformers.js et des GPU.

Points abordés

  • Exécuter une application avec Transformers.js dans Cloud Run avec des GPU

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

Avant de commencer à utiliser cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite d'utiliser les 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 les 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 utilisez la commande cd pour y accéder.

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 appelé 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 objet Dockerfile. Le fichier dockerfile installe 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

Déployer 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

Un résultat semblable aux lignes suivantes s'affiche :

[{"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 !

Félicitations ! 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 avec Transformers.js sur Cloud Run à l'aide de GPU

7. Effectuer un nettoyage

Pour éviter les 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 gratuit), vous pouvez supprimer Cloud Run ou le projet que vous avez créé à l'étape 2.

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

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