שימוש ב-vLLM ב-GKE להרצת היקש עם Qwen3

במדריך הזה נסביר איך לפרוס ולהכניס לשימוש בסביבת הייצור מודל שפה גדול (LLM) מסוג Qwen3 באמצעות framework לפרסום מודלים של vLLM. אתם פורסים את המודל במכונה וירטואלית (VM) אחת מסוג A4 ב-Google Kubernetes Engine ‏ (GKE).

המדריך הזה מיועד למהנדסי למידת מכונה (ML), לאדמינים ולאופרטורים של פלטפורמות ולמומחים בתחום הנתונים וה-AI שרוצים להשתמש ביכולות של Kubernetes לניהול קונטיינרים כדי לטפל בעומסי עבודה של הסקת מסקנות.

מטרות

  1. אפשר לגשת אל Qwen3 באמצעות Hugging Face.

  2. הכנת הסביבה.

  3. יוצרים אשכול GKE במצב Autopilot.

  4. יוצרים סוד של Kubernetes לפרטי הכניסה של Hugging Face.

  5. פריסת קונטיינר vLLM לאשכול GKE.

  6. אפשר ליצור אינטראקציה עם Qwen3 באמצעות curl.

  7. לפנות.

עלויות

במדריך הזה נעשה שימוש ברכיבים של Google Cloud שחלים עליהם חיובים, כולל:

כדי ליצור הערכת עלויות על סמך השימוש החזוי, אתם יכולים להשתמש במחשבון עלויות.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את ממשק ה-API הנדרש:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את ממשק ה-API הנדרש:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  14. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/container.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
  15. נכנסים לחשבון Hugging Face או יוצרים חשבון.

גישה אל Qwen3 באמצעות Hugging Face

כדי להשתמש ב-Hugging Face כדי לגשת ל-Qwen3, פועלים לפי השלבים הבאים:

  1. כניסה לחשבון Hugging Face
  2. יוצרים אסימון גישה ל-Hugging Face read. לוחצים על Your Profile > Settings > Access Tokens > +Create new token (הפרופיל שלך > הגדרות > טוקנים לגישה > +יצירת טוקן חדש).
  3. מציינים שם לבחירתכם לטוקן ואז בוחרים תפקיד. רמת ההרשאה המינימלית בתפקיד שאפשר לבחור במדריך הזה היא קריאה.
  4. בוחרים באפשרות יצירת טוקן.
  5. מעתיקים את הטוקן שנוצר ושומרים אותו בלוח. תשתמשו בו בהמשך המדריך הזה.

הכנת הסביבה

כדי להכין את הסביבה, מגדירים את משתני הסביבה שמוגדרים כברירת מחדל:

gcloud config set project PROJECT_ID
gcloud config set billing/quota_project PROJECT_ID
export PROJECT_ID=$(gcloud config get project)
export RESERVATION_URL=RESERVATION_URL
export REGION=REGION
export CLUSTER_NAME=CLUSTER_NAME
export HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN
export NETWORK=NETWORK_NAME
export SUBNETWORK=SUBNETWORK_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: המזהה של Google Cloud הפרויקט Google Cloud שבו רוצים ליצור את אשכול GKE.

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

    • ההזמנה קיימת בפרויקט: RESERVATION_NAME

    • ההזמנה קיימת בפרויקט אחר, והפרויקט שלכם יכול להשתמש בה: projects/RESERVATION_PROJECT_ID/reservations/RESERVATION_NAME

  • REGION: האזור שבו רוצים ליצור את אשכול GKE. אפשר ליצור את האשכול רק באזור שבו קיימת ההזמנה.

  • CLUSTER_NAME: השם של אשכול GKE שרוצים ליצור.

  • HUGGING_FACE_TOKEN: אסימון הגישה של Hugging Face שיצרתם בקטע הקודם.

  • NETWORK_NAME: הרשת שבה נעשה שימוש באשכול GKE. מציינים אחד מהערכים הבאים:

    • אם יצרתם רשת בהתאמה אישית, צריך לציין את שם הרשת.

    • אחרת, מציינים את הערך default.

  • SUBNETWORK_NAME: רשת המשנה שבה נעשה שימוש באשכול GKE. מציינים אחד מהערכים הבאים:

    • אם יצרתם רשת משנה בהתאמה אישית, צריך לציין את השם של רשת המשנה. אפשר לציין רק רשת משנה שנמצאת באותו אזור של השריין.

    • אחרת, מציינים את הערך default.

יצירת אשכול GKE במצב Autopilot

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

gcloud container clusters create-auto $CLUSTER_NAME \
    --project=$PROJECT_ID \
    --region=$REGION \
    --release-channel=rapid \
    --network=$NETWORK \
    --subnetwork=$SUBNETWORK

יצירת אשכול GKE עשויה להימשך זמן מה. כדי לוודא ש- Google Cloud סיים ליצור את האשכול, עוברים אל Kubernetes clusters במסוף Google Cloud .

יצירת סוד ב-Kubernetes לפרטי הכניסה של Hugging Face

כדי ליצור סוד של Kubernetes לפרטי הכניסה של Hugging Face, פועלים לפי השלבים הבאים:

  1. מגדירים את kubectl לתקשורת עם אשכול GKE:

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --location=$REGION
    
  2. יוצרים סוד של Kubernetes לאחסון הטוקן של Hugging Face:

    kubectl create secret generic hf-secret \
        --from-literal=hf_token=${HUGGING_FACE_TOKEN} \
        --dry-run=client -o yaml | kubectl apply -f -
    

