איך מריצים את Transformers.js ב-Cloud Run GPUs

1. מבוא

סקירה כללית

לאחרונה נוספה ל-Cloud Run תמיכה ב-GPU. התכונה זמינה ב-Public Preview, אבל צריך להירשם לרשימת המתנה כדי להשתמש בה. אם אתם רוצים לנסות את התכונה, אתם יכולים למלא את הטופס הזה כדי להצטרף לרשימת ההמתנה. ‫Cloud Run היא פלטפורמת קונטיינרים ב-Google Cloud שמאפשרת להריץ את הקוד בקונטיינר בקלות, בלי צורך לנהל אשכול.

היום, מעבדי ה-GPU שאנחנו מציעים הם מעבדי Nvidia L4 עם 24GB של vRAM. יש GPU אחד לכל מכונה של Cloud Run, והתכונה 'התאמה אוטומטית לעומס' של Cloud Run עדיין חלה. זה כולל הרחבה של עד 5 מופעים (עם אפשרות להגדלת המכסה), וגם צמצום של עד אפס מופעים כשאין בקשות.

‫Transformers.js מתוכננת להיות שוות ערך מבחינת הפונקציונליות לספריית ה-transformers של Hugging Face ב-Python, כלומר אפשר להריץ את אותם מודלים שאומנו מראש באמצעות API דומה מאוד. מידע נוסף זמין באתר של Transformers.js.

ב-Codelab הזה תלמדו איך ליצור אפליקציה ולפרוס אותה ב-Cloud Run באמצעות Transformers.js ו-GPU.

מה תלמדו

  • איך מריצים אפליקציה באמצעות Transformers.js ב-Cloud Run באמצעות GPU

2. הפעלת ממשקי API והגדרת משתני סביבה

לפני שמתחילים להשתמש ב-codelab הזה, צריך להפעיל כמה ממשקי API. ב-codelab הזה צריך להשתמש בממשקי ה-API הבאים. כדי להפעיל את ממשקי ה-API האלה, מריצים את הפקודה הבאה:

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

לאחר מכן תוכלו להגדיר משתני סביבה שישמשו אתכם לאורך כל ה-codelab הזה.

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

3. יצירת אפליקציית Transformers.js

קודם יוצרים ספרייה לקוד המקור ועוברים לספרייה הזו.

mkdir transformers-js-codelab && cd $_

יוצרים קובץ 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"
    }
  }

יוצרים קובץ בשם 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}`);
});

יצירת Dockerfile. קובץ ה-Dockerfile יתקין דרייברים נוספים של NVIDIA שנדרשים ל-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. פיתוח ופריסה של שירות Cloud Run

יוצרים מאגר ב-Artifact Registry.

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

שולחים את הקוד ל-Cloud Build.

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

לאחר מכן, פורסים ב-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. בדיקת השירות

כדי לבדוק את השירות, מריצים את הפקודה הבאה:

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

curl $SERVICE_URL

ותראו משהו דומה לזה:

[{"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. מעולה!

כל הכבוד, סיימתם את ה-Codelab!

מומלץ לעיין במסמכי התיעוד בנושא GPU ב-Cloud Run.

מה נכלל

  • איך מריצים אפליקציה באמצעות Transformers.js ב-Cloud Run באמצעות GPU

7. הסרת המשאבים

כדי להימנע מחיובים לא מכוונים (לדוגמה, אם שירותי Cloud Run מופעלים בטעות יותר פעמים מהמכסה החודשית של הפעלות Cloud Run בחבילה החינמית), אפשר למחוק את Cloud Run או את הפרויקט שיצרתם בשלב 2.

כדי למחוק את שירות Cloud Run, עוברים אל Cloud Run Cloud Console בכתובת https://console.cloud.google.com/run ומוחקים את השירות transformers-js-codelab.

אם אתם רוצים למחוק את הפרויקט כולו, אתם יכולים להיכנס לכתובת https://console.cloud.google.com/cloud-resource-manager, לבחור את הפרויקט שיצרתם בשלב 2 וללחוץ על 'מחיקה'. אם תמחקו את הפרויקט, תצטרכו לשנות את הפרויקטים ב-Cloud SDK. כדי לראות את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.