مسارات Kubeflow - تلخيص مشاكل GitHub

1. مقدمة

Kubeflow هي مجموعة أدوات لتعلُّم الآلة مخصّصة لمنصة Kubernetes. يهدف المشروع إلى تسهيل عمليات نشر مهام تعلُّم الآلة (ML) على Kubernetes، بالإضافة إلى توفير إمكانية نقل هذه المهام وتوسيع نطاقها. الهدف هو توفير طريقة مباشرة لنشر أفضل أنظمة مفتوحة المصدر لتعلُّم الآلة في بنى أساسية متنوعة.

يمكن أن يتضمّن سير عمل تعلُّم الآلة العديد من الخطوات التي تعتمد على بعضها البعض، بدءًا من إعداد البيانات وتحليلها، ثم التدريب، ثم التقييم، ثم التفعيل، وغير ذلك. يصعب إنشاء هذه العمليات وتتبُّعها بطريقة مخصّصة، مثلاً في مجموعة من دفاتر الملاحظات أو النصوص البرمجية، وتصبح أمور مثل التدقيق وإمكانية التكرار أكثر إشكالية.تساعدك Kubeflow Pipelines (KFP) في حلّ هذه المشاكل من خلال توفير طريقة لنشر مسارات تعلّم آلة قوية وقابلة للتكرار، بالإضافة إلى الرصد والتدقيق وتتبُّع الإصدارات وإمكانية التكرار. تسهّل Cloud AI Pipelines عملية إعداد عملية تثبيت KFP.

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيق ويب يلخّص المشاكل في GitHub باستخدام Kubeflow Pipelines لتدريب نموذج وعرض نتائجه. ويستند إلى مثال في مستودع أمثلة Kubeflow. عند اكتمال العملية، ستتضمّن بنيتك الأساسية ما يلي:

ما ستتعلمه

سيدرِّب المسار الذي ستنشئه نموذج Tensor2Tensor على بيانات مشاكل GitHub، ويتعلّم كيفية توقّع عناوين المشاكل من نصوصها. بعد ذلك، يتم تصدير النموذج المدرَّب ونشره باستخدام Tensorflow Serving. تُطلق الخطوة الأخيرة في مسار العمل تطبيق ويب يتفاعل مع مثيل TF-Serving للحصول على توقّعات النموذج.

  • كيفية تثبيت Kubeflow Pipelines على مجموعة GKE
  • كيفية إنشاء سير عمل تعلُّم الآلة وتشغيله باستخدام Kubeflow Pipelines
  • كيفية تحديد وتشغيل خطوط الأنابيب من دفتر ملاحظات AI Platform

المتطلبات

2. الإعداد

Cloud Shell

انتقِل إلى وحدة تحكّم Google Cloud Platform في المتصفّح وسجِّل الدخول باستخدام بيانات اعتماد مشروعك:

انقر على "اختيار مشروع" إذا لزم الأمر، حتى تتمكّن من العمل على مشروع الدرس العملي.

4f23e1fe87a47cb2.png

بعد ذلك، انقر على رمز "تفعيل Cloud Shell" في أعلى يسار وحدة التحكّم لبدء تشغيل Cloud Shell.

ecf212797974dd31.png

عند بدء تشغيل Cloud Shell، سيخبرك باسم المشروع الذي تم ضبطه لاستخدامه. تأكَّد من أنّ هذا الإعداد صحيح.

للعثور على معرّف مشروعك، انتقِل إلى لوحة "الصفحة الرئيسية" في GCP Console. إذا كانت الشاشة فارغة، انقر على "نعم" في الطلب لإنشاء لوحة بيانات.

115cdf745978ad.png

بعد ذلك، في نافذة Cloud Shell، نفِّذ الأوامر التالية إذا لزم الأمر لإعداد gcloud لاستخدام المشروع الصحيح:

export PROJECT_ID=<your_project_id>
gcloud config set project ${PROJECT_ID}

إنشاء حزمة تخزين

أنشئ حزمة Cloud Storage لتخزين ملفات خطوط الإنتاج. عليك استخدام معرّف فريد على مستوى العالم، لذا من الملائم تحديد اسم حزمة يتضمّن رقم تعريف مشروعك. أنشئ الحزمة باستخدام الأمر gsutil mb (إنشاء حزمة):

