רשתות נוירונים בקוד פתוח... תמונת מצב

ב־יום שבת, 30 בינואר 2021, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, בינה מלאכותית; ‏3 תגובות

כידוע היום שוק ה־deep learning נשלט באופן כמעט בלעדי ע"י nVidia. אומנם כל תשתיות למידה החישובית הפופולריות כגן TensorFlow, PyTorch, Caffe, MXNet ואחרות משוחררות כקוד פתוח, אבל בליבו של כל אחד מהם, ללא יוצא מן הכלל, רצות ספריות cublas ו־cudnn המאפשרות לנצל את החומרה בצורה מיטבית. כולן כמובן קוד בסגור ומסוגר הרץ על בסיס CUDA. כמובן, גם הוא API פרטי וקנייני של חברת nVidia.

אקדים ואומר: אין אני טוען שהסכנה כאן כי החברה "המרושעת" תשתלט על בינה מלאכותית ותקים skynet מתחת לרגליים שלנו. לא, בסה"כ מדובר במימוש פעולות מתמטיות בסיסיות מוגדרות היטב בצורה יעילה להפליא.

אבל אני רוצה קוד פתוח?

אז יש מספר פתרונות וכיוונים:

  1. לאמן הכל ב־CPU בלבד.
  2. להשתמש בתשתית ROCm של AMD.
  3. להשתמש ב־OpenCL במקום ב־CUDA ואז חוץ מדרייבר של nVidia הכל יהיה פתוח (פחות או יותר)

נשתמש ב־CPU הישן והטוב?

אז אפשר לאמן גם ב־CPU. זה יעבד מצוין על mnist. אבל מעבר לאימון הרשתות הפשוטות והקטנות ביותר זה חסר תועלת. כי ההבדל הביצועים בין אימון ב־CPU למעומת ב־GPU הוא בסדרי גודל.

לדוגמה זמן אימון איטרציה של 32 תמונות ב־ResNet-50 ב־pytorch ב־CPU מול ה־GPU הבסיסיים ביותר שעלו בעת הרכישה כמה מאות שקלים:

i5-6600 rx560  gtx960
5.36s   1.09s  0.69s   

מודבר הבדל משמעותי ביותר גם עבור ה־GPU הבסיסי והזול.

ומה ל־AMD יש להציע?

אז בואו נסתכל על מה ש־AMD מציע לנו. חברת AMD פיתחה תשתית hip/rocm בקוד פתוח המתחרה ב־CUDA. למעשה העתיקה את ה־API של CUDA רק החליפה cu ב־hip על מנת להקל על הגירה מפטפורמה אחת לשניה. בנוסף החברה פיתחה גם ספריית deep learning בשם MIOpen שגם היא פתוחה (למעט כמה חלקים חשובים). החברה גם הסבה מספר תשתיות deep-learning ל־rocm! ביניהם tensorflow, pytorch וגם caffe.

אז עד כמה הביצועים יהיו טובים? קשה להשוות כרטיסים שונים של ספקים שונים. יש הרבה מאוד פרמטים. החשובים ביותר הן מהירות וגודל הזכרון כמובן מספר FLOPS שהוא מסוגל לבצע.

למה שני המדדים האלה כל־כך חשובים? כי מרבית פעולות הקשורות ל־deep learning תהיינה מוגבלות ע"י אחד מהם. לדוגמה חישוב פעולה כמו ReLU יהיה מוגבל ע"י מהירות הזכרון, לעומת זאת מכפלת מטריצות או קונבולוציה תוגבלנה ע"י מספר ה־FLOPS ש־GPU מסוגל לבצע (בהנחה שהתכנה כתובה בצורה יעילה).

יש לי שני כרטיסים שעל הנייר הם כמעט זהים NVidia GTX 960 ו־AMD Radeon RX 560.

  • ל־rx560 ו־gtx960 מספר shaders זהה 1024 וגם השעון מאוד קרוב 1196MHz ו־1304MHz. המשמעות היא שכוח החישוב הוא מאוד דומה: 2.4TFLOPS ו־2.6TFLOPS בהתאם.
  • מפרט הזכרון זהה 4G של GDDR5 ברוחב 128bit עם מהירות תיארטית 112GB/s.

לכן קל מאוד להשוות את יכולת התכנה של nVidia ושל AMD לסחוט את המיטב מהכרטיסים. אז בדקתי את הרשת ResNet-50 עם גדלי ה־batch השונים ב־3 תשתיות נפוצות caffe, keras/tensorflow וגם pytorch. כאשר הרצה על gtx960 השתמשה כמובן ב־cuda+cudnn ועל rx560 הרצה הייתה עם rocm+miopen. מדדתי זמן איטרציית האימון ב־ms והנה התוצאות:

Framework   BS  rx560  gtx960 Comp
caffe       4   283    205    72% 
caffe       8   -      369    -

pytorch     4   170    130    76%
pytorch     8   303    210    69%
pytorch     16  556    364    65%
pytorch     32  1093   694    63%

keras       4   233    163    70%
keras       8   362    250    69%
keras       16  602    410    68%
keras       32  1084   772    71%

הערות:

  • caffe משתמש ביותר זכרון GPU לכן הצלחתי להריץ עד גודל ה־batch=8
  • hipCaffe נכשל בריצה עם batch=8 בגלל מחסור בזכרון

רואים שאותם החישובים על פלטפורמת ה־AMD נופלים בכ־30% בהנתן אותם הביצועים ובכ־25% אם עושים תיקון למהירות השעון. האמת תוצאה, לא רעה בהתחשב בעובדה ש־rx560 הוא בכל זאת כרטיס זול יותר.

