מ-Notebook ל-Kubeflow Pipelines עם HP Tuning: A Data Science Journey

1. מבוא

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

איך נראה פריסת Kubeflow?

פריסת Kubeflow היא:

  • נייד – פועל בכל אשכול Kubernetes, בין אם הוא נמצא ב-Google Cloud Platform‏ (GCP), במקום או אצל ספקים שונים.
  • ניתן להרחבה – אפשר להשתמש במשאבים משתנים, וההגבלה היחידה היא מספר המשאבים שהוקצו לאשכול Kubernetes.
  • אפשרות להרכבה – מאפשרת להגדיר שלבים עצמאיים לתהליך עבודה מלא של למידת מכונה, ולבחור מתוך קבוצה נבחרת של מסגרות וספריות של למידת מכונה.

‫Kubeflow מאפשר לארגן מיקרו-שירותים עם צימוד רופף כיחידה אחת ולפרוס אותם במגוון מיקומים, כולל במחשב נייד, בתשתית מקומית או בענן.

ב-Codelab הזה תלמדו איך ליצור פריסת Kubeflow משלכם באמצעות MiniKF, ואז להריץ תהליך עבודה של Kubeflow Pipelines עם כוונון היפר-פרמטרים כדי לאמן מודל ולהציג אותו. אתם מבצעים את כל הפעולות האלה מתוך Jupyter Notebook.

מה תפַתחו

ב-Codelab הזה תבנו צינור עיבוד נתונים מורכב למדע הנתונים עם כוונון היפר-פרמטרים ב-Kubeflow Pipelines, בלי להשתמש בפקודות CLI או ב-SDK. לא נדרש ידע ב-Kubernetes או ב-Docker. בסיום התהליך, התשתית שלכם תכלול:

  • מכונה וירטואלית של MiniKF ‏ (Mini Kubeflow) שמתקינה באופן אוטומטי:
  • ‫Kubernetes (באמצעות Minikube)
  • Kubeflow
  • Kale, כלי להמרת קובצי Jupyter Notebooks למטרות כלליות לזרימות עבודה של Kubeflow Pipelines ( GitHub)
  • Arrikto Rok לניהול גרסאות של נתונים ולשחזור תוצאות

מה תלמדו

  • איך מתקינים את Kubeflow באמצעות MiniKF
  • איך להמיר את קובצי ה-Notebook של Jupyter ל-Kubeflow Pipelines בלי להשתמש בפקודות CLI או ב-SDK
  • איך מריצים Kubeflow Pipelines עם אופטימיזציה של היפר-פרמטרים מתוך מחברת בלחיצת כפתור
  • איך ליצור גרסאות אוטומטיות של הנתונים במחברת ובכל שלב בצינור

מה תצטרכו

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

2. הגדרת הסביבה

הגדרת פרויקט GCP

כדי ליצור פרויקט GCP או להגדיר פרויקט GCP קיים, פועלים לפי השלבים הבאים. אם אתם מתכננים להשתמש בפרויקט קיים ב-GCP, אתם צריכים לוודא שהפרויקט עומד בדרישות המינימום שמתוארות בהמשך. השלב הראשון הוא לפתוח את הכלי לניהול משאבים ב-GCP Console.

יוצרים פרויקט חדש או בוחרים פרויקט קיים:

99b103929d928576.png

צריך לוודא שאתם עומדים בדרישות המינימום הבאות:

לקבלת עזרה נוספת בהגדרת פרויקט GCP, אפשר לעיין במסמכי GCP.

אחרי שמגדירים את פרויקט GCP, עוברים ישירות להוראות להתקנת MiniKF.

פתיחת פרויקט GCP שהוקצה מראש

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

3fdc4329995406a0.png

אם הפרויקט עדיין לא נבחר, לוחצים על Select a project (בחירת פרויקט):

e8952c0b96067dea.png

בוחרים את הפרויקט הרצוי. צריך להיות לכם רק אחד מהם:

fe25c1925487142.png

3. התקנה של MiniKF

יצירת מכונת Compute שכוללת את MiniKF

ב-GCP Marketplace, מחפשים את MiniKF.

בוחרים את המכונה הווירטואלית MiniKF של Arrikto:

d6b423c1911ea85a.png

לוחצים על הלחצן הפעלה ובוחרים את הפרויקט:

7d07439db939b61c.png

בחלון Configure & Deploy (הגדרה ופריסה), בוחרים שם ואזור למופע MiniKF ומשאירים את אפשרויות ברירת המחדל. אחר כך לוחצים על הלחצן פריסה:

7d5f7d17a80a1930.png

מחכים שמכונת ה-Compute של MiniKF תופעל:

5228086caadc44c6.png

כניסה ל-MiniKF

כשהמכונה הווירטואלית של MiniKF פועלת, לוחצים על הלחצן SSH כדי להתחבר ולהיכנס. פועלים לפי ההוראות במסך כדי להריץ את הפקודה minikf, שתתחיל את הפריסה של Minikube,‏ Kubeflow ו-Rok. הפעולה תימשך כמה דקות.

774e83c3e96cf7b3.png

כניסה ל-Kubeflow

אחרי שההתקנה מסתיימת וכל ה-pods מוכנים, עוברים אל מרכז הבקרה של MiniKF. מתחברים ל-Kubeflow באמצעות שם המשתמש והסיסמה של MiniKF:

251b0bcdbf6d3c71.png

9d49d899bb0b5bd1.png

משתמשי Chrome יראו את המסך הזה:

6258e0f09e46a6c2.png

משתמשי Firefox יראו את המסך הזה:

8cff90ce2f0670bd.png

משתמשי Safari יראו את המסך הזה:

1c6fd768d71c0a92.png

כניסה ל-Rok

אחרי שנכנסים ל-Kubeflow, פותחים את התפריט הימני על ידי לחיצה על סמל האפשרויות הנוספות (3 קווים). לוחצים על Snapshots (תמונות מצב) ונכנסים ל-Rok באמצעות שם המשתמש והסיסמה של MiniKF.

16171f35a935a9af.png

80aad6ba5d298a7e.png

מעולה! הפריסה של MiniKF ב-GCP הושלמה בהצלחה. עכשיו אפשר ליצור מחברות, לכתוב את קוד ה-ML, להריץ את Kubeflow Pipelines ולהשתמש ב-Rok לניהול גרסאות של נתונים ולשחזור.

4. הרצת צינור מתוך ה-notebook

במהלך הקטע הזה, תריצו את הדוגמה לזיהוי גזע כלבים, פרויקט בתוכנית Udacity AI Nanodegree. בהינתן תמונה של כלב, המודל הסופי יספק הערכה של גזע הכלב.

יצירת שרת Notebook באשכול Kubeflow

עוברים לקישור Notebooks במרכז הבקרה של Kubeflow.

60825e935fd0f39b.png

לוחצים על שרת חדש.

f9303c0a182e47f5.png

מזינים שם לשרת המחברת.

a2343f30bc9522ab.png

מוודאים שבחרתם את קובץ האימג' הבא של Docker (שימו לב שתג האימג' עשוי להיות שונה):

gcr.io/arrikto/jupyter-kale:f20978e

מוסיפים נפח נתונים חדש וריק בגודל 5GB ונותנים לו את השם data.

8544d9b05826b316.png

לוחצים על הפעלה כדי ליצור את שרת ה-Notebook.

28c024bcc55cc70a.png

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

52f1f8234988ceaa.png

הורדת הנתונים ופנקס הרשימות

תיפתח כרטיסייה חדשה עם דף הנחיתה של JupyterLab. יוצרים טרמינל חדש ב-JupyterLab.

ab9ac96f1a1f0d09.png

בחלון הטרמינל, מריצים את הפקודות האלה כדי לנווט לתיקייה data ולהוריד את המחברת ואת הנתונים שבהם תשתמשו בהמשך שיעור ה-Lab:

cd data/
git clone https://github.com/kubeflow-kale/kale

המאגר המשוכפל מכיל סדרה של דוגמאות שנבחרו בקפידה עם נתונים ומחברות עם הערות.

בסרגל הצד, עוברים לתיקייה data/kale/examples/dog-breed-classification/ ופותחים את המחברת dog-breed.ipynb.

2bc436465522f65b.png

עיון בקוד ה-ML של הדוגמה לזיהוי גזע כלבים

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

מריצים את התא imports כדי לייבא את כל הספריות הנדרשות. שימו לב שהקוד נכשל כי חסרה ספרייה:

5e2b97ab2512f139.png

בדרך כלל, כדי להריץ את מחברת ה-Notebook הזו כצינור Kubeflow, צריך ליצור קובץ אימג' של Docker חדש שתכלול את הספריות שהותקנו לאחרונה. למזלנו, Rok ו-Kale דואגים שכל הספריות שתתקינו במהלך הפיתוח יגיעו לצינור העיבוד, הודות לטכנולוגיית הצילום של Rok ולטכנולוגיית ההרכבה של Kale, שמרכיבה את הכרכים שצולמו בשלבי צינור העיבוד.

מריצים את התא הבא כדי להתקין את הספרייה החסרה:

c483da77943a6f01.png

מפעילים מחדש את ליבת ה-Notebook בלחיצה על סמל ההפעלה מחדש:

376b5203209c2c91.png

מריצים שוב את התא imports עם הספריות הנכונות שמותקנות ורואים שהפעולה מצליחה.

המרת מחברת לצינור עיבוד נתונים ב-Kubeflow Pipelines

מפעילים את Kale בלחיצה על סמל Kubeflow בחלונית הימנית של המחברת:

7b96241f2ab6c389.png

מפעילים את Kale על ידי לחיצה על פס ההזזה בלוח הפריסה של Kale:

804cfbf9d76b7e23.png

בדיקת התלות של כל תא ב-notebook. אפשר לראות איך כמה תאים במחברת יכולים להיות חלק משלב אחד בצינור, כפי שמצוין על ידי פסי הצבע בצד ימין של התאים, ואיך שלב בצינור יכול להיות תלוי בשלבים קודמים, כפי שמצוין על ידי התוויות depends on מעל התאים. לדוגמה, בתמונה שלמטה מוצגות כמה תאים ששייכים לאותו שלב בצינור העיבוד. הם מופיעים באותו צבע אדום ותלויים בשלב קודם בצינור.

fcd0fb351cdfb359.png

לוחצים על הלחצן הידור והפעלה:

18f2f6f0e12393d5.png

עכשיו Kale משתלטת על העניינים ובונה את ה-notebook על ידי המרה שלו לצינור עיבוד נתונים של Kubeflow Pipelines. בנוסף, מכיוון ש-Kale משתלב עם Rok כדי לצלם תמונות של נפח הנתונים של המחברת הנוכחית, אפשר לעקוב אחרי התקדמות התמונה. ‫Rok מטפל בניהול גרסאות של הנתונים וביצירה מחדש של הסביבה כפי שהיא הייתה כשלוחצים על הלחצן Compile and Run (קומפילציה והרצה). כך תוכלו לחזור אחורה בזמן ולראות את הנתונים והקוד שלכם, והצינור יפעל באותה סביבה שבה פיתחתם את הקוד, בלי שתצטרכו ליצור תמונות חדשות של Docker.

de1b88af76df1a9a.png

הפייפליין עבר קומפילציה והועלה ל-Kubeflow Pipelines. עכשיו לוחצים על הקישור כדי לעבור לממשק המשתמש של Kubeflow Pipelines ולראות את ההרצה.

e0b467e2e7034b5d.png

ממשק המשתמש של Kubeflow Pipelines ייפתח בכרטיסייה חדשה. ממתינים לסיום ההרצה.

21a9d54a57f3e20c.png

39e6fa39516d2773.png

מעולה! הרצת עכשיו צינור (pipeline) מקצה לקצה ב-Kubeflow Pipelines, החל מתיקיית ה-Notebook שלך!

5. למידה העברתית עם כוונון היפר-פרמטרים

בדיקת התוצאות

בודקים את היומנים של השלב cnn-from-scratch. (לוחצים על השלב בתרשים בממשק המשתמש של Kubeflow Pipelines ואז לוחצים על הכרטיסייה Logs). בשלב הזה אימנתם רשת נוירונים מלאכותית (CNN) מאפס. שימו לב שרמת הדיוק של המודל שאומן נמוכה מאוד, ובנוסף, השלב הזה נמשך זמן רב.

62bf0835e9896c67.png

כדאי לעיין ביומני הרישום של השלב cnn-vgg16. בשלב הזה השתמשתם בלמידת העברה במודל VGG-16 שעבר אימון מראש – רשת נוירונים שאומנה על ידי Visual Geometry Group ‏ (VGG). הדיוק גבוה בהרבה מהמודל הקודם, אבל עדיין יש מקום לשיפור.

2b45072da65e20ae.png

עכשיו, בודקים את היומנים של השלב cnn-resnet50. בשלב הזה השתמשתם בלמידת העברה במודל ResNet-50 שעבר אימון מראש. רמת הדיוק גבוהה בהרבה. לכן, זה המודל שבו תשתמשו בהמשך ה-codelab הזה.

a1dc84ea48a87820.png

כוונון היפר-פרמטרים

חוזרים לשרת המחברות בממשק המשתמש של Kubeflow ופותחים את המחברת בשם dog-breed-katib.ipynb (בנתיב data/kale/examples/dog-breed-classification/). במחברת הזו, תריצו כמה ניסויים של כוונון היפר-פרמטרים במודל ResNet-50 באמצעות Katib. שימו לב שיש תא אחד בתחילת המחברת להצהרת פרמטרים:

87b9f6c98dc1823e.png

בחלונית הימנית של המחברת, מפעילים את האפשרות HP Tuning with Katib כדי להריץ כוונון של היפרפרמטרים:

a518eba74d341139.png

לאחר מכן לוחצים על Set up Katib Job (הגדרת משימת Katib) כדי להגדיר את Katib:

f4e34fff6a93aa60.png

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

cfc6b7bcdc685a02.png

לוחצים על הלחצן Compile and Run Katib Job (קומפילציה והרצה של משימת Katib):

f9c1ab0a6a3c5e8d.png

צופים בהתקדמות של ניסוי Katib:

f3514011876564db.png

כדי לראות את הניסוי של Katib, לוחצים על View (הצגה):

ab2f5a5edd48e8dc.png

לוחצים על Done כדי לראות את ההרצות ב-Kubeflow Pipelines‏ (KFP):

410a843b6f044a4b.png

בדף הניסוי של Katib יופיעו הניסויים החדשים:

a511dca519580133.png

בממשק המשתמש של KFP יופיעו ההרצות החדשות:

43dd34ee2b75018d.png

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

‫Katib הוא רכיב של Kubeflow שמאפשר להריץ משימות כוונון של היפר-פרמטרים לשימוש כללי. ‫Katib לא יודע דבר על המשימות שהוא מריץ בפועל (שנקראות ניסויים במינוח של Katib). כל מה שחשוב ל-Kale הוא מרחב החיפוש, אלגוריתם האופטימיזציה והיעד. ‫Katib תומך בהרצת משימות פשוטות (כלומר, Pods) כניסויים, אבל Kale מטמיע shim כדי שהניסויים יפעילו בפועל צינורות ב-Kubeflow Pipelines, ואז יאסוף את המדדים מהרצות הצינור.

במהלך הניסוי של Katib, כשהמערכת תייצר ניסויים, יופיעו עוד ניסויים בממשק המשתמש של Katib:

3e854d3d4bb766c.png

ועוד הרצות בממשק המשתמש של KFP:

ffd30dcefa739962.png

אחרי שהניסוי ב-Katib מסתיים, אפשר לראות את כל הניסויים בממשק המשתמש של Katib:

9096ae9caa77e42a.png

וכל ההרצות בממשק המשתמש של KFP:

7acc64dfee4f35a3.png

אם תחזרו ל-Notebook, תראו כפתור מידע ממש ליד הניסוי של Katib בחלונית Kale:

95b092180d71dc80.png

לוחצים על התוצאה כדי לראות את התוצאה הכי טובה ואת הפרמטרים שהניבו אותה:

3b0ce47e548e5afb.png

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

כיבוי סופי של המכונה הווירטואלית של MiniKF

עוברים אל Deployment Manager במסוף GCP ומוחקים את הפריסה minikf-on-gcp.

7. מזל טוב

כל הכבוד, הפעלתם בהצלחה תהליך עבודה של מדעי הנתונים מקצה לקצה באמצעות Kubeflow‏ (MiniKF),‏ Kale ו-Rok.

מה השלב הבא?

הצטרפות לקהילת Kubeflow:

קריאה נוספת