export PROJECT_ID=<your_project_id>
export BUCKET_NAME=kubeflow-${PROJECT_ID}
gsutil mb gs://${BUCKET_NAME}

بدلاً من ذلك، يمكنك إنشاء حزمة من خلال وحدة تحكّم Google Cloud Platform.

اختياري**: إنشاء رمز مميز في GitHub**

يستدعي هذا الدرس التطبيقي حول الترميز GitHub API لاسترداد البيانات المتاحة للجميع. لتجنُّب فرض قيود على عدد الطلبات، خاصةً في الأحداث التي يتم فيها إرسال عدد كبير من الطلبات المجهولة الهوية إلى واجهات GitHub API، يمكنك إعداد رمز دخول بدون أذونات. هذا الإجراء مطلوب فقط لتأكيد هويتك كمستخدم فردي بدلاً من مستخدم مجهول الهوية.

  1. انتقِل إلى https://github.com/settings/tokens وأنشِئ رمزًا مميزًا جديدًا بدون نطاقات.
  2. احفظها في مكان آمن. وفي حال فقدانها، عليك حذفها وإنشاء رمز جديد.

إذا تخطّيت هذه الخطوة، سيظل المختبر يعمل، ولكن ستكون خياراتك محدودة أكثر عند إنشاء بيانات الإدخال لاختبار النموذج.

اختياري: تثبيت لوحات البيانات المفيدة

في وحدة تحكّم Google Cloud Platform، ثبِّت لوحتَي بيانات Kubernetes Engine والتخزين لتسهيل الوصول إليهما.

2a50622902d75f6a.png

إنشاء عملية تثبيت لمنصة AI Platform Pipelines (Kubeflow Pipelines المستضافة)

اتّبِع التعليمات الواردة في قسمَي "قبل البدء" و"إعداد المثيل" هنا لإعداد مثيل GKE مع تثبيت KFP. احرص على وضع علامة في المربّع السماح بالوصول إلى واجهات Cloud APIs التالية كما هو موضّح في المستندات. (إذا لم تفعل ذلك، لن يتم تشغيل مسار التعلّم بنجاح). اترك مساحة الاسم الخاصة بالتثبيت على default.

عليك اختيار منطقة تتوافق مع وحدات معالجة الرسومات Nvidia k80s. يمكنك استخدام us-central1-a أو us-central1-c كقيم تلقائية.

بعد اكتمال عملية التثبيت، سجِّل اسم المجموعة والمنطقة في GKE المُدرَجة لعملية التثبيت في لوحة بيانات AI Pipelines، ولتسهيل الأمر، اضبط متغيّرات البيئة على هذه القيم.

6f0729a4fdee88ac.png

export ZONE=<your zone>
export CLUSTER_NAME=<your cluster name>

إعداد kubectl لاستخدام بيانات اعتماد مجموعة GKE الجديدة

بعد إنشاء مجموعة GKE، اضبط kubectl لاستخدام بيانات اعتماد المجموعة الجديدة من خلال تنفيذ الأمر التالي في Cloud Shell:

gcloud container clusters get-credentials ${CLUSTER_NAME} \
  --project ${PROJECT_ID} \
  --zone ${ZONE}

بدلاً من ذلك، انقر على اسم المجموعة في لوحة بيانات "مسارات الذكاء الاصطناعي" للانتقال إلى صفحة GKE الخاصة بها، ثم انقر على "ربط" في أعلى الصفحة. من النافذة المنبثقة، الصِق الأمر في Cloud Shell.

يؤدي ذلك إلى ضبط سياق kubectl حتى تتمكّن من التفاعل مع مجموعتك. للتحقّق من الإعدادات، شغِّل الأمر التالي:

kubectl get nodes -o wide

يجب أن ترى العُقد مُدرَجة مع الحالة "Ready"، ومعلومات أخرى حول عمر العقدة وإصدارها وعنوان IP الخارجي وصورة نظام التشغيل وإصدار النواة ووقت تشغيل الحاوية.

ضبط المجموعة لتثبيت برنامج تشغيل Nvidia على مجموعات العُقد التي تم تفعيل وحدة معالجة الرسومات فيها

بعد ذلك، سنطبّق daemonset على المجموعة، ما سيؤدي إلى تثبيت برنامج تشغيل Nvidia على أي عقد مجموعة مفعّلة لوحدة معالجة الرسومات:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

