איך מפעילים הסקת נתונים בכמות גדולה (batch inference) במשימות ב-Cloud Run

1. מבוא

סקירה כללית

ב-codelab הזה תשתמשו במשימות Cloud Run כדי להריץ הסקת מסקנות באצווה באמצעות מודל שפה גדול (LLM) Llama 3.2-1b של Meta ו-vLLM שמבוססים על GPU של משימות Cloud Run. תכתבו את התוצאות ישירות ל-Cloud Storage באמצעות טעינת נפחים ב-Cloud Run.

מה תלמדו

  • איך מבצעים הסקה באצווה באמצעות GPU של Cloud Run Jobs
  • איך לכתוב ל-Cloud Storage באמצעות טעינת נפח של Cloud Run

‫2. לפני שמתחילים

הפעלת ממשקי API

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

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

מכסת GPU

איך מבקשים להגדיל את המכסות באזור נתמך המכסה היא nvidia_l4_gpu_allocation_no_zonal_redundancy, בקטע Cloud Run Admin API.

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

Hugging Face

ב-codelab הזה נעשה שימוש במודל שמתארח ב-Hugging Face. כדי לקבל את המודל הזה, צריך לבקש את אסימון הגישה של המשתמש ב-Hugging Face עם הרשאת 'קריאה'. תצטרכו להשתמש בו בהמשך כשתסמנו את האירוע כאירוע מרכזי.YOUR_HF_TOKEN

כדי להשתמש במודל, צריך גם להסכים לתנאי השימוש: https://huggingface.co/meta-llama/Llama-3.2-1B

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

בקטע הזה מוסבר איך להגדיר את המשאבים הבאים:

  • חשבון שירות ב-IAM והרשאות IAM שמשויכות אליו.
  • Secret Manager secret (סוד ב-Secret Manager) כדי לאחסן את האסימון של Hugging Face.
  • קטגוריה של Cloud Storage לאחסון תוצאת ההסקה.

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

  1. מגדירים את משתני הסביבה של ה-Codelab הזה:
    export PROJECT_ID=<your_project_id>
    export REGION=<your_region>
    export HF_TOKEN=<YOUR_HF_TOKEN>
    
    export SERVICE_ACCOUNT=inference-service-account
    export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
    export SECRET_ID=hugging-face-token
    export BUCKET_NAME=inference-codelab-${PROJECT_ID}
    
  2. יוצרים את חשבון השירות על ידי הרצת הפקודה:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. משתמשים ב-Secret Manager כדי לאחסן את אסימון הגישה של Hugging Face:
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. מקצים לחשבון השירות את התפקיד Secret Manager Secret Accessor:
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. יוצרים קטגוריה לאירוח המודל שעבר כוונון:
    gcloud storage buckets create -l us-central1 gs://${BUCKET_NAME}
    
  6. נותנים לחשבון השירות גישה לדלי:
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. יוצרים מאגר Artifact Registry לאחסון קובץ האימג' של הקונטיינר. אם כבר השתמשתם בעבר בפריסות של מקורות Cloud Run בפרויקט, אתם יכולים לדלג על השלב הזה.
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. יצירת משימה ב-Cloud Run

בקטע הזה תיצרו את הקוד שמבצע את הפעולות הבאות:

  • ייבוא של מודל Llama מ-Hugging Face
  • מבצע היקש אצווה על המודל. התהליך הזה משתמש ב-GPU יחיד מסוג L4.
  • כותב את התוצאות בדיסק מקומי. הנתונים נכתבים ל-Cloud Storage באמצעות טעינת אמצעי אחסון.

כדי ליצור את משימת Cloud Run ואת קובץ ה-Dockerfile:

  1. יוצרים ספרייה לאירוח קוד המשימה של הכוונון העדין:
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. יוצרים קובץ בשם main.py
    # SPDX-License-Identifier: Apache-2.0
    from vllm import LLM, SamplingParams
    
    # Sample prompts.
    prompts = [
        "Cloud Run is",
        "The future of AI is",
        "The capital of Germany is",
        "python as a programming language is",
    ]
    # Create a sampling params object.
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    
    # Create an LLM.
    llm = LLM(model="meta-llama/Llama-3.2-1B")
    # Generate texts from the prompts. The output is a list of RequestOutput objects
    # that contain the prompt, generated text, and other information.
    outputs = llm.generate(prompts, sampling_params)
    
    # Save the outputs to disk
    with open("/results/output.txt", "w") as f:
        for output in outputs:
            prompt = output.prompt
            generated_text = output.outputs[0].text
            f.write(f"Prompt: {prompt!r}, Generated text: {generated_text!r}\n")
    
    print(f"Wrote {len(outputs)} to disk.")
    
  3. יצירת Dockerfile:
    FROM python:3.12
    ADD main.py .
    RUN python -m pip install --upgrade pip setuptools
    RUN pip install vllm
    CMD ["python", "./main.py"]
    

5. פריסה והפעלה של המשימה

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

  1. יוצרים את המשימה ב-Cloud Run:
    gcloud run jobs deploy inference-job \
      --region $REGION \
      --source . \
      --gpu=1 \
      --set-secrets HF_TOKEN=${SECRET_ID}:latest \
      --add-volume name=results,type=cloud-storage,bucket=${BUCKET_NAME} \
      --add-volume-mount volume=results,mount-path=/results \
      --service-account $SERVICE_ACCOUNT_EMAIL
    
    הפקודה הזו יוצרת את האימג' ממקור ופורסת את המשימה. התהליך יימשך זמן מה.
  2. מריצים את העבודה:
    gcloud run jobs execute inference-job --region $REGION --async
    
    השלמת העבודה נמשכת כמה דקות. אפשר לבדוק את הסטטוס באמצעות הקישור שמופיע בפלט של הפקודה האחרונה.

אישור ההצלחה

כדי לוודא שהעבודה בוצעה בהצלחה, מעיינים ביומנים של העבודה כמו בפלט של הפקודה האחרונה.

בודקים את התוצאות בקטגוריה של Cloud Storage:

במסוף:

  1. נכנסים אל Cloud Storage.
  2. בוחרים את הקטגוריה שמתחילה ב-inference-codelab.
  3. יש לבחור באפשרות output.txt.
  4. לוחצים על כתובת URL מאומתת כדי להציג את התוכן בדפדפן.

התוכן של הקובץ צריך לכלול את ארבע ההנחיות והפלט שלהן.

6. מעולה!

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

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

מה נכלל

  • איך מבצעים הסקה באצווה באמצעות GPU של Cloud Run Jobs
  • איך לכתוב ל-Cloud Storage באמצעות טעינת נפח של Cloud Run

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

כדי למחוק את עבודת Cloud Run, נכנסים אל Cloud Run Cloud Console בכתובת https://console.cloud.google.com/run ומוחקים את עבודת inference-job.

כדי למחוק את הפרויקט כולו, עוברים אל Manage Resources (ניהול משאבים), בוחרים את הפרויקט שיצרתם בשלב 2 ולוחצים על Delete (מחיקה). אם מוחקים את הפרויקט, צריך לשנות את הפרויקט ב-Cloud SDK. כדי לראות את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.