مجموعات GKE Autopilot مع وحدات معالجة Tensor‏ (TPU)، وDRANET المُدارة من GKE، وGemma 4

1. نظرة عامة

يقدّم لك هذا الدرس التطبيقي البنية الأساسية للذكاء الاصطناعي التي يمكن استخدامها لتشغيل أحمال عمل الذكاء الاصطناعي. ستعمل على ما يلي:

‫Google Kubernetes Engine (GKE): هي منصة أساسية لتنظيم الحاويات.

شبكة DRANET المُدارة في GKE: شبكة لتخصيص الموارد الديناميكية تتيح تخصيص بنى أساسية للربط البيني عالي السرعة مباشرةً لحاويات وحدات معالجة الموتّرات الخاصة بك.

وحدة معالجة الموتّرات (TPU): شرائح تسريع مخصّصة من Google.

لضبط الإعدادات، عليك نشر شبكة VPC مخصّصة ومجموعة GKE في وضع التشغيل الآلي. لتفعيل DRANET المُدارة، عليك إنشاء ComputeClass وResource Claim Template. بعد ذلك، ستنفّذ عبء عمل يستخدم vLLM و Hugging Face و ComputeClass و نموذج طلب الموارد. أخيرًا، ستختبر إعدادات الشبكة والاتصال بنموذج Gemma 4.

ستستخدم الإعدادات مزيجًا من Terraform وgcloud وkubectl.

في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ المهمة التالية:

  • إعداد شبكة VPC
  • إعداد مجموعة GKE Autopilot
  • أنشئ ComputeClass وResourceClaimTemplate.
  • إنشاء عملية نشر تشغّل وحدات TPU وvLLM والمراقبة وGemma 4 من خلال Hugging Face
  • اختبار إمكانية الاتصال بالنموذج اللغوي الكبير

في هذا الدرس التطبيقي، ستنشئ النمط التالي.

الشكل 1. d38a898255a06e25.png

2. إعداد خدمات Google Cloud

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع، وهو عبارة عن سلسلة من الأحرف لا تستخدمها واجهات برمجة تطبيقات Google، ويمكنك تعديله في أي وقت.
  • رقم تعريف المشروع هو معرّف فريد لجميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، ستحتاج إلى الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. بدلاً من ذلك، يمكنك تجربة رقم تعريف خاص بك ومعرفة ما إذا كان متاحًا. لا يمكن تغييره بعد هذه الخطوة ويظلّ ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع، وتستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف فوترة تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

تفعيل Cloud Shell

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات، وبعد الانتهاء، من المفترض أن يظهر لك ما يلي:

لقطة شاشة لواجهة سطر الأوامر في Google Cloud Shell توضّح أنّه تم ربط البيئة

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا دائمًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. لست بحاجة إلى تثبيت أي تطبيق.

3- إعداد البيئة باستخدام Terraform

لإجراء هذا التدريب العملي، يجب أن يكون لديك إذن الوصول إلى وحدات TPU. الإصدار الدقيق المستخدَم هو TPU v6e.

  • عليك اتّباع مستند خطة TPU وتفعيل حصة TPU للحصول على إذن الوصول.
  • نستخدم عملية نشر صغيرة تتطلّب 4 شرائح TPU v6e (ct6e-standard-4t)ستكون شريحة 2x2 في منطقة واحدة.
  • رمز Hugging Face: يجب توفير رمز دخول لتنزيل أوزان نموذج Gemma

سننشئ شبكة VPC مخصّصة تتضمّن قواعد جدار الحماية وشبكة فرعية، ثم مجموعة في وضع الطيار الآلي. افتح Cloud Console واختَر المشروع الذي ستستخدمه.

  1. افتح Cloud Shell في أعلى يسار وحدة التحكّم، وتأكَّد من ظهور رقم تعريف المشروع الصحيح في Cloud Shell، وأكِّد أي طلبات تظهر لك للسماح بالوصول. b51b80043d3bac90.png
  2. أنشئ مجلدًا باسم gke-auto-tpu وانتقِل إليه
mkdir -p gke-auto-tpu && cd gke-auto-tpu
export PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
  1. الآن، أضِف بعض ملفات الإعداد، ما سيؤدي إلى إنشاء الملفات التالية: terraform.tfvars وvariables.tf وnet.tf.
cat << EOF > terraform.tfvars
project_id = "${PROJECT_ID}"
EOF

cat << 'EOF' > variables.tf
variable "project_id" {
  type = string
}

variable "region" {
  type    = string
  default = "us-east5"
}

variable "network_name" {
  type    = string
  default = "tpu-gke-vpc"
}

variable "subnet_name" {
  type    = string
  default = "tpu-sub1"
}

variable "cluster_name" {
  type    = string
  default = "tpu-auto-dra-cluster"
}
EOF

