עוד סיבה לעשות AI ב-MATLAB ייצור קוד אוטומטי לחומרות קצה שונות
במידה ונרצה שהמערכת שאנו מפתחים תתאים לעבודה ב-Real-Time, נצטרך לכתוב קוד מותאם למעבד הספציפי, לבדוק את נכונות האלגוריתם שלנו, וכן לעמוד בדרישות Real-Time.
במידה ונרצה שהמערכת שאנו מפתחים תתאים לעבודה בReal-Time, נצטרך לכתוב קוד מותאם למעבד הספציפי, לבדוק את נכונות האלגוריתם שלנו, וכן לעמוד בדרישות Real-Time.
בפוסט זה נפרוט את הפלטפורמות שניתן לייצר להם קוד מתאים לעבודה בReal-Time:
- Embedded Devices (C/C++)
- GPU (CUDA)
- FPGA (VHDL, Verilog)
- Embedded Devices (C/C++)
ניתן לייצר קוד בצורה אוטומטית בעזרת MATLAB, קוד שהינו מאופטם עבור מעבדי Intel ו-ARM.
בתהליך יצירת הקוד, המנוע של MATLAB ישתמש בספריות של הספק (Vendor) כחלק מהקוד המיוצר מה שיהפוך את הקוד לאופטימלי מבחינת זמן החישוב.
כמו כן, תהליך הקוונטיזציה (הורדת גודל המשתנים בזכרון) יוכל להתבצע באופן אוטומטי, כחלק מתהליך ייצור הקוד – וכך להוריד את כמות הזכרון וזמן החישוב של הרשת.
ישנן 3 אפשרויות של ייצור קוד מהרשת המאומנת:
- עבור מעבד אינטל עם ספריה MKL-DNN
- עבור מעבד ARM בשימוש עם ARM Compute Library
- עבור כל מעבד ע"י יצירת קוד C גנרי
הקוד אותו תייצרו יוכל לכלול גם אלמנטים נוספים פרט לרשת עצמה כגון שלבי האלגוריתמיקה העוטפים – פעולות Preprocessing ו-Postprocessing וכך לקבל תוצר סופי בסביבת Embedded בה אתם מעוניינים לעבוד.
חשוב לציין! הרשת עצמה אינה חייבת להיבנות בMATLAB-, אלא ניתן לייבא אותה לתוך MATLAB מפלטפורמות פיתוח AI אחרות. אך השכבות השונות אשר מרכיבות את הרשת חייבות להיתמך ביצירת קוד (ניתן לראות את רשימת השכבות הנתמכות כאן).
כמובן שאת כל תהליך יצירת הקוד לא תצטרכו לעשות לבדכם, יש מגוון דוגמאות של רשתות שונות ומעבדים שונים שתוכלו להתבסס עליהם על מנת להצליח בתהליך ייצור הקוד.
אחד מן היתרונות בעבודה עם ייצור קוד אוטומטי, היא שניתן לשנות פרמטרים בסביבת הפיתוח (MATLAB, במקרה שלנו) ולעדכן את הרשת המיוצרת כדי לבדוק את ההשפעות בעבודה ב-Real-Time.
- GPU (CUDA)
לא הרבה מפתחים יודעים לכתוב קוד CUDA בצורה ידנית. לא שזה מסובך בצורה מיוחדת, אך זה מצריך ידע שפחות נפוץ היום. עם זאת, בימים בהם פיתוח מערכות AI זהו דבר שבשגרה, הרבה פעמים כן נדרש הידע של קידוד ל-CUDA ועבודה על גבי GPUs.
לכן, כל מי שצריך לעבוד על גבי מעבד GPU של ARM או NVIDIA, בהחלט צריך לשקול את השימוש ביכולת ייצור הקוד מ-MATLAB.
שיקול ראשון לטובת השימוש ב-GPU הוא, שהאלגוריתם שתריצו ב-MATLAB במרבית המקרים יהיה מהיר יותר בעת השימוש ב-GPU, מה שיכול להאיץ תהליכים ארוכים ומייגעים (שלשמם פיתחתם מלכתחילה יכולות ריצה על גבי GPU).
מכיוון ש-MATLAB יודע לייצר קוד רק ממנת האלגוריתם הרלוונטית (ללא תוספות גנריות כאלה ואחרות), וכן מכיוון שבתהליך יצירת הקוד MATLAB משתמש בספריות ידועות מראש, הקוד שיתקבל יהיה אופטימלי ויעיל יותר (כלומר ידרוש פחות זיכרון וירוץ מהר יותר) משאר הפתרונות הקיימים בתחום זה.
(וכל זה עוד לפני שדיברנו על יכולות הקוונטיזציה המתקדמות שתוכלו להיעזר כחלק מהתהליך).
תוכלו לראות בגרף הבא את ההבדל במהירות ה-Inference בין הפלטפורמות השונות:
היכולת לייצור קוד תומכת ברשתות נוירונים מסוגים שונים, למשל: Series, DAG, CNNs, ConvNets.
ובנוסף יש תמיכה בסביבות הבאות: cuDNN, TensorRT, ARM (Mali GPU).
ניתן להשתמש במספר רב של רשתות מאומנות מראש, כמו: Res-Net-50, SegNet, LSTM.
כדי לדעת אילו שכבות ספציפיות שונות נתמכות לייצור קוד, ניתן להיכנס לכאן.
כמו כן, MATLAB מאפשר לכם לייצר קוד CUDA מהאלגוריתם שלכם, לצורך האצת החישובים בהתבסס על מעבד GPU בדומה ליכולת האצת ביצועים ע"י יצירת קוד C.
בנוסף, תוכלו לייצר Kernels מתאימים לביצוע חישובים מקביליים בהתבסס על ארכיטקטורת המעבד שאתם רצים עליו.
לבסוף, כחלק מתהליך פיתוח המוצר, MathWorks פיתחו מספר יכולות מובנות עבור בדיקות ופיתוח מהיר של המערכות, תוכלו להתחבר למספר חומרות הנפוצות בשוק כדי לפתח את המוצר שלכם (לדוגמא NVIDIA Jetson), ולהתחבר עם כל חומרה התומכת את הממשקים הקיימים.
כמו כן, תוכלו לתקף את המערכת שלכם עם בדיקות SIL & PIL והכל בעבודה דרך MATLAB, ללא איש תוכנה שיתפעל את כל הקוד הזה עבורכם.
בסרטון הבא תוכלו לראות דוגמה של מערכת המבצעת קלסיפיקציה לאותות ECG, אשר כוללת יצירת קוד CUDA והתממשקות לחומרה כחלק מתהליך הפיתוח.
- FPGA (VHDL, Verilog)
מכיוון שייצור קוד לחומרה זהו תהליך מורכב, MathWorks דאגו לפשט חלק נרחב מן הפעולות הנדרשות ביצירת קוד מרשת נוירונים עבור הטמעה על חומרת FPGA.
מכיוון שהטופולוגיה של השכבות השונות ידועה, ורק צריך לקנפג את הגדלים והממשקים, תהליך ייצור הקוד נהיה פשוט יותר עבור המפתח – ללא צורך בהבנה מעמיקה על דרישות המימוש בחומרה.
כאמור, מכיוון שמדובר בתכונות ידועות מראש של כל שכבה ושכבה, צריך לוודא תחילה שהשכבות שאתם משתמשים בהם נתמכות (ניתן לראות את רשימת השכבות הנתמכות כאן).
ואולי תשמחו לשמוע גם שאם אתם משתמשים ברשת מאומנת קיימת, תוכלו להיווכח שיש מספר רב של רשתות פופולריות שכבר נתמכות ליצירת קוד עבוד HDL.
כחלק מתהליך יצירת הקוד, MATLAB מאפשר לכם להבין איך כל שכבה מתנהלת מבחינת דרישת משאבים וזמני חישוב.
כך תוכלו לטייב את הרשת ולאפטם אותה הן ברמת סוגי השכבות, לבצע דיוק לפרמטרים (קוונטיזציה), ולבחור את מספר האובייקטים האפשריים.
בפועל, אתם זוכים לאחוז במקל משני קצוותיו – בדרך זו, תהליך ייעול הקוד לא צריך להיות תלוי בגורם אחר בשרשרת הפיתוח.
שימוש בFPGA עבור יכולות AI מתקדמות הוא תהליך מתבקש עבור שימוש בתדרי מערכת גבוהים.
בעבודה על SOC תוכלו לקבל את היתרונות של יצירת קוד עבור המעבד (בחלק עם הדרישות הנמוכות של המערכת) ויצירת קוד HDL עבור הדרישות הגבוהות שלה.
כך תוכלו לפתח בסביבה אחת וממנה לצאת לבדיקות על גבי החומרה.
לבסוף, תוכלו לאשש את אופן פעולת החומרה שלכם על ידי שימוש ב-FIL (FPGA in the Loop).
כך תוכלו להתממשק לתוכנה אותה פיתחם ב-MATLAB, ולתקף את האלגוריתם שבניתם על החומרה ב-Real-Time.
כשלב אחרון בתהליך הפיתוח, תוכלו לייצא את קוד ה-RTL ולהשתמש בו כתוצר הסופי של המערכת.
תוכלו לראות עוד על נושא זה בסרטון הבא (5:32):