יום רביעי, 28 בספטמבר 2016

Think big

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

חידושים הקשורים לעבודה עם big data:
בעולם ה-big data המידע הוא כה רב, עד שקשה לעבוד איתו באמצעות פונקציות MATLAB רגילות, אשר מניחות שכל המידע נמצא בזיכרון. במהלך השנים נוספו לסביבת MATLAB מספר רב של כלים לעבודה עם big data, המספקים פתרונות לגישה למידע, עיבודו, וכן עבודה על פלטפורמות שונות לעיבוד מקבילי, ביניהם נמנים:  memmapfile, datastore, mapreduce, gpu arrays, parallel for-loops. בגרסה החדשה נוסף טיפוס המידע tall, המאפשר לעבוד עם big data שבנוי ממספר רב של שורות ביחס למספר העמודות (ומכאן מקור השם tall).
במקום לכתוב קוד מיוחד שמתחשב בגודל הנתונים (למשל בעבודה עם mapreduce),  tallמאפשר לעבוד
עם
big data באופן פשוט ואינטואיטיבי, עם אותן פונקציות מוכרות ובאותו סינטקס, כאילו היה זה משתנה רגיל הנמצא בזיכרון - MATLAB יודע לעבוד עם חלקים קטנים של המידע הגדול שלנו, ולמעשה מנהל מאחורי הקלעים את החלוקה והעיבוד של הנתונים באופן אופטימלי.

איך זה עובד?
בניגוד לעבודה עם משתנים הנמצאים כולם בזיכרון, הפעולות על tall arrays לא מתבצעות מיד, אלא "נאגרות" עד שהמשתמש מבקש לקבל את התוצאות באמצעות פונקציית gather. כאשר קוראים ל-gather, MATLAB  משלב את כל החישובים ש"נאגרו" ומבצע אופטימיזציה כך שמספר המעברים על המידע יהיה מינימלי, דבר החוסך זמן ריצה יקר.  תהליך זה נקרא deferred evaluation  - המשתנים נמצאים במצב unevaluated, מעין מצב המתנה, עד לקריאה לפונקציית ה-gather. כדי לחסוך בזמן רב יותר, מומלץ לאגור פעולות רבות ככל האפשר ולקרוא ל-gather רק כאשר רוצים לקבל את התוצאות. יובהר ש-gather מחזירה תוצאות לזיכרון, ולכן המשתנים המוחזרים מהפונקציה צריכים להיות בגודל המתאים לזיכרון המחשב או ה-clusterבהקשר הזה יודגש שניתן לעבוד עם tall arrays במחשב האישי, על גבי clusters, ואפילו על גבי Spark* (תהליך העבודה המומלץ הוא "להתחיל בקטן" - לפתח את האלגוריתם במחשב האישי, ולאחר מכן להרחיב את העבודה עם אותו קוד על גבי פלטפורמות אחרות).
שימו לב לכך שניתן לכתוב
tall arrays  שלמים לדיסק או לשמור מצב נוכחי של  tall arrays (יצירת קובץ קטן המתבסס על כך שהמידע המקורי נגיש ונמצא באותו מיקום) באמצעות הפונקציות write ו-save (בהתאמה).

אז איך מתחילים?
כדי ליצור tall arrays יש להגדיר תחילה משתנה datastore, אשר הינו אובייקט המשמש כמצביע על קובץ גדול או רשימה של קבצים הנמצאים בזיכרון או על גבי HDFS, ומאפשר לקרוא את המידע מהזיכרון בחלקים לפי הגדרות המשתמש. לאחר מכן – אפשר להגדיר את ה datastore- להיות tall array באמצעות פונקציית tall. הנה סינטקס לדוגמה (לחצו להגדלה):  
על ה-tall array הנ"ל ניתן כעת לעבוד באמצעות מאות פונקציות מעולם הסטטיסטיקה וה-machine learning התומכות בעבודה עם tall arrays (לרשימה המלאה - לחצו כאן). ולסיום - נשתמש ב-gather.
לסרטון הדגמה קצר בעברית - לחצו פה.

לסיכום -
התשתית מוכנה, התמיכה רחבה, וכל מה שנשאר זה להתחיל לחשוב בגדול!


*למידע על עבודה עם tall arrays על גבי Spark ישירות דרך ה-MATLAB, לחצו כאן. לעבודה עם tall arrays על גבי Spark באמצעות אפליקציה מקומפלת – לחצו פה.