איך מריצים מסקנות מ-LLM במעבדי GPU ב-Cloud Run באמצעות vLLM ו-OpenAI Python SDK.

1. מבוא

סקירה כללית

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

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

אחד מהתרחישים לדוגמה של מעבדי GPU הוא הרצת מודל שפה גדול (LLM) משלכם. במדריך הזה נסביר איך פורסים שירות שמריץ מודל שפה גדול (LLM).

השירות הוא שירות לקצה העורפי שמפעיל את vLLM, מנגנון הסקת מסקנות למערכות ייצור. ה-Codelab הזה משתמש במודל Gemma 2 של Google עם 2 מיליארד פרמטרים שמכווננים לפי הוראות.

מה תלמדו

  • איך להשתמש במעבדי GPU ב-Cloud Run.
  • איך משתמשים בחיבוק פנים כדי לאחזר מודל.
  • איך לפרוס את המודל שמכוונן את ההנחיות מסוג Gemma 2 2b של Google ב-Cloud Run באמצעות vLLM כמנוע הֶקֵּשׁ.
  • איך להפעיל את השירות לקצה העורפי כדי להשלים את המשפט.

2. הגדרה ודרישות

דרישות מוקדמות

  • אתם מחוברים למסוף Cloud.
  • פרסתם בעבר שירות של Cloud Run. לדוגמה, אפשר להיעזר במדריך למתחילים לפריסת שירות אינטרנט מקוד מקור כדי להתחיל בעבודה.
  • יש לך חשבון Hugging Face ויש לך אישור לשימוש ברישיון ל-Gemma 2 2b בכתובת https://huggingface.co/google/gemma-2-2b-it; אחרת, לא תוכלו להוריד את המודל.
  • יצרת אסימון גישה עם גישה למודל google/gemma-2-2b-it.

הפעלת Cloud Shell

  1. במסוף Cloud, לוחצים על Activate Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים שמתוארת בו. אם הוצג לכם מסך ביניים, לוחצים על המשך.

d95252b003979716.png

ההקצאה וההתחברות ל-Cloud Shell נמשכת כמה דקות.

7833d5e1c5d18f54.png

במכונה הווירטואלית הזו נמצאים כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. אם לא את כולן, ניתן לבצע חלק גדול מהעבודה ב-Codelab הזה באמצעות דפדפן.

אחרי ההתחברות ל-Cloud Shell, אתם אמורים לראות שהפרויקט מאומת ושהפרויקט מוגדר לפי מזהה הפרויקט שלכם.

  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהאימות בוצע:
gcloud auth list

פלט הפקודה

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה ב-gcloud יודעת על הפרויקט שלכם:
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

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

הפעלת ממשקי API

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

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

הגדרה של משתני סביבה

אתם יכולים להגדיר משתני סביבה שישמשו ב-Codelab הזה.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. יצירה של חשבון שירות

חשבון השירות הזה משמש לפיתוח השירות Cloud Run ולגישה לסוד מ-Secret Manager.

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

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secrete manager"

לאחר מכן, מקצים לחשבון השירות את התפקיד Vertex AI User.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

עכשיו, יוצרים סוד ב-Secret Manager בשם HF_TOKEN לאסימון Hugging Face Access Token. מערכת Cloud Build משתמשת בחשבון השירות כדי לגשת לסוד הזה בזמן ה-build כדי למשוך למטה את המודל Gemma 2 (2B) מהפנים החיבוק. כאן תוכלו לקרוא מידע נוסף על סודות ועל Cloud Build.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

ולהעניק לחשבון השירות גישה לסוד HF_TOKEN ב-Secret Manager.

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. יצירת התמונה ב-Artifact Registry

קודם כול, יוצרים מאגר ב-Artifact Registry.

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

בשלב הבא, יוצרים Dockerfile שישלב את הסוד מ-Secret Manager. כאן אפשר לקבל מידע נוסף על Docker buildx –Secrets.

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

עכשיו יוצרים קובץ cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

לסיום, שולחים build.

gcloud builds submit --config=cloudbuild.yaml

משך ה-build יכול להימשך כ-8 דקות.

6. פריסת השירות

עכשיו אתם מוכנים לפרוס את התמונה ל-Cloud Run.

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

הפריסה עשויה להימשך עד 5 דקות.

7. בדיקת השירות

לאחר הפריסה, תוכלו להשתמש בשירות ה-proxy למפתחים של Cloud Run שמוסיף בשבילכם אסימון מזהה באופן אוטומטי, או מצמידים ישירות את כתובת ה-URL של השירות.

שימוש בשירות ה-proxy למפתחים של Cloud Run

כדי להשתמש בשירות ה-proxy למפתחים של Cloud Run, אפשר לבצע את השלבים הבאים:

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

gcloud run services proxy $SERVICE_NAME --region us-central1

בשלב הבא, מצמידים את השירות

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

שימוש ישיר בכתובת ה-URL של השירות

קודם כול, מאחזרים את כתובת ה-URL של השירות שנפרס.

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

עקיפת השירות

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

תוצאות

אמורות להתקבל תוצאות שדומות לאלה:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. מעולה!

מזל טוב, השלמת את Codelab!

מומלץ לעיין בתיעוד של Cloud Run

אילו נושאים דיברנו?

  • איך להשתמש במעבדי GPU ב-Cloud Run.
  • איך משתמשים בחיבוק פנים כדי לאחזר מודל.
  • איך לפרוס את מודל Gemma 2 (2B) של Google ב-Cloud Run באמצעות vLLM כמנוע הסקה.
  • איך להפעיל את השירות לקצה העורפי כדי להשלים את המשפט.

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

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

כדי למחוק את השירות Cloud Run, צריך להיכנס למסוף Cloud Run Cloud בכתובת https://console.cloud.google.com/run ולמחוק את השירות vllm-gemma-2-2b. כדאי גם למחוק את חשבון השירות של vllm-gemma-2-2b.

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