بعد ذلك، شغِّل الأمر التالي الذي يمنح مكوّنات KFP الإذن بإنشاء موارد Kubernetes جديدة:

kubectl create clusterrolebinding sa-admin --clusterrole=cluster-admin --serviceaccount=kubeflow:pipeline-runner

إنشاء مجموعة أجهزة ذات التخصيص نفسه لوحدة معالجة الرسومات

بعد ذلك، سنُعدّ مجموعة أجهزة ذات التخصيص نفسه لوحدة معالجة الرسومات بحجم 1:

gcloud container node-pools create gpu-pool \
    --cluster=${CLUSTER_NAME} \
    --zone ${ZONE} \
    --num-nodes=1 \
    --machine-type n1-highmem-8 \
    --scopes cloud-platform --verbosity error \
    --accelerator=type=nvidia-tesla-k80,count=1

3- تشغيل خط أنابيب من لوحة بيانات "خطوط الأنابيب"

فتح لوحة بيانات "خطوط الإنتاج"

في Cloud Console، انتقِل إلى لوحة Pipelines إذا لم تكن فيها. بعد ذلك، انقر على فتح لوحة بيانات خطوط الإنتاج لعملية التثبيت، ثم انقر على خطوط الإنتاج في شريط القوائم الأيمن. إذا ظهر لك خطأ في التحميل، أعِد تحميل علامة التبويب. من المفترض أن تظهر لك صفحة جديدة على النحو التالي:

7bb5a9cf0773c3bc.png

وصف مسار الإحالة الناجحة

تتضمّن عملية المعالجة التي ستنفّذها عدة خطوات (راجِع "الملحق" في هذا الدرس العملي للحصول على التفاصيل):

  1. يتم نسخ نقطة تحقّق نموذج حالية إلى الحزمة.
  2. يتم تدريب نموذج Tensor2Tensor باستخدام بيانات تمت معالجتها مسبقًا.
  • يبدأ التدريب من نقطة التحقّق الحالية للنموذج التي تم نسخها في الخطوة الأولى، ثم يتم التدريب لبضع مئات من الخطوات الإضافية. (سيستغرق تدريب النموذج بالكامل وقتًا طويلاً جدًا خلال الدرس التطبيقي حول الترميز).
  • عند انتهاء التدريب، تصدِّر خطوة مسار التعلّم النموذج بتنسيق مناسب للعرض باستخدام منصة TensorFlow للعرض.
  1. يتم نشر مثيل TensorFlow Serving باستخدام هذا النموذج.
  2. يتم تشغيل تطبيق ويب للتفاعل مع النموذج المعروض لاسترداد التوقعات.

تنزيل مسار العرض وتجميعه

في هذا القسم، سنرى كيفية تجميع تعريف مسار التعلّم. أول ما علينا فعله هو تثبيت حزمة تطوير البرامج (SDK) لمنصة KFP. نفِّذ ما يلي في Cloud Shell:

pip3 install -U kfp

لتنزيل ملف تعريف خط الأنابيب، نفِّذ الأمر التالي من Cloud Shell:

curl -O https://raw.githubusercontent.com/amygdala/kubeflow-examples/ghsumm/github_issue_summarization/pipelines/example_pipelines/gh_summ_hosted_kfp.py

بعد ذلك، يمكنك تجميع ملف تعريف خط الأنابيب من خلال تشغيله على النحو التالي:

python3 gh_summ_hosted_kfp.py

سيظهر الملف gh_summ_hosted_kfp.py.tar.gz كنتيجة.

تحميل مسار العرض المجمّع

في واجهة مستخدم الويب الخاصة بـ Kubeflow Pipelines، انقر على تحميل مسار الإعداد، ثم اختَر الاستيراد حسب عنوان URL. انسخ عنوان URL التالي، ثم الصقه، وهو يشير إلى مسار العرض نفسه الذي تم تجميعه للتو. (تتطلّب عملية تحميل ملف من Cloud Shell اتّخاذ بضع خطوات إضافية، لذا سنستخدم اختصارًا).

https://storage.googleapis.com/aju-dev-demos-codelabs/KF/compiled_pipelines/gh_summ_hosted_kfp.py.tar.gz

أدخِل اسمًا لخط أنابيب المعالجة (مثل gh_summ).

867fdbe248d13bab.png

تشغيل مسار العرض

