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

1. מבוא

סקירה כללית

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

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

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

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

מה תלמדו

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

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

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

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

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על 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 secret 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. ‫Cloud Build משתמש בחשבון השירות כדי לגשת לסוד הזה בזמן הבנייה, כדי להוריד את מודל Gemma 2 (2B) מ-Hugging Face. מידע נוסף על סודות ו-Cloud Build

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

בנוסף, צריך לתת לחשבון השירות שמוגדר כברירת מחדל ב-Compute גישה לסוד HF_TOKEN ב-Secret Manager כשיוצרים את התמונה.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

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

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

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

בשלב הבא, יוצרים Dockerfile שישלב את ה-Secret מ-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

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

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

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

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

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

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

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

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

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

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

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

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

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.
  • איך משתמשים ב-Hugging Face כדי לאחזר מודל.
  • איך פורסים את מודל Gemma 2 (2B) של Google ב-Cloud Run באמצעות vLLM כמנוע הסקה.
  • איך מפעילים את שירות ה-Backend כדי להשלים משפטים.

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

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

כדי למחוק את שירות Cloud Run, עוברים אל Cloud Run Cloud Console בכתובת 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.