1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام التقسيم الديناميكي في GKE لتحسين استخدام موارد Cloud TPU. التقسيم الديناميكي هو إمكانية فعّالة تتيح لك فصل توفير وحدات TPU الأولية عن جدولة أعباء العمل.
على وجه التحديد، ستستكشف نمطَين رئيسيَّين:
- التقسيم الفرعي: تقسيم وحدة TPU كبيرة تم توفيرها إلى شرائح أصغر ومعزولة لأحمال العمل الأصغر
- التقسيم الفائق: دمج عدة كتل من وحدات TPU الموفّرة معًا لتكوين شريحة افتراضية أكبر لأحمال العمل الكبيرة.
ستطبّق هذه الأنماط لتفعيل بنية الخدمة المجزّأة (التعبئة المسبقة/فك الترميز) عالية الأداء لنموذج لغة كبير (Qwen 397B) باستخدام Kueue وLeaderWorkerSet (LWS) وGateway API.
الهندسة المعمارية
في ما يلي البنية عالية المستوى لإعداد "التقسيم الديناميكي لوحدة TPU" و"الخدمة المجزّأة":

الإجراءات التي ستنفذّها
- توفير مجموعة GKE مع تفعيل GKE Slice Controller
- إنشاء مجموعات عقد GKE TPU تم ضبطها لتوفير الموارد بشكل تدريجي
- يمكنك نشر Kueue وLeaderWorkerSet لإدارة أحمال عمل وحدات TPU.
- تشغيل عبء عمل تقسيم فرعي للتحقّق من إمكانية الوصول إلى JAX TPU على شرائح أصغر
- نفِّذ عبء عمل التقسيم الفائق للتحقّق من إمكانية الوصول إلى JAX TPU على مستوى مجموعات متعددة من العُقد المدمجة.
- استخدِم إعداد العرض المجزّأ حيث يتم تشغيل مرحلتَي "التعبئة المسبقة" و"فك الترميز" على شرائح TPU منفصلة يتم تخصيصها بشكل ديناميكي، ويتم تنسيقها بواسطة موجّه نموذج لغوي كبير.
المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع Google Cloud تم تفعيل الفوترة فيه
- ملاحظة مهمة: الوصول إلى حجز في وضع "كل السعة" على Cloud TPU7x (Ironwood)
2. قبل البدء
إنشاء مشروع على Google Cloud أو اختياره
إنشاء مشروع على Google Cloud
- في Google Cloud Console، في صفحة اختيار المشروع، اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
- تأكَّد من تفعيل الفوترة لمشروعك على السحابة الإلكترونية. كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع
بدء Cloud Shell
Cloud Shell هي بيئة سطر أوامر تعمل في Google Cloud ومحمّلة مسبقًا بالأدوات اللازمة.
- انقر على تفعيل Cloud Shell في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بـ Cloud Shell، تحقَّق من المصادقة باتّباع الخطوات التالية:
gcloud auth list - تأكَّد من إعداد مشروعك باتّباع الخطوات التالية:
gcloud config get project - إذا لم يتم ضبط مشروعك على النحو المتوقّع، اضبطه باتّباع الخطوات التالية:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
إنشاء نسخة طبق الأصل من مستودع العروض الترويجية
استنسِخ المستودع الذي يحتوي على ملفات البيان والنصوص البرمجية المساعدة لهذا الدرس التطبيقي حول الترميز:
git clone --depth 1 --sparse https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos
git sparse-checkout set ai-ml/dynamic-slicing
cd ai-ml/dynamic-slicing
3- ضبط إعدادات البيئة
قبل توفير الموارد، عليك ضبط متغيّرات البيئة. يتم توفير نص برمجي مساعد 01_setup_env.sh لإنشاء ملف env.sh.
شغِّل نص التهيئة البرمجي:
./01_setup_env.sh
سيُطلب منك إدخال عدة قيم. اضغط على [ENTER] لقبول الإعدادات التلقائية، ولكن تأكَّد من تقديم اسم الحجز وفترة الحجز الصحيحَين اللذين قدّمهما لك مدرّب الحدث:
- رقم تعريف مشروع GCP: رقم تعريف مشروعك الحالي
- رقم مشروع Google Cloud Platform: رقم مشروعك
- اسم مجموعة GKE:
tpu-serving-cluster(تلقائي) - منطقة مجموعة أجهزة ذات التخصيص نفسه لوحدة معالجة الموتّرات:
us-central1-ai1a(تلقائي). - مساحة اسم Kubernetes:
llm-d-pd-disaggregation(تلقائي). - اسم حجز Cloud TPU: [أدخِل اسم الحجز المقدَّم]
- اسم مجموعة حجز Cloud TPU:
block-0(القيمة التلقائية) - اسم حزمة GCS للأوزان:
model-weights(تلقائي). - نوع آلة TPU:
tpu7x-standard-4t(تلقائي) - رمز Hugging Face المميز: [أدخِل رمز HF المميز إذا لزم الأمر، أو اضغط على ENTER إذا كنت تستخدم أوزانًا محمّلة مسبقًا]
بعد تشغيل النص البرمجي، طبِّق المتغيرات على جلستك الحالية:
source env.sh
4. تفعيل واجهات برمجة التطبيقات وميزات "منطقة الذكاء الاصطناعي"
بعد إعداد بيئتك، عليك تفعيل واجهات برمجة التطبيقات المطلوبة في Google Cloud وميزة إمكانية الوصول إلى "منطقة الذكاء الاصطناعي". يتم توفير نص برمجي مساعد 02_enable_apis_and_features.sh.
شغِّل النص البرمجي:
./02_enable_apis_and_features.sh
يعمل هذا النص البرمجي على:
- تفعيل واجهات برمجة التطبيقات الخاصة بخدمات GKE وCompute وIAM وResource Manager وFilestore وNetwork Services
- تفعّل هذه السمة ميزة المعاينة
ai-zones-visibilityلخدمة "التقسيم الديناميكي" في GKE.
5- توفير مجموعات عقد GKE ومجموعات عقد TPU
في هذه الخطوة، عليك توفير البنية الأساسية للشبكة ومجموعة GKE ومجموعات عقد TPU.
سيتم إعداد مجموعات أجهزة TPU ذات التخصيص نفسه باستخدام توفير الموارد بشكل تدريجي (باستخدام --placement-policy=superslice-policy و--reservation-affinity=specific)، ما يؤدي إلى ربط كل مجموعة أجهزة ذات التخصيص نفسه بمكعّب (كتلة فرعية) من سعة TPU الأولية يضم 16 عقدة.
شغِّل نص إدارة الحسابات:
./03_create_cluster_and_nodes.sh
وظيفة هذا النص البرمجي:
- إنشاء شبكة VPC وشبكات فرعية: يتم إعداد شبكة VPC رئيسية ذات وحدة نقل قصوى (MTU) كبيرة (8896) محسّنة لعدد زيارات TPU، وشبكة فرعية خاصة بوحدة TPU، وشبكة فرعية مخصّصة للخادم الوكيل فقط تتطلّبها GKE Gateway.
- إنشاء مجموعة GKE: توفير مجموعة GKE عادية مع تفعيل Slice Controller (
--enable-slice-controller) - إنشاء سياسة عبء العمل: تحدّد سياسة موارد باسم
superslice-policyمن النوعHIGH_THROUGHPUTمع بنية4x4x4. - إنشاء مجموعات عقد لوحدات معالجة الموتّرات (TPU) في GKE: يتم توفير مجموعتَين من العُقد (
tpu7-pool-1وtpu7-pool-2)، تحتوي كل منهما على 16 عقدة منtpu7x-standard-4t. وهي تمثّل مكعّبَين منفصلَين مكوّنَين من 16 عقدة.
التحقّق من العُقد
بعد اكتمال النص البرمجي، تحقَّق من توفير جميع عُقد TPU البالغ عددها 32 وتسجيلها:
kubectl get nodes -l google.com/tpu=present
من المفترض أن تظهر لك 32 عقدة في القائمة.
6. تثبيت أدوات التنسيق
تعتمد عملية التقسيم الديناميكي على العديد من أدوات التحكّم في Kubernetes لتنسيق المهام وتخصيص الشرائح. عليك تثبيت ما يلي:
- JobSet: لإدارة مجموعة من المهام (مطلوبة لتقسيم البيانات إلى شرائح فائقة).
- Kueue: لتنظيم المهام في قوائم الانتظار وإدارة الموارد واستخدام ميزة "الجدولة المتوافقة مع البنية" (TAS).
- LeaderWorkerSet (LWS): لإدارة عمليات نشر وحدات TPU المتعددة العُقد المنسوخة (مطلوبة لعرض النماذج اللغوية الكبيرة).
- GKE Slice Controller (مساحة المستخدم): يربط Kueue بـ TPU Cluster Director لإدارة الشرائح المادية بشكل ديناميكي.
شغِّل نص التثبيت البرمجي:
./04_install_kueue_lws_slice_controller.sh
تأكَّد من أنّ Slice Controller يعمل بنجاح:
kubectl rollout status deployment/slice-controller-controller-manager -n slice-controller-system
7. إعداد موارد Kueue
عليك الآن تحديد موارد Kueue التي تمثّل بنية أجهزة TPU وضبط عمليات التحقّق من القبول.
شغِّل نص النشر البرمجي:
./05_deploy_kueue_resources.sh
الموارد الرئيسية التي تم نشرها:
- البنية (
slice-topology): تحدّد المستويات الهرمية لأقسام وحدة المعالجة العصبية (TPU) (من الكتلة إلى اسم المضيف) التي يجب أن يأخذها Kueue في الاعتبار عند جدولة المهام. - ResourceFlavor (
slice-rf): يربط هذا الحقلslice-topologyبأداة تسريعtpu7x. - AdmissionCheck (
ac): يضبط هذا الحقل Kueue لاستخدام GKE Slice Controller (accelerator.gke.io/slice) من أجل توفير الشرائح بشكل ديناميكي عند قبول مهمة. - ClusterQueue (
cq) وLocalQueue (lq): يضبطان قوائم الانتظار التي سيتم إرسال أحمال العمل إليها. - WorkloadPriorityClass (
low-priority-1000،medium-priority-2000،high-priority-3000): تحدّد مستويات الأولوية لتفعيل الاستباق والجدولة المستندة إلى الأولوية.
التحقّق من المراجع:
kubectl get topology slice-topology
kubectl get resourceflavor slice-rf
kubectl get admissioncheck ac
kubectl get clusterqueue cq
kubectl get localqueue lq -n ${NAMESPACE}
8. نشر ميزة "الوصول إلى وحدات معالجة الموتّرات مع تقسيم الشرائح" والتحقّق منها
تتيح لك التقسيم الفرعي تشغيل أحمال عمل أصغر متعددة ضمن وحدة TPU واحدة تم توفيرها. في هذه الخطوة، سترسل حمولة عمل تطلب بنية 2x2x2 (8 شرائح / 2 آلة افتراضية) إلى مجموعة مؤلّفة من وحدات 4x4x4 (64 شريحة / 16 آلة افتراضية).
نفِّذ حمل عمل تقسيم المحتوى إلى شرائح فرعية:
./06_deploy_simple_subslicing.sh
يطبّق هذا النص البرمجي kueue-jobset-simple-subslicing.yaml.
طريقة العمل:
- يتضمّن مواصفات JobSet التعليق التوضيحي
cloud.google.com/gke-tpu-slice-topology: 2x2x2. - يتم ضبط
replicas: 6وparallelism: 2(عمليات الإكمال: 2)، ما يعني أنّ Kueue سيجدول 6 مهام مستقلة، تتألف كل منها من وحدتَي pod. - يطلب كلّ لوحة
google.com/tpu: "4"(جهازًا افتراضيًا واحدًا لوحدة معالجة الموتّرات). - تعمل Kueue وGKE Slice Controller على تقسيم المجموعة المكوّنة من 32 عقدة بشكل ديناميكي لتخصيص ست شرائح
2x2x2.
التحقّق من تنفيذ JAX
راقِب الحاويات إلى أن يتم تشغيلها:
kubectl get pods -n ${NAMESPACE} -l jobset.sigs.k8s.io/jobset-name=kueue-jobset-simple-subslicing
راجِع سجلّات أحد وحدات Pod للتحقّق من أنّ JAX رصدت بنجاح 8 أجهزة TPU (نوى) في الشريحة الفرعية:
kubectl logs $(kubectl get pods -n ${NAMESPACE} -l jobset.sigs.k8s.io/jobset-name=kueue-jobset-simple-subslicing -o name | head -n 1) -n ${NAMESPACE}
من المفترض أن تظهر لك نتيجة تشير إلى: Total TPU devices (cores): 8
9- نشر ميزة "الوصول إلى وحدات معالجة Tensor" والتحقّق منها باستخدام Superslicing
التقسيم الفائق هو ميزة فعّالة في GKE تتيح لعبء عمل واحد أن يمتد على عدة وحدات مادية من وحدات معالجة الموتّرات (يُشار إليها غالبًا باسم المكعبات أو التصاميم مثل 4x4x4). ومن خلال ربط هذه الوحدات ببعضها، يمكنك إنشاء شريحة افتراضية أكبر لتدريب أو عرض أحمال العمل على نطاق واسع. في هذه الخطوة، ستنفّذ JobSet تطلب تصميم 4x4x8 (128 شريحة / 32 جهازًا افتراضيًا). وبما أنّ وحدة 4x4x4 واحدة تحتوي على 64 شريحة فقط، يتجاوز حجم عبء العمل هذا حجم وحدة واحدة ويتطلّب من GKE ربط مجموعتَي عقد tpu7-pool-1 وtpu7-pool-2 معًا بشكل ديناميكي لتلبية الطلب.
انشر حمل عمل تقسيم الشبكة الفائق:
./07_deploy_simple_superslicing.sh
يطبّق هذا النص البرمجي kueue-jobset-simple-superslicing.yaml.
طريقة العمل:
- يتضمّن نموذج JobSet التعليق التوضيحي
cloud.google.com/gke-tpu-slice-topology: 4x4x8. - تضبط هذه السياسة
parallelism: 32وcompletions: 32. - يطلب كل حاوية
google.com/tpu: "4". - بما أنّ بنية
4x4x8تتطلّب جميع العُقد الـ 32، يضبط "وحدة التحكّم في التقسيم" شبكة OCS (تبديل الدوائر الضوئية) بشكل ديناميكي لربط مجموعتَي العُقد الـ 16 ببعضهما البعض في شبكة ICI واحدة تضم 32 عقدة.
تأكَّد من تشغيل وحدات JobSet بنجاح ومن رصد JAX لجميع الأجهزة الـ 128:
kubectl get pods -n ${NAMESPACE} -l jobset.sigs.k8s.io/jobset-name=kueue-jobset-simple-superslicing
تحقَّق من سجلات إحدى الحاويات:
kubectl logs $(kubectl get pods -n ${NAMESPACE} -l jobset.sigs.k8s.io/jobset-name=kueue-jobset-simple-superslicing -o name | head -n 1) -n ${NAMESPACE}
من المفترض أن تظهر لك نتائج JAX تعرض عدد الأجهزة على مستوى العالم: Global device count: 128
10. نشر ميزة "العرض المجزّأ" (التعبئة المسبقة/فك التشفير)
ستنشر الآن حزمة عرض LLM الشاملة باستخدام تجزئة التعبئة المسبقة/فك الترميز.
في العرض العادي، يتم تنفيذ كلّ من التعبئة المُسبَقة (معالجة الطلب) وفك الترميز (إنشاء الرموز المميزة) على وحدات TPU نفسها. بما أنّ التعبئة المُسبَقة تعتمد على الحوسبة، بينما يعتمد فك الترميز على نطاق ترددي للذاكرة، فإنّ هاتين العمليتين تتعارضان مع بعضهما. يتم تشغيلها في العرض المجزّأ على شرائح TPU منفصلة، ويتم نقل KV Cache عبر الشبكة.
إعداد LLM-D وGateway
إعداد مساحات الأسماء وأسرار Hugging Face وGKE Gateway:
./08_setup_llm_d.sh
نشر جهاز توجيه LLM-D
نفِّذ جهاز التوجيه الذي سيتلقّى طلبات العميل وينسّق عملية التوجيه بين شرائح Prefill وDecode:
./09_deploy_llm_d_router.sh
نشر أحمال عمل "التعبئة المسبقة" و"فك الترميز"
نشر خوادم نماذج vLLM على شرائح TPU التي يتم تخصيصها بشكل ديناميكي:
./10_deploy_subslicing_pd_workload.sh
تتيح لك هذه الميزة ما يلي:
- تنشر
kueue-vllm-prefill-model-streamer(يطلب LWS شريحة2x2x2من وحدة معالجة الموتّرات). - تنشر
kueue-vllm-decode-model-streamer(يطلب LWS شريحة2x2x2من وحدة معالجة الموتّرات). - تحمّل شريحة التعبئة المسبقة أوزان نموذج Qwen 397B وتعمل كـ
kv_producer. - تعمل شريحة فك الترميز كـ
kv_consumer. - تتواصل هذه النماذج باستخدام
TPUConnectorHMAلنقل ذاكرات التخزين المؤقت لقيم المفاتيح.
انتظِر إلى أن يتم تشغيل كل من وحدتَي prefill وdecode:
kubectl get pods -n ${NAMESPACE} -l llm-d.ai/role=prefill
kubectl get pods -n ${NAMESPACE} -l llm-d.ai/role=decode
11. التحقّق من العرض
بعد تشغيل أحمال العمل الخاصة بالموجه والتعبئة المسبقة وفك الترميز، يمكنك الآن التحقّق من واجهة برمجة التطبيقات الخاصة بالعرض.
نفِّذ النص البرمجي الخاص بإثبات الملكية:
./11_verify_serving.sh
طريقة العمل:
- يسترد النص البرمجي عنوان IP الداخلي لبوابة GKE.
- يتم إنشاء وحدة مؤقتة (
curl-debug-comp) لإرسال طلب إكمال إلىhttp://${GATEWAY_IP}/v1/completions. - يتم إنشاء مجموعة أخرى (
curl-debug-chat) لإرسال طلب دردشة إلىhttp://${GATEWAY_IP}/v1/chat/completions.
من المفترض أن تظهر لك استجابة JSON ناجحة من نموذج Qwen:
{
"choices": [
{
"text": "... [Model Response] ..."
}
]
}
12. تَنظيم
لتجنُّب الرسوم المستمرة على حسابك على Google Cloud، احذف الموارد التي تم إنشاؤها أثناء هذا الدرس العملي.
شغِّل نص الإعداد:
./12_teardown_cleanup.sh
وظيفة هذا النص البرمجي:
- لحذف مجموعات عقد GKE (
tpu7-pool-1وtpu7-pool-2) - يحذف مجموعة GKE (
tpu-serving-cluster). - يحذف سياسات الموارد (
superslice-policy). - يحذف شبكات VPC (
qwen-serving-main).
بدلاً من ذلك، إذا أنشأت مشروعًا مخصّصًا لهذا الدرس التطبيقي حول الترميز، يمكنك حذف المشروع بأكمله:
gcloud projects delete ${PROJECT_ID}
13. تهانينا
تهانينا! لقد استكشفت ميزة "التقسيم الديناميكي" في GKE ونشرت بنجاح بنية LLM Serving المجزّأة.
ما تعلّمته
- كيفية تفعيل وحدة التحكّم في شرائح GKE وضبط مجموعات العُقد من أجل التوفير التدريجي
- كيفية استخدام Kueue لطلب طوبولوجيا محدّدة لوحدة TPU
- كيف تقسم ميزة التقسيم الفرعي كتلة كبيرة من وحدات TPU لأحمال عمل JAX أصغر ومستقلة
- كيفية دمج التقسيم الفائق لمجموعات عقد متعددة في شريحة واحدة أكبر من وحدات TPU الافتراضية
- كيفية نشر العرض المجزّأ المسبق/فك التشفير باستخدام LWS وGateway API وvLLM