انقر على المسار الذي تم تحميله في القائمة، ما يتيح لك عرض الرسم البياني الثابت للمسار، ثم انقر على إنشاء تجربة لإنشاء تجربة جديدة باستخدام المسار. التجربة هي طريقة لتجميع عمليات التشغيل ذات الصلة دلاليًا.

d4b5b1a043d32d4a.png

أدخِل اسمًا للتجربة (مثل الاسم نفسه لمسار التعلّم، gh_summ)، ثم انقر على التالي لإنشاء التجربة.

d9f7d2177efad53.png

سيؤدي ذلك إلى فتح صفحة يمكنك فيها إدخال مَعلمات عملية التنفيذ وبدءها.

يمكنك تنفيذ الأوامر التالية في Cloud Shell للمساعدة في ملء المَعلمات.

gcloud config get-value project
echo "gs://${BUCKET_NAME}/codelab"

سيتم ملء اسم عملية التشغيل تلقائيًا، ولكن يمكنك منحه اسمًا مختلفًا إذا أردت ذلك.

بعد ذلك، املأ حقول المَعلمات الثلاثة:

  • project
  • (اختياري) github-token
  • working-dir

بالنسبة إلى working-dir، أدخِل بعض المسارات ضمن حزمة GCS التي أنشأتها. أدرِج البادئة "gs://". في الحقل github-token، أدخِل الرمز المميز الذي أنشأته اختياريًا في وقت سابق، أو اترك سلسلة العنصر النائب كما هي إذا لم تنشئ رمزًا مميزًا.

8676afba6fd32ac1.png

بعد ملء الحقول، انقر على بدء، ثم انقر على عملية التشغيل المُدرَجة لعرض تفاصيلها. أثناء تنفيذ خطوة معيّنة في مسار البيانات، يمكنك النقر عليها للحصول على مزيد من المعلومات عنها، بما في ذلك عرض سجلّات وحدة pod الخاصة بها. (يمكنك أيضًا عرض سجلّات خطوة في مسار البيانات من خلال الرابط المؤدي إلى سجلّات Cloud Logging (Stackdriver)، حتى إذا تم إيقاف عقدة المجموعة).

db2dc819ac0f5c1.png

عرض تعريف مسار العرض

أثناء تنفيذ مسار التعلّم، قد تحتاج إلى إلقاء نظرة فاحصة على طريقة تجميعها وما تفعله. يمكنك الاطّلاع على مزيد من التفاصيل في قسم الملحق من الدرس التطبيقي حول الترميز.

عرض معلومات تدريب النموذج في TensorBoard

بعد اكتمال خطوة التدريب، انقر على علامة التبويب الرسومات الخاصة بها، ثمّ انقر على الزر الأزرق بدء TensorBoard، وبعد أن يصبح جاهزًا، انقر على فتح TensorBoard.

6cb511540a64b9e5.png

d55eb03c4d04f64d.png

استكشاف لوحة بيانات "النتائج وعمليات التنفيذ"

تسجّل Kubeflow Pipelines تلقائيًا البيانات الوصفية حول خطوات المسار أثناء تنفيذه. يتم تسجيل معلومات الناتج والتنفيذ. انقر على هذه الإدخالات في شريط التنقّل الأيمن للوحة البيانات لاستكشاف المزيد.

3002c4055cc8960b.png

بالنسبة إلى Artifacts، يمكنك عرض كلّ من لوحة النظرة العامة ولوحة Lineage Explorer.

7885776e899d1183.png40c4f7e5b6545dec.png

عرض تطبيق الويب الذي تم إنشاؤه بواسطة مسار التعلّم وإجراء بعض التوقّعات

تنفّذ الخطوة الأخيرة في مسار العمل تطبيق ويب يوفّر واجهة مستخدم للاستعلام عن النموذج المدرَّب، ويتم عرض هذا النموذج من خلال TF Serving لإجراء توقّعات.

بعد اكتمال عملية إنشاء خط الأنابيب، يمكنك الاتصال بتطبيق الويب من خلال توجيه المنفذ إلى الخدمة (نحن نوجّه المنفذ لأنّه في هذا الدرس العملي، لم يتم إعداد خدمة تطبيق الويب ليكون لها نقطة نهاية خارجية).

ابحث عن اسم الخدمة من خلال تنفيذ هذا الأمر في Cloud Shell:

kubectl get services

