מ-notebook ל-Kubeflow Pipelines עם MiniKF וקייל

1. מבוא

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

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

פריסת Kubeflow היא:

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

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

ב-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 מתוך Notebook בלחיצת כפתור
  • איך ליצור גרסאות אוטומטיות של הנתונים במחברת ובכל שלב בצינור

מה תצטרכו

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

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

הגדרת מזהה הפרויקט ב-GCP ושם האשכול

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

פותחים את קונסולת GCP

3fdc4329995406a0.png

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

e8952c0b96067dea.png

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

fe25c1925487142.png

3. התקנה של MiniKF

יצירת מכונת Compute

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

.

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

d6b423c1911ea85a.png

לוחצים על הלחצן הפעלה ב-Compute Engine ובוחרים את הפרויקט.

b5eeba43053db4bd.png

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

dc401e2bb5a884d9.png

מחכים שהמכונה של Compute Engine עם MiniKF תופעל.

5228086caadc44c6.png

כניסה ל-MiniKF

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

774e83c3e96cf7b3.png

כניסה ל-Kubeflow

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

251b0bcdbf6d3c71.png9d49d899bb0b5bd1.png

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

6258e0f09e46a6c2.png

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

8cff90ce2f0670bd.png

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

1c6fd768d71c0a92.png

התחברות ל-Rok

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

a683198ac4ba900d.png80aad6ba5d298a7e.png

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

4. הרצת צינור (Pipeline) מתוך Notebook

בקטע הזה, תריצו את הדוגמה של הטיטאניק, תחרות ב-Kaggle שבה מנסים לחזות אילו נוסעים שרדו את טביעת הטיטאניק.

יצירת Notebook Server

עוברים לקישור Notebook Servers (שרתי מחברות) במרכז הבקרה המרכזי של Kubeflow.

4115cac8d8474d73.png

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

f9303c0a182e47f5.png

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

a2343f30bc9522ab.png

חשוב לוודא שהתמונה הזו נבחרה:

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

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

8544d9b05826b316.png

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

28c024bcc55cc70a.png

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

2f06041475f45d3.png

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

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

2482011174f7bc75.png

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

cd data/
git clone -b kubecon-workshop https://github.com/kubeflow-kale/examples

המאגר הזה מכיל סדרה של דוגמאות שנבחרו בקפידה עם נתונים ומחברות עם הערות. עוברים לתיקייה data/examples/titanic-ml-dataset/ בסרגל הצד ופותחים את המחברת titanic_dataset_ml.ipynb.

c85baf68b36c63b2.png

עיון בקוד ה-ML של אתגר טיטניק

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

bf2451fd7407e334.png

חוזרים לטרמינל ומתקינים את הספרייה החסרה.

pip3 install --user seaborn

d90593b21425dd12.png

מפעילים מחדש את ליבת ה-Notebook בלחיצה על סמל הרענון.

a21f5f563b36ce4d.png

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

המרת מחברת ל-Kubeflow Pipeline

כדי להפעיל את Kale, לוחצים על סמל Kubeflow בחלונית הימנית.

3f4f9c93b187b105.png

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

15cca32444c1f12e.png

לוחצים על הלחצן הידור והרצה.

bde5cef34f00e258.png

צופים בהתקדמות של תמונת המצב.

9408f46abb2493f5.png

צופים בהתקדמות של הפעלת צינור עיבוד הנתונים.

9edbde68032f5e4b.png

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

a81646a22584e1b9.png

מחכים עד שהיא תסתיים.

44bee7dc0d24ec21.pngd377b6d574a4970.png

מעולה! הרצתם עכשיו Kubeflow Pipeline מקצה לקצה, החל מה-notebook שלכם.

5. שחזור באמצעות תמונות מצב של נפח אחסון

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

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

2a594032c2dd6ff6.png

שחזור המצב הקודם

למזלנו, Rok מטפל בניהול גרסאות של הנתונים ובשחזור הסביבה כפי שהיא הייתה בזמן שלחצתם על הלחצן Compile and Run (קומפילציה והרצה). כך יש לכם מכונת זמן לנתונים ולתכנות. אז נחזיר את הצינור למצב שבו הוא היה לפני אימון אחד מהמודלים ונראה מה קורה. מעיינים בשלב randomforest ואז לוחצים על Artifacts.

4f25ca4560711b23.png

פועלים לפי השלבים במאמר בנושא Markdown, כלומר לוחצים על הקישור המתאים כדי להציג את התמונה ב-Rok UI.

e533bc781da9355a.png

מעתיקים את כתובת ה-URL של Rok.

d155d19731b5cedd.png

עוברים לקישור Notebook Servers (שרתי מחברות).

aafeab01f3ef0863.png

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

f2265a64e8f9d094.png

מדביקים את כתובת ה-URL של ה-Rok שהעתקתם קודם ולוחצים על הכפתור מילוי אוטומטי.

9ba4d4128a3bdeea.png

מציינים שם לנוטבוק.

7685c3bf35fc74b2.png

חשוב לוודא שהתמונה הזו נבחרה:

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

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

28c024bcc55cc70a.png

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

34955a64ae316de1.png

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

a1f7c81f349e0364.png

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

ניפוי באגים במצב קודם

מוסיפים פקודת הדפסה לתא הזה:

print(acc_random_forest)

מריצים את התא הפעיל על ידי הקשה על Shift + Return כדי לאמן מחדש את יער ההחלטה האקראי ולהדפיס את הניקוד. המספר הוא 100.

e2a8a3b5465fcb5d.png

עכשיו נבדוק אם יש משהו מוזר בנתוני האימון. כדי לבדוק ולפתור את הבעיה הזו, מוסיפים תא מעל ל-Random Forest markdown. לשם כך, בוחרים את התא הקודם ולוחצים על סמל הפלוס (+).

d1077f32dff9620f.png

מוסיפים את הטקסט הבא ומריצים את התא כדי להדפיס את קבוצת הנתונים לאימון.

train_df

2854798ff01aed4e.png

אופס! העמודה עם תוויות האימון (Survived) נכללה בטעות כמאפייני קלט. המודל למד להתמקד בתכונה 'האם הנוסע שרד' ולהתעלם מכל השאר, וכך הוא מזוהם. העמודה הזו תואמת בדיוק ליעד של המודל ולא מופיעה במהלך החיזוי, ולכן צריך להסיר אותה ממערך הנתונים לאימון כדי לאפשר למודל ללמוד מהתכונות האחרות.

הוספת תיקון באג

כדי להסיר את העמודה הזו, עורכים את התא כדי להוסיף את הפקודה הבאה:

train_df.drop('Survived', axis=1, inplace=True)
train_df

9e76c16a862b566.png

מפעילים את Kale ומוודאים שהתא שמסיר את התוויות Survived הוא חלק משלב הצינור featureengineering (צבע המתאר שלו צריך להיות זהה).

מריצים שוב את צינור העיבוד בלחיצה על הלחצן הידור והרצה.

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

מחכים לסיום השלב results וצופים ביומנים כדי לראות את התוצאות הסופיות. עכשיו יש לכם ציוני חיזוי ריאליסטיים!

8c6a9676b49e5be8.png

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

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

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

7. מזל טוב

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

מה השלב הבא?

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

קריאה נוספת