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

1. מבוא

סקירה כללית

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

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

Transformers.js תוכנן להיות מקביל מבחינה פונקציונלית לספריית ה-Python של Transformers של Hugging Face, כלומר אפשר להריץ את אותם מודלים שהותאמו מראש באמצעות ממשק 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 \

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

PROJECT_ID=<YOUR_PROJECT_ID>

AR_REPO_NAME=repo
REGION=us-central1

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

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

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. קובץ ה-Docker יתקין מנהלי התקנים נוספים של 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 של Cloud Run בכתובת https://console.cloud.google.com/run ומוחקים את השירות transformers-js-codelab.

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