cat << 'EOF' > net.tf
terraform {
  required_version = ">= 1.5.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.32.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_compute_network" "tpu_vpc" {
  project                 = var.project_id
  name                    = var.network_name
  auto_create_subnetworks = false
  mtu                     = 8896
}

resource "google_compute_subnetwork" "tpu_subnet" {
  project       = var.project_id
  name          = var.subnet_name
  ip_cidr_range = "192.168.100.0/24"
  region        = var.region
  network       = google_compute_network.tpu_vpc.id
}

resource "google_compute_firewall" "allow_ssh" {
  project     = var.project_id
  name        = "${var.network_name}-allow-ssh"
  network     = google_compute_network.tpu_vpc.id
  direction   = "INGRESS"
  priority    = 1000

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
}

resource "google_compute_firewall" "allow_internal" {
  project     = var.project_id
  name        = "${var.network_name}-allow-internal"
  network     = google_compute_network.tpu_vpc.id
  direction   = "INGRESS"
  priority    = 1000

  allow {
    protocol = "all"
  }

  source_ranges = ["172.16.0.0/12", "192.168.0.0/16"]
}

resource "google_container_cluster" "tpu_autopilot" {
  project  = var.project_id
  name     = var.cluster_name
  location = var.region

  enable_autopilot = true

  network    = google_compute_network.tpu_vpc.id
  subnetwork = google_compute_subnetwork.tpu_subnet.id

  release_channel {
    channel = "RAPID"
  }

  ip_allocation_policy {}

  deletion_protection = false 
}
EOF
  1. تأكَّد من أنّك في الدليل gke-auto-tpu ونفِّذ الأوامر التالية
    terraform init لتهيئة دليل العمل. هذه هي الخطوة الأولى، وهي تنزّل موفّري الخدمات المطلوبين للإعداد المحدّد.
    terraform plan -out تنشئ خطة تنفيذ توضّح الإجراءات التي ستتّخذها أداة Terraform لنشر البنية الأساسية. تتيح لك السمة -out حفظ خطة التنفيذ في ملف ثنائي باسم. يمكنك الاطّلاع على ما سيحدث بدون إجراء أي تغييرات.
    terraform apply ينفّذ التحديثات.
terraform init 
terraform plan -out vpc 
  1. الآن، شغِّل عملية النشر بعد تشغيل terraform apply، وبما أنّك تطبّق خطة التنفيذ المحفوظة، سيتم تنفيذها على الفور بدون طلب تأكيد (قد يستغرق ذلك ما بين 6 و10 دقائق).
terraform apply vpc
  1. التأكّد من صحة الإعداد
echo -e "\n=== Verifying GKE Autopilot Cluster ==="
gcloud container clusters list --filter="name:tpu-auto-dra-cluster" --project=$PROJECT_ID

echo -e "\n=== Verifying VPC Network ==="
gcloud compute networks list --filter="name:tpu-gke-vpc" --project=$PROJECT_ID

echo -e "\n=== Verifying Subnetwork ==="
gcloud compute networks subnets list --filter="name:tpu-sub1" --project=$PROJECT_ID

echo -e "\n=== Verifying Firewall Rules ==="
gcloud compute firewall-rules list --filter="name~tpu-gke-vpc-allow" --project=$PROJECT_ID

4. إنشاء نموذج Compute Class وResource Claim

علينا إنشاء مورد ComputeClass مخصّص لتحديد إعدادات مجموعة أجهزة ذات التخصيص نفسه. في حالتنا، سنستخدم شرائح TPU v6e (ct6e-standard-4t) وشبكات DRANET المُدارة.

  1. اتّصِل بالمجموعة التي أنشأتها. (ملاحظة: غيِّر المنطقة إلى المنطقة التي نشرت فيها مجموعتك.)
gcloud container clusters get-credentials tpu-auto-dra-cluster --region us-east5 --project=$PROJECT_ID
  1. تأكَّد من أنّك في دليل gke-auto-tpu ونفِّذ الأوامر التالية. يؤدي ذلك إلى إنشاء ملف بيان ComputeClass. يُرجى العِلم أنّه في حال استخدام منطقة مختلفة، عليك تغيير معلومات المنطقة إلى منطقة ضمن منطقة مجموعتك
cat << 'EOF' > computeclass.yaml
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: dranet-auto
spec:
  nodePoolAutoCreation:
    enabled: true
  nodePoolConfig:
    dra:
      networking:
        enabled: true
  priorities:
  - tpu:
      type: tpu-v6e-slice
      count: 4
      topology: "2x2" 
    acceleratorNetworkProfile: auto
    location:
      zones: 
      - us-east5-b
EOF
  1. الآن، أنشئ ComputeClass.
kubectl apply -f computeclass.yaml

kubectl describe computeclass dranet-auto
  1. في دليل gke-auto-tpu، نفِّذ الأوامر التالية. يؤدي ذلك إلى إنشاء بيان ResourceClaimTemplate المتوافق مع أجهزة الشبكة غير المتوافقة مع الوصول المباشر إلى الذاكرة (RDMA).
cat << 'EOF' > resourceclaimtpu.yaml
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-netdev
spec:
  spec:
    devices:
      requests:
      - name: req-netdev
        exactly:
          deviceClassName: netdev.google.com
          allocationMode: All
EOF
  1. الآن، أنشئ ResourceClaimTemplate.
kubectl apply -f resourceclaimtpu.yaml

kubectl describe resourceclaimtemplate all-netdev

إنشاء سرّك

  1. يستخدم هذا المختبر google/gemma-4-31B-it ، لذا عليك إنشاء رمز مميّز في Hugging Face. استبدِل YOUR_ACTUAL_HUGGING_FACE_TOKEN أدناه بالرمز المميز الفعلي.
export HF_TOKEN="YOUR_ACTUAL_HUGGING_FACE_TOKEN"
  1. تأكَّد من أنّك في دليل gke-auto-tpu ونفِّذ الأوامر التالية.
kubectl create secret generic hf-secret --from-literal=hf_token=${HF_TOKEN} 

kubectl get secrets hf-secret

5- نشر حمل عمل vLLM وGemma

يستخدم هذا الإعداد ComputeClass لتوفير الأجهزة والشبكات المطلوبة تلقائيًا (وحدة معالجة الموتّرات الإصدار 6e وDRANET المُدارة)، كما يستخدم ResourceClaimTemplate لتحديد مخطط لطلب الوصول إلى هذه الشبكة العالية السرعة، وعملية نشر تربط بينهما من خلال إنشاء مطالبات شبكة فردية لكل لوحة أثناء توسيع نطاقها.

  1. تأكَّد من أنّك في دليل gke-auto-tpu ونفِّذ ما يلي.
cat << 'EOF' > gem4-auto-dra-tpu.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gem4-dra-auto
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma4-tpu
  template:
    metadata:
      labels:
        app: gemma4-tpu
        ai.gke.io/model: gemma-4-31b-it
        ai.gke.io/inference-server: vllm-tpu
    spec:
      dnsPolicy: Default
      resourceClaims:
      - name: netdev-claim        
        resourceClaimTemplateName: all-netdev
      containers:
      - name: vllm-tpu-inference
        image: vllm/vllm-tpu:latest
        resources:
          requests:
            cpu: "30"
            memory: "240Gi"
            ephemeral-storage: "100Gi"
            google.com/tpu: "4"
          limits:
            cpu: "30"
            memory: "240Gi"
            ephemeral-storage: "100Gi"
            google.com/tpu: "4"
          claims:
          - name: netdev-claim
        command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
        args:
        - --model=$(MODEL_ID)
        - --tensor-parallel-size=4
        - --host=0.0.0.0
        - --port=8000
        - --max-model-len=32768
        - --max-num-batched-tokens=8192
        env:
        - name: MODEL_ID
          value: google/gemma-4-31B-it
        - name: HUGGING_FACE
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_token
        - name: HF_TOKEN
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_token
        volumeMounts:
        - mountPath: /dev/shm
          name: dshm
        startupProbe:
          httpGet:
            path: /health
            port: 8000
          failureThreshold: 240
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          periodSeconds: 5
      volumes:
      - name: dshm
        emptyDir:
          medium: Memory
      nodeSelector:
        cloud.google.com/compute-class: dranet-auto
---
apiVersion: v1
kind: Service
metadata:
  name: gem4-dra-service
spec:
  selector:
    app: gemma4-tpu
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
---
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: gem4-monitoring
spec:
  selector:
    matchLabels:
      app: gemma4-tpu
  endpoints:
  - port: 8000
    path: /metrics
    interval: 30s
EOF
  1. أنشئ عملية النشر.
kubectl apply -f gem4-auto-dra-tpu.yaml
  1. لمراقبة حالة الاكتمال، نفِّذ الأوامر التالية. ستنتظر وحدات البود إلى أن يتم توفير العقدة قبل أن تتمكّن من المتابعة، وقد يستغرق ذلك 13 دقيقة أو أكثر.
kubectl get pods

kubectl get deployments

kubectl describe pods -l app=gemma4-tpu

echo "       __|__"
echo "  --@--(_|_)--@--"
echo ""
echo "Waiting for Autopilot to register the TPU node (this takes a few minutes)..."

until kubectl get nodes -l gke.networks.io/accelerator-network-profile=auto -o name | grep -q "node/"; do
  sleep 60
done

echo "TPU Node detected in cluster! Waiting for hardware to provision and become Ready..."

kubectl wait --for=condition=Ready nodes -l gke.networks.io/accelerator-network-profile=auto --timeout=900s
  1. بعد إنشاء العقدة وجدولة المجموعة، يمكنك تنفيذ الأمر للاطّلاع على سجلات المجموعات. (ملاحظة: يمكنك إضافة **-f** **علم البث**). سيستغرق ذلك ما يصل إلى **15 دقيقة أو أكثر** إذا كنت تشاهد السجلات عند ظهور السلسلة (APIServer pid=1) INFO: 169.254.4.6:44290 - "GET /health HTTP/1.1" 200 OK التي تشير إلى أنّ النموذج جاهز للعرض.
kubectl logs -l app=gemma4-tpu -f | sed -u '\,"GET /health HTTP/1.1" 200 OK,q'
  1. بعد توفّر عملية النشر، يمكنك التأكّد من ربط الشبكات العالية السرعة بشكل صحيح بمجموعات وحدات TPU. نفِّذ الأمر التالي:
for pod in $(kubectl get pods -l app=gemma4-tpu -o name); do
  echo "=== Checking Networking for $pod ==="
  kubectl exec $pod -- ls /sys/class/net
  echo ""
done

ما يجب البحث عنه: من المفترض أن يظهر لك eth0 العادي بالإضافة إلى واجهات إضافية مثل eth1 إلى ethxx.

تؤكّد هذه الواجهات الإضافية أنّه تم ربط بنية DRANET المُدارة عالية السرعة بوحدة التخزين بنجاح.

6. التفاعل مع نموذج الذكاء الاصطناعي باستخدام curl

للتأكّد من صحة نموذج gemma-4-31B الذي نشرته، عليك إعداد إعادة توجيه المنفذ من الخدمة إلى جهازك المحلي.

  1. نفِّذ ما يلي في Cloud Shell الحالي:
kubectl port-forward service/gem4-dra-service 8000:8000 &
  1. الآن، افتح نافذة Cloud Shell إضافية للمشروع نفسه للدردشة مع النموذج باستخدام curl. يرسل هذا الأمر طلبًا ويبث المخرجات مباشرةً إلى نافذة الأوامر.
time curl -sN http://127.0.0.1:8000/v1/chat/completions \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-31B-it",
    "messages": [
      {
        "role": "user",
        "content": "How can GKE help deployment of AI workloads? Provide concise information. Keep the explanation under 300 words."
      }
    ],
    "max_tokens": 1024,
    "temperature": 0.7,
    "stream": true,
    "stream_options": {"include_usage": true}
  }' | grep '^data:' | sed 's/^data: //' | grep -v '\[DONE\]' | jq --unbuffered -j '
    (.choices[0].delta.content // empty), 
    if .usage then "\n\n--- Usage ---\nPrompt: \(.usage.prompt_tokens)\nCompletion: \(.usage.completion_tokens)\nTotal: \(.usage.total_tokens)\n" else empty end 
  '
  1. الاطّلاع على الردّ من النموذج

إمكانية تتبّع البيانات

بما أنّنا طبّقنا المورد المخصّص PodMonitoring، ستجمع خدمة Cloud Monitoring المقاييس من حاوية vLLM على المنفذ 8000. يمكنك الانتقال إلى Google Cloud Console المراقبة -> لوحات البيانات لعرض مقاييس مثل وقت استجابة إنشاء الرموز المميزة وطول قائمة الانتظار واستخدام ذاكرة التخزين المؤقت KV بشكلٍ أصلي.

607bcf95ce4d9a82.png

7. تَنظيم

  1. احذف الموارد من خلال تنفيذ ما يلي.
cd ~/gke-auto-tpu

kubectl delete -f gem4-auto-dra-tpu.yaml
kubectl delete -f resourceclaimtpu.yaml
kubectl delete -f computeclass.yaml
kubectl delete secret hf-secret
  1. نظِّف البنية الأساسية باستخدام الأمر التالي، واكتب yes للتأكيد.
terraform destroy

8. تهانينا

لقد تمكّنت من نشر بيئة DRANET مُدارة بنجاح على GKE Autopilot، وتوفير أجهزة TPU v6e ديناميكيًا، وتشغيل نموذج Gemma 4 الضخم الذي يتضمّن 31 مليار مَعلمة باستخدام vLLM.

باستخدام وضع التشغيل الآلي في GKE، يمكنك السماح لـ Kubernetes بالتعامل مع توفير العُقد الأساسية وإدارة البنية التحتية، ما يتيح لك التركيز بالكامل على نشر مهام عمل الذكاء الاصطناعي.

الخطوات التالية / مزيد من المعلومات

يمكنك الاطّلاع على مزيد من المعلومات حول شبكات GKE.

الدرس التطبيقي التالي

يمكنك مواصلة رحلتك مع Google Cloud، والاطّلاع على هذه المختبرات الأخرى في Google Cloud: