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

1. מבוא

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

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

פריסת Kubeflow היא:

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

‫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
  • איך להמיר מחברות Jupyter Notebooks ל-Kubeflow Pipelines בלי להשתמש בפקודות CLI או בערכות SDK
  • איך מריצים Kubeflow Pipelines עם כוונון היפר-פרמטרים מתוך מחברת בלחיצת כפתור
  • איך ליצור גרסאות אוטומטיות של הנתונים במחברת ובכל שלב בצינור

מה תצטרכו

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

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

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

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

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

99b103929d928576.png

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

  • מוודאים שיש לכם הרשאת בעלים בפרויקט.
  • מוודאים שהחיוב מופעל בפרויקט.
  • אם אתם משתמשים בתוכנית בחינם ב-GCP או בתקופת הניסיון למשך 12 חודשים עם קרדיט בסך 300$, שימו לב שאי אפשר להפעיל את ההתקנה של MiniKF ב-GCP שמוגדרת כברירת מחדל, כי התוכנית בחינם לא מספקת מספיק משאבים. צריך לשדרג לחשבון בתשלום.

לקבלת עזרה נוספת בהגדרת פרויקט 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.png9d49d899bb0b5bd1.png

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

6258e0f09e46a6c2.png

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

8cff90ce2f0670bd.png

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

1c6fd768d71c0a92.png

התחברות ל-Rok

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

16171f35a935a9af.png80aad6ba5d298a7e.png

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

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

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

יצירת שרת נוטבוק באשכול 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

הורדת הנתונים ו-Notebook

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

de1b88af76df1a9a.png

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

e0b467e2e7034b5d.png

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

21a9d54a57f3e20c.png39e6fa39516d2773.png

מעולה! הרצתם ערוץ מקצה לקצה ב-Kubeflow Pipelines, החל מתיקיית ה-Notebook!

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

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

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

62bf0835e9896c67.png

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

2b45072da65e20ae.png

עכשיו, בודקים את היומנים של השלב cnn-resnet50. בשלב הזה השתמשתם ב-Transfer Learning במודל 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

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

ab2f5a5edd48e8dc.png

לוחצים על סיום כדי לראות את ההרצות ב-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:

קריאה נוספת