ابحث عن اسم خدمة مثل ghsumm-*-webappsvc في القائمة.

بعد ذلك، في Cloud Shell، يمكنك إعادة توجيه المنفذ إلى تلك الخدمة على النحو التالي، مع تغيير الأمر التالي لاستخدام اسم webappsvc:

kubectl port-forward svc/ghsumm-xxxxx-webappsvc 8080:80

بعد تشغيل عملية إعادة توجيه المنفذ، انقر على رمز "المعاينة" أعلى لوحة Cloud Shell، ثم انقر على "المعاينة على المنفذ 8080" في القائمة المنسدلة.

65572bb3b12627cc.png

من المفترض أن تظهر صفحة مشابهة لما يلي في علامة تبويب جديدة:

902ad2d555281508.png

انقر على الزر ملء مشكلة عشوائية لاسترداد فقرة نصية. انقر على إنشاء عنوان لاستدعاء النموذج المدرَّب وعرض توقّع.

b7c39ce51ee603bd.png

إذا كانت مَعلمات خط أنابيب المعالجة تتضمّن رمزًا مميزًا صالحًا من GitHub، يمكنك بدلاً من ذلك محاولة إدخال عنوان URL من GitHub في الحقل الثاني، ثم النقر على "إنشاء عنوان". إذا لم تُعدّ رمزًا مميزًا صالحًا على GitHub، استخدِم الحقل "ملء مشكلة عشوائية" فقط.

4. تشغيل مسار من "دفتر ملاحظات AI Platform"

يمكنك أيضًا تحديد وتشغيل Kubeflow Pipelines بشكل تفاعلي من دفتر ملاحظات Jupyter باستخدام حزمة تطوير البرامج (SDK) لمنصة KFP. تسهّل دفاتر الملاحظات على AI Platform، التي سنستخدمها في هذا الدرس التطبيقي حول الترميز، هذه العملية.

إنشاء آلة افتراضية لدفتر ملاحظات

سننشئ مثيلاً لدفتر ملاحظات من Cloud Shell باستخدام واجهة برمجة التطبيقات. (يمكنك بدلاً من ذلك إنشاء دفتر ملاحظات من خلال Cloud Console. يمكنك الاطّلاع على المستندات للحصول على مزيد من المعلومات).

اضبط متغيرات البيئة التالية في Cloud Shell:

export INSTANCE_NAME="kfp-ghsumm"
export VM_IMAGE_PROJECT="deeplearning-platform-release"
export VM_IMAGE_FAMILY="tf2-2-3-cpu"
export MACHINE_TYPE="n1-standard-4"
export LOCATION="us-central1-c"

بعد ذلك، شغِّل الأمر التالي من Cloud Shell لإنشاء مثيل دفتر الملاحظات:

gcloud beta notebooks instances create $INSTANCE_NAME \
  --vm-image-project=$VM_IMAGE_PROJECT \
  --vm-image-family=$VM_IMAGE_FAMILY \
  --machine-type=$MACHINE_TYPE --location=$LOCATION

عند تنفيذ هذا الأمر لأول مرة، قد يُطلب منك تفعيل واجهة برمجة التطبيقات notebooks لمشروعك. يُرجى الردّ بـ "y" في حال توفّرها.

بعد بضع دقائق، سيتم تشغيل خادم دفتر الملاحظات. يمكنك الاطّلاع على مثيلات Notebook المدرَجة في Cloud Console.

206adf3905413dfa.png

تحميل دفتر ملاحظات الدرس التطبيقي حول الترميز

بعد إنشاء مثيل دفتر الملاحظات، انقر على هذا الرابط لتحميل دفتر ملاحظات Jupyter الخاص بالبرنامج التعليمي. اختَر مثيل دفتر الملاحظات الذي تريد استخدامه. سيتم فتح دفتر الملاحظات تلقائيًا.

تنفيذ دفتر الملاحظات

اتّبِع التعليمات الواردة في دفتر الملاحظات لإكمال بقية التمرين العملي. يُرجى العِلم أنّه في جزء "الإعداد" من دفتر الملاحظات، عليك ملء القيم الخاصة بك قبل تشغيل بقية دفتر الملاحظات.

(إذا كنت تستخدم مشروعك الخاص، لا تنسَ الرجوع إلى قسم "التنظيف" في هذا الدرس التطبيقي وإكماله).

5- تَنظيم

لست بحاجة إلى تنفيذ ذلك إذا كنت تستخدم حسابًا مؤقتًا في Codelab، ولكن قد تحتاج إلى إيقاف تثبيت Pipelines وNotebook إذا كنت تستخدم مشروعك الخاص.

إيقاف مجموعة GKE في Pipelines

يمكنك حذف مجموعة Pipelines من وحدة تحكّم Cloud. (يمكنك حذف عملية تثبيت Pipelines فقط إذا أردت إعادة استخدام مجموعة GKE).

حذف مثيل AI Notebook

إذا نفّذت الجزء "دفتر الملاحظات" من درس تطبيقي حول الترميز، يمكنك حذف أو إيقاف آلة افتراضية لدفتر الملاحظات من Cloud Console.

اختياري: إزالة رمز GitHub المميز

انتقِل إلى https://github.com/settings/tokens وأزِل الرمز المميّز الذي تم إنشاؤه.

6. الملاحق

نظرة على الرمز

تحديد مسار المعالجة

يمكنك الاطّلاع هنا على تعريف مسار التعلّم المستخدَمة في هذا الدرس التطبيقي حول الترميز.

لنلقِ نظرة على كيفية تحديدها، بالإضافة إلى كيفية تحديد مكوّناتها (الخطوات). سنوضّح بعض النقاط البارزة، ولكن يمكنك الاطّلاع على المستندات لمزيد من التفاصيل.

تستند خطوات Kubeflow Pipeline إلى الحاويات. عند إنشاء مسار، يمكنك استخدام مكوّنات معدّة مسبقًا تتضمّن صور حاويات معدّة مسبقًا، أو إنشاء المكوّنات الخاصة بك. في هذا الدرس العملي، أنشأنا نموذجًا خاصًا بنا.

يتم تحديد أربع خطوات من خطوات سلسلة المعالجة من المكوّنات القابلة لإعادة الاستخدام، والتي يمكن الوصول إليها من خلال ملفات تعريف المكوّنات. في مقتطف الرمز الأول هذا، نصل إلى ملفات تعريف المكوّنات هذه من خلال عناوين URL الخاصة بها، ونستخدم هذه التعريفات لإنشاء "عمليات" سنستخدمها لإنشاء خطوة في مسار البيانات.

import kfp.dsl as dsl
import kfp.gcp as gcp
import kfp.components as comp

...

copydata_op = comp.load_component_from_url(
  'https://raw.githubusercontent.com/kubeflow/examples/master/github_issue_summarization/pipelines/components/t2t/datacopy_component.yaml'
  )

train_op = comp.load_component_from_url(
  'https://raw.githubusercontent.com/kubeflow/examples/master/github_issue_summarization/pipelines/components/t2t/train_component.yaml'
  )

في ما يلي أحد تعريفات المكوّنات، لعملية التدريب، بتنسيق yaml. يمكنك ملاحظة أنّه تم تحديد المدخلات والمخرجات وصورة الحاوية ووسيطات نقطة دخول الحاوية.

name: Train T2T model
description: |
  A Kubeflow Pipeline component to train a Tensor2Tensor
  model
metadata:
  labels:
    add-pod-env: 'true'
inputs:
  - name: train_steps
    description: '...'
    type: Integer
    default: 2019300
  - name: data_dir
    description: '...'
    type: GCSPath
  - name: model_dir
    description: '...'
    type: GCSPath
  - name: action
    description: '...'
    type: String
  - name: deploy_webapp
    description: '...'
    type: String
outputs:
  - name: launch_server
    description: '...'
    type: String
  - name: train_output_path
    description: '...'
    type: GCSPath
  - name: MLPipeline UI metadata
    type: UI metadata
implementation:
  container:
    image: gcr.io/google-samples/ml-pipeline-t2ttrain:v3ap
    args: [
      --data-dir, {inputValue: data_dir},
      --action, {inputValue: action},
      --model-dir, {inputValue: model_dir},
      --train-steps, {inputValue: train_steps},
      --deploy-webapp, {inputValue: deploy_webapp},
      --train-output-path, {outputPath: train_output_path}
    ]
    env:
      KFP_POD_NAME: "{{pod.name}}"
    fileOutputs:
      launch_server: /tmp/output
      MLPipeline UI metadata: /mlpipeline-ui-metadata.json

يمكنك أيضًا تحديد خطوة في مسار البيانات من خلال الدالة الإنشائية dsl.ContainerOp، كما سنرى أدناه.

في ما يلي الجزء الأكبر من تعريف مسار التعلّم. نحن بصدد تحديد مدخلات مسار الإعداد (وقيمها التلقائية). بعد ذلك، نحدّد خطوات مسار الإحالة الناجحة. بالنسبة إلى معظم العمليات، نستخدم "العمليات" المحدّدة أعلاه، ولكننا نحدّد أيضًا خطوة "العرض" مضمّنة من خلال ContainerOp، مع تحديد صورة الحاوية ووسيطات نقطة الدخول مباشرةً.

يمكنك ملاحظة أنّ الخطوات train وlog_model وserve تستخدم نواتج الخطوات السابقة كمدخلات. يمكنك الاطّلاع على مزيد من المعلومات حول كيفية تحديد ذلك هنا.

@dsl.pipeline(
 name='Github issue summarization',
 description='Demonstrate Tensor2Tensor-based training and TF-Serving'
)
def gh_summ(  #pylint: disable=unused-argument
 train_steps: 'Integer' = 2019300,
 project: str = 'YOUR_PROJECT_HERE',
 github_token: str = 'YOUR_GITHUB_TOKEN_HERE',
 working_dir: 'GCSPath' = 'gs://YOUR_GCS_DIR_HERE',
 checkpoint_dir: 'GCSPath' = 'gs://aju-dev-demos-codelabs/kubecon/model_output_tbase.bak2019000/',
 deploy_webapp: str = 'true',
 data_dir: 'GCSPath' = 'gs://aju-dev-demos-codelabs/kubecon/t2t_data_gh_all/'
 ):


 copydata = copydata_op(
   data_dir=data_dir,
   checkpoint_dir=checkpoint_dir,
   model_dir='%s/%s/model_output' % (working_dir, dsl.RUN_ID_PLACEHOLDER),
   action=COPY_ACTION,
   )


 train = train_op(
   data_dir=data_dir,
   model_dir=copydata.outputs['copy_output_path'],
   action=TRAIN_ACTION, train_steps=train_steps,
   deploy_webapp=deploy_webapp
   )

 serve = dsl.ContainerOp(
     name='serve',
     image='gcr.io/google-samples/ml-pipeline-kubeflow-tfserve:v6',
     arguments=["--model_name", 'ghsumm-%s' % (dsl.RUN_ID_PLACEHOLDER,),
         "--model_path", train.outputs['train_output_path']
         ]
     )

 train.set_gpu_limit(1)

يُرجى العِلم أنّنا نشترط تنفيذ خطوة "التدريب" على عقدة في المجموعة تتوفّر فيها وحدة معالجة رسومات واحدة على الأقل.

  train.set_gpu_limit(1)

الخطوة الأخيرة في مسار العرض، والتي يتم تحديدها أيضًا بشكل مضمّن، هي خطوة شرطية. سيتم تشغيلها بعد الانتهاء من الخطوة "serve"، فقط إذا كانت نتيجة خطوة التدريب launch_server هي السلسلة "true". يتم تشغيل "تطبيق الويب للتنبؤ" الذي استخدمناه لطلب ملخّصات المشاكل من نموذج T2T المدرَّب.

 with dsl.Condition(train.outputs['launch_server'] == 'true'):
   webapp = dsl.ContainerOp(
       name='webapp',
       image='gcr.io/google-samples/ml-pipeline-webapp-launcher:v1',
       arguments=["--model_name", 'ghsumm-%s' % (dsl.RUN_ID_PLACEHOLDER,),
           "--github_token", github_token]

       )
   webapp.after(serve)

تعريفات صورة حاوية المكوّن

توضّح مستندات Kubeflow Pipeline بعض أفضل الممارسات لإنشاء مكوّناتك الخاصة. كجزء من هذه العملية، عليك تحديد صورة حاوية وإنشاؤها. يمكنك الاطّلاع على خطوات المكوّنات في مسار هذا الدرس العملي هنا. تتوفّر تعريفات Dockerfile في الأدلة الفرعية containers، مثلاً هنا.

استخدام آلات افتراضية قابلة للإيقاف مع وحدات معالجة الرسومات للتدريب

