מדריך: כך תאיצו את הXGBOOST שלכם
גם לכם נמאס לשמוע כל היום ש"בינה מלאכותית" מתקדמת כל כך מהר כשאפילו עץ משעמם אי אפשר להריץ מספיק מהר במציאות?
.הרשו לי להראות לכם איך להריץ את העצים שלכם כדי שגם אתם תוכלו להתרברב ב"בינה המלאכותית" שלכם!
בעולם האמיתי
בזמן שכולם מתלהבים להם ממודלים שעושים טריקים כמו לדבר או לצייר, 90% ממדע הנתונים מבוסס על טבלאות ובטבלאות עצים (כמו XGBoost, LightGBM, Catboost) שולטים.
בדרך כלל בעולם האמיתי, הדוגמאות הקשות ביותר למודל הן המעניינות ביותר למשתמשים.
לא פעם יצא לי להריץ מודלים ש"ישר" צדקו ב80% מהמקרים אך התקשו לסחוט עוד ביצועים ב20% הנותרים.
וה20% היו בדיוק המקרים ה"לא ברורים" והמעניינים במיוחד גם לבני האדם.
בגלל כוחם של מודלים אלו, על מנת לסחוט את ה20% הנותרים נדרש מאמץ רציני, גם ממדעני הנתונים וגם בכוח המחשוב. מקרים אלו בדרך כלל מצריכים אימון ארוך במיוחד של עצים עמוקים במיוחד (max_depth) המכילים הרבה מאוד עלים (num_leaves) כשכל עלה נקבע על ידי דוגמאות רבות (min_data_in_leaf).
ולכן הרצת המודלים המתקבלים במציאות כבדה ואיטית הרבה יותר.
מה שהופך מודלים אלו ללא שמישים בעולם האמיתי עבור חלק מהמשימות הדורשות מהירות מסוימת.
איך להאיץ עצים באינפרנס?
ישנם בגדול שלושה פתרונות מובילים להתמודדות עם בעיה זו:
- הספריה הפתוחה TreeLite
- שימוש בFIL עם הספריה RAPIDS מאנבידיה (מצריך GPU)
- הספריה DAAL של אינטל
בשורה התחתונה:
לפני שנעבור עליהן, בשורה התחתונה: מי הכי מהירה?
אמ;לק: ככל הנראה אינטל. אבל (!!) כולם טוענים שהם המהירים ביותר ומראים הוכחות (מוטות) לכך, במציאות הספריות קרובות מאוד מבחינת ביצועים ושכל אחד יעשה את שיקוליו.
הספריה הפתוחה Treelite
הפשוטה ביותר
לינק: https://treelite.readthedocs.io/en/latest/
הספריה הפתוחה TreeLite פשוטה ביותר לשימוש ותומכת בהאצת שלושת מודלי העצים הפופולרים ביותר: XGBoost, CatBoost ו-LightGBM. Treelite היא מספקת ממשק אחיד ופשוט במיוחד לטעינת המודלים המאומנים ותוצאת המודלים נשארת כמעט זהה בזמן התחזית.
השימוש בה פשוט במיוחד והוא כולל את טעינת המודל והמרתו לפורמט אותו ניתן להאיץ ומרגע זה יש בידיכם את אותו המודל רק מהיר יותר.
הקוד הפשוט ביותר:
import treelite
model = treelite.Model.load('my_model.model', model_format='xgboost')
model.export_lib(path='xgb_model.so', format='so')
compiled_model = treelite.runtime.Predictor('xgb_model.so', verbose=True)
ומכן תוכלו פשוט להשתמש במודל:
pred = predictor.predict(treelite_runtime.DMatrix(X))
חסרונות: ישנה פגיעה קלה בדיוק המודל, מומלץ לבדוק על המודלים שלכם.
ספריה RAPIDS של אנבידיה
מהירה במיוחד על GPU
לינק: https://docs.rapids.ai/api/cuml/stable/api.html…
הספריה RAPIDS מבית אנבידיה מאפשרת הרצת מודלים מאומנים על גבי GPU.
שימו לב: לא מדובר בהצה סטנדרטית של מודלים מואמנים על GPU – מדובר בהאצה משמעותית של המודלים עצמם לאחר שאומנו: אתם תקבלו שיפור משמעותי במהירות המודלים במידה ותשתמשו בשיטה זו.
שימו לב 2.0: כל ספריות העצים המודרניות מאפשרות אימון על GPU ומומלץ תמיד להשתמש בGPU במידה והדבר אפשרי עבורכם. האצת מודלים באמצעות GPU חוסכת זמן משמעותי ואינה באה על חשבון ביצועי המודלים וניתן לקבל האצה משמעותית אפילו יותר במידה ואתם משתמשים בcuml המגיע בספריה RAPIDS של אנבידיה.
שימוש ביכולות אלו גם הוא יחסית פשוט אך מצריך קצת יותר התעסקות שכן cuml אינו תומך בפנדס ישירות ויש להמיר את המידע למטריצה מספרית.
הקוד הפשוט ביותר על מנת לעשות זאת:
from numba import cuda
from cuml import ForestInference
X_gpu = cuda.to_device(np.ascontiguousarray(X_test.astype(np.float32)))
model = ForestInference.load(model_path, output_class=True)
pred = model.predict(X_gpu)
חסרון שחובה להזכיר: אני חייב להוסיף רגע של כנות, קשה מאוד להתקין את RAPIDS (עד גבול הבלתי אפשרי בלי להתקין את כל המחשב מחדש) אם אתם לא עובדים עם הDocker של אנבידיה. במידה וזו היא אינה בעיה עבורכם (בכל זאת מחשב פרודשן, לא תמיד אפשר לעשות בו מה שרוצים) ספריה זו מספקת פתרון מצוין.
הספריה DAAL של אינטל
המהירה ביותר
לינק: https://www.intel.com/…/improve-performance-xgboost…
ככל הנראה, ספריה זו היא המהירה ביותר במעבדים החדשים של אינטל.
איך? מה הופך את Intel DAAL למהירה יותר?
כדי למקסם את הניצול של מעבדי אינטל הספריה משתמשת בסט הפקודות הוקטוריות Intel AVX-512 בהרצת המודלים ואיתו ממומשות עוד כמה היוריסטיקות פשוטות המאיצות את החישוב אפילו יותר.
בנוסף: הרצת אינפרנס במציאות, במקרים רבים המודל מופעל על דוגמה בודדת (גודל באצ' = 1), ברצה מסוג זה Intel DAAL מהירה משמעותית בחלק מהמקרים.
קוד פשוט:
import daal4py as d4p
model = d4p.get_gbt_model_from_xgboost(<MODEL_PATH>)
pred = d4p.gpt_regression_prediction().compute(X, model)
לסיכום:
אז במי לבחור?
יש רק תשובה אחת נכונה לשאלה זו: בדקו בעצמכם!