פריסת קונטיינר vLLM באשכול GKE

כדי לפרוס את קונטיינר vLLM כדי להכניס לשימוש בסביבת הייצור את מודל Qwen3 באמצעות Kubernetes Deployments, מבצעים את הפעולות הבאות:

  1. יוצרים קובץ qwen3-235b-deploy.yaml עם הפריסה של vLLM שבחרתם. :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vllm-qwen3-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: qwen3-server
      template:
        metadata:
          labels:
            app: qwen3-server
            ai.gke.io/model: Qwen3-235B-A22B-Instruct-2507
            ai.gke.io/inference-server: vllm
        spec:
          containers:
          - name: qwen-inference-server
            image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250801_0916_RC01
            resources:
              requests:
                cpu: "10"
                memory: "1000Gi"
                ephemeral-storage: "500Gi"
                nvidia.com/gpu: "8"
              limits:
                cpu: "10"
                memory: "1000Gi"
                ephemeral-storage: "500Gi"
                nvidia.com/gpu: "8"
            command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
            args:
            - --model=$(MODEL_ID)
            - --tensor-parallel-size=8
            - --host=0.0.0.0
            - --port=8000
            - --max-model-len=8192
            - --max-num-seqs=4
            - --dtype=bfloat16
            env:
            - name: MODEL_ID
              value: "Qwen/Qwen3-235B-A22B-Instruct-2507"
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_token
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
            livenessProbe:
              httpGet:
                path: /health
                port: 8000
              initialDelaySeconds: 1320
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /health
                port: 8000
              initialDelaySeconds: 1320
              periodSeconds: 5
          volumes:
          - name: dshm
            emptyDir:
              medium: Memory
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-b200
            cloud.google.com/reservation-name: RESERVATION_URL
            cloud.google.com/reservation-affinity: "specific"
            cloud.google.com/gke-gpu-driver-version: latest
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: qwen3-service
    spec:
      selector:
        app: qwen3-server
      type: ClusterIP
      ports:
        - protocol: TCP
          port: 8000
          targetPort: 8000
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: vllm-qwen3-monitoring
    spec:
      selector:
        matchLabels:
          app: qwen3-server
      endpoints:
      - port: 8000
        path: /metrics
        interval: 30s
    
  2. מחילים את קובץ qwen3-235b-deploy.yaml על אשכול GKE:

    kubectl apply -f qwen3-235b-deploy.yaml
    

    במהלך תהליך הפריסה, הקונטיינר צריך להוריד את מודל Qwen3-235B-A22B-Instruct-2507 מ-Hugging Face. לכן, יכול להיות שיחלפו עד 30 דקות עד שהפריסה של מאגר התגים תושלם.

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

    kubectl wait \
        --for=condition=Available \
        --timeout=1500s deployment/vllm-qwen3-deployment
    

    הדגל --timeout=1500s מאפשר לפקודה לעקוב אחרי הפריסה למשך עד 25 דקות.

אינטראקציה עם Qwen3 באמצעות curl

כדי לאמת את מודל Qwen3 שפרסתם:

  1. מגדירים העברה ליציאה אחרת ל-Qwen3:

    kubectl port-forward service/qwen3-service 8000:8000
    
  2. פותחים חלון טרמינל חדש. אחרי שתבחרו מודל, תוכלו לשוחח איתו באמצעות curl:

    curl http://127.0.0.1:8000/v1/chat/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
      "model": "Qwen/Qwen3-235B-A22B-Instruct-2507",
      "messages": [
        {
          "role": "user",
          "content": "Describe a GPU in one short sentence?"
        }
      ]
    }'
    

    הפלט אמור להיראות כך:

    {
      "id": "chatcmpl-a926ddf7ef2745ca832bda096e867764",
      "object": "chat.completion",
      "created": 1755023619,
      "model": "Qwen/Qwen3-235B-A22B-Instruct-2507",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "A GPU is a specialized electronic circuit designed to rapidly process and render graphics and perform parallel computations.",
            "refusal": null,
            "annotations": null,
            "audio": null,
            "function_call": null,
            "tool_calls": [],
            "reasoning_content": null
          },
          "logprobs": null,
          "finish_reason": "stop",
          "stop_reason": null
        }
      ],
      "service_tier": null,
      "system_fingerprint": null,
      "usage": {
        "prompt_tokens": 16,
        "total_tokens": 36,
        "completion_tokens": 20,
        "prompt_tokens_details": null
      },
      "prompt_logprobs": null,
      "kv_transfer_params": null
    }
    

מעקב אחר ביצועי המודל

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

הסרת המשאבים

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

מחיקת פרויקט

כדי למחוק Google Cloud פרויקט:

gcloud projects delete PROJECT_ID

מחיקת אשכול GKE

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

gcloud container clusters delete $CLUSTER_NAME \
    --region=$REGION

מחיקת המשאבים

כדי למחוק את הקובץ qwen3-235b-deploy.yaml ואת הסוד של Kubernetes מאשכול GKE, מריצים את הפקודות הבאות:

kubectl delete -f qwen3-235b-deploy.yaml
kubectl delete secret hf-secret

המאמרים הבאים