الأجهزة الافتراضية الاستباقية هي مثيلات الأجهزة الافتراضية في Compute Engine التي تستمر لمدة 24 ساعة كحد أقصى ولا تقدّم أي ضمانات بشأن التوفّر. سعر الأجهزة الافتراضية الاستباقية أقل من سعر أجهزة Compute Engine الافتراضية العادية.

باستخدام Google Kubernetes Engine (GKE)، يمكنك بسهولة إعداد مجموعة أو مجموعة أجهزة ذات تخصيص نفسه تستخدم أجهزة افتراضية قابلة للإيقاف. يمكنك إعداد مجموعة أجهزة ذات التخصيص نفسه من هذا النوع باستخدام وحدات معالجة الرسومات المرفقة بالآلات الافتراضية القابلة للإيقاف. تعمل هذه العُقد بالطريقة نفسها التي تعمل بها العُقد العادية المتوافقة مع وحدات معالجة الرسومات، ولكنّ وحدات معالجة الرسومات تظل متاحة فقط طوال مدة تشغيل الآلة الافتراضية.

يمكنك إعداد مجموعة أجهزة ذات التخصيص نفسه قابلة للمقاطعة ومفعَّلة لوحدة معالجة الرسومات لمجموعتك عن طريق تنفيذ أمر مشابه للأمر التالي، وتعديل الأمر التالي باستخدام اسم مجموعتك والمنطقة، وتعديل نوع المسرِّع وعددها وفقًا لمتطلباتك. يمكنك اختياريًا تحديد مجموعة أجهزة ذات التخصيص نفسه التي سيتم توسيع نطاقها تلقائيًا استنادًا إلى أحمال العمل الحالية.

gcloud container node-pools create preemptible-gpu-pool \
    --cluster=<your-cluster-name> \
    --zone <your-cluster-zone> \
    --enable-autoscaling --max-nodes=4 --min-nodes=0 \
    --machine-type n1-highmem-8 \
    --preemptible \
    --node-taints=preemptible=true:NoSchedule \
    --scopes cloud-platform --verbosity error \
    --accelerator=type=nvidia-tesla-k80,count=4

يمكنك أيضًا إعداد مجموعة أجهزة ذات التخصيص نفسه من خلال Cloud Console.

تحديد Kubeflow Pipeline يستخدم عُقد GKE القابلة للإيقاف

إذا كنت تستخدم Kubeflow على GKE، أصبح من السهل الآن تحديد وتشغيل Kubeflow Pipelines التي يتم فيها تشغيل خطوة واحدة أو أكثر من خطوات خط أنابيب المعالجة (المكوّنات) على عُقد قابلة للمقاطعة، ما يقلّل من تكلفة تشغيل مهمة. لاستخدام الأجهزة الافتراضية الاستباقية للحصول على نتائج صحيحة، يجب أن تكون الخطوات التي تحدّدها على أنّها استباقية إما متطابقة (أي إذا نفّذت خطوة عدة مرات، ستحصل على النتيجة نفسها)، أو يجب أن يتم حفظ حالة العمل حتى تتمكّن الخطوة من استئناف العمل من حيث توقّفت في حال حدوث انقطاع.

عند تحديد Kubeflow Pipeline، يمكنك الإشارة إلى أنّ خطوة معيّنة يجب أن يتم تشغيلها على عقدة قابلة للمقاطعة من خلال تعديل العملية على النحو التالي:

your_pipelines_op.apply(gcp.use_preemptible_nodepool())

لمزيد من التفاصيل، يُرجى الاطّلاع على المستندات.

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

your_pipelines_op.set_gpu_limit(1).apply(gcp.use_preemptible_nodepool()).set_retry(5)

حاوِل تعديل مسار Kubeflow الذي استخدمناه في هذا الدرس التطبيقي حول الترميز من أجل تشغيل خطوة التدريب على جهاز افتراضي قابل للإيقاف.

غيِّر السطر التالي في مواصفات خط الأنابيب لاستخدام مجموعة عقد قابلة للمقاطعة (تأكَّد من إنشاء مجموعة كما هو موضّح أعلاه) بالإضافة إلى إعادة المحاولة 5 مرات:

  train.set_gpu_limit(1)

بعد ذلك، أعِد تجميع مسار البيانات وحمِّل الإصدار الجديد (مع إعطائه اسمًا جديدًا)، ثم شغِّل الإصدار الجديد من مسار البيانات.