מצוין, יש פתרון!? לא בדיוק...

  1. כמובן התשתית עובדת רק על הכרטיסים של AMD! אז אולי הקוד פתוח אבל לא פותר את בעיית ספק החומרה היחיד.
  2. התשתית עובדת רק ב־Linux - כך שמשתמשי Windows, Mac OS X או BSD חפשו במקום אחר.
  3. אין עדיין תמיכה בדור האחרון של הכרטיסים על ארכיטקטורת RDNA אפילו שעברה יותר משנה מאז שחרורם. גם חסרה תמיכה בכרטיסים מובנים של ה־APU כמו Vega 11.

    רוצה להשתמש ב־rocm אז תקנה בכרטיסים ישנים מדור Polaris (כמו rx 580) או ב־Vega (כמו Vega 56/64). אחרת עליך לרכוש או את הכרטיסים המיועדים לשרתים מסדרת Instinct שכמובן באים עם תג מחיר אחר.

    אם תיכנסו היום לחנות KSP או Ivory ותבדקו איזה כרטיסי AMD נמכרים תגלו שאלה הם בעצם כרטיסים מבוססים RDNA כמו rx6800 או הדור הקודם כמו rx5600. אל תתפתו לקנות אותם. הם לא נתמכים!

אז יש ROCM אבל הוא לא תומך בחומרה הנפוצה הזמינה כיום!

OpenCL הצילני נא!

כיום רוב התשתיות deep-learning עובדות על CUDA... אבל בעולם הגרפיקה הן AMD והן nVidia תומכים ב־Direct3D, OpenGL וגם Vulkan. מפתחי המשחקים לא בדיוק כותבים קוד לכל כרטיס בנפרד? אולי יש משהו דומה לעולם החישובים?

אכן ישנו! קיים סטנדרט בתחום חישובים על גבי כרטיסים גרפיים הנקרא OpenCL. אפילו ה־GPU הקטן שנמצא בטלפון חכם של רובינו תומך בו. אז מה הבעיה?

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

אז אולי מישהו הרים דגל ועשה את העבודה? קיימות היום שתי תשתיות deep-learning שתומכות ב־OpenCL:

  1. ענף OpenCL של Caffe - שצערי כבר הפסיק להתפתח.
  2. ה־backend החליפי ל־keras שנקרא plaidml. שימו לב זה keras לא tensorflow.

המצב לא מזהיר אבל בואו נראה מה הביצועים - האם מכאן תבוא הישועה?

GPU    FW     BS Native OpenCL  

rx560  caffe  4  283    392     72%
rx560  caffe  8  -      633     -
gtx960 caffe  4  205    306     67%
gtx960 caffe  8  369    555     66%

rx560  keras  4  233    672     35%
rx560  keras  8  362    1247    29%
gtx960 keras  4  163    285     57%
gtx960 keras  8  250    501     50%

גם מבחינת הביצועים המצב לא טוב. בעבודה עם caffe איבדנו כ־1/3 מהביצועים בשני סוגי ה־GPU לעומת זאת ב־keras/plaidml איבדנו 1/2 מהביצועים בכרטיס NVidia ו־2/3 בכרטיס AMD!

אבל למה? הרי כל פעולות deep learning הן בסה"כ אלגברה לינארית בסיסית? כן, אבל:

  • הספריה הטובה ביותר של אלגברה לינארית ל־GPU שקיימת היום CLBlast מצליחה להגיע לכ־60% מהביצועים במכפלת מטריצות בהשוואה ש־cublas הסגורה יכולה להציע! מימוש מכפלת מטריצות שמנצל את כל ה־flops הזמינים הוא קשה להחריד, אבל מהנדסי nVidia הצליחו להגיע ליעילות של כ־95% ניצול ה־FLOPS של ה־GPU מעומת כ־60% של CLBlast.
  • גם קונבולוציה היא פעולה שאפשר לממש אותה בצורה משמעותית יותר יעילה אם משתמשים בשיטות וינוגרד שמקפיצות את הביצועים באופן תיאורי עד פי 2.3. אבל לא קיים מימוש גנרי של השיטה שכתוב ב־OpenCL.

לכן, המצב הוא לא טוב, גם לא קיימים מספיק מימושים ב־OpenCL וגם המימושים לא מתקרבים לביצועים שהספריות שעברו אופטימיזציה טובה יכולים לספק.

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

סיכום

היום קשה מאוד לצאת מאחיזת ברזל של חברה אחת עם פתרונות בקוד סוגר. למרות שעולם ה־deep-learning מתפתח בעולם האקדמיה ורוב התשתיות הן פתוחות יש מעט מאוד דאגה למה שקורה "ברמת הברזלים". זה מטריד. אבל ללא תחרות רצינית מצד AMD ו־Intel או תשומת לב הדוקה מצד הקהילה קשה להאמין שמשהו ישתנה.

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

תגובות

אלמוני פלמוני, ב־31/01/21 11:28

צריך רק להמיר את הרטיצה במטריצה ולעשות הגהה קטנה ...

אלמוני פלמוני, ב־31/01/21 11:29

אופס: צריך רק להמיר את המרטיצה במטריצה ולעשות הגהה קטנה ...

ארתיום, ב־31/01/21 11:45

תודה. תוקן - קראתי מספר פעמים את המאמר - ובכל זאת פספסתי :-)

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים