מאמרים בנושא ‏בינה מלאכותית‏.

מעשה בשני NaNים

ב־יום שישי, 11 בפברואר 2022, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, בינה מלאכותית; ‏2 תגובות

לאחרונה ניסיתי להריץ אימון של GAN על pytorch עם תמיכה ב־dlprimitives. אחד דברים הלא נעימים באימון של GANים באופן כללי זה שהם לא ממש יציבים ומתבדרים בקלות.

שמתי לב שבגרסת cuda הוא רץ ללא דופי ובגרסה שלי הוא נתקע. נתקע על ביצוע backpropogation ב־convolution. אחד ההבדלים העיקריים באגלוריתם בהשוואה לשאר היה שימוש בפעולות אטומיות לחישוב סכום (טריק מאוד נפוץ במימוש קונבולוציה)

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

כתבתי שאלה ב־Stackoverflow העתקתי קטע קוד... ואז נפל האסימון

float oldv = *ptr;
for(;;) {
    float newv = oldv + v;
    float prev = as_float(atomic_cmpxchg((__global volatile int *)(ptr),as_int(oldv),as_int(newv)));
    if(prev == oldv)
        return;
    oldv = prev;
}

קחו לכם כמה דקות.

פעולת comxchg ב־OpenCL עובדת רק על int. לכן הייתי צריך לעשות bit-casting ל־int ובחזרה (as_float ו־as_int בדיוק עושים את זה). ואז תנאי הבדיקה prev==old ביצעתי ב־float במקום בשלמים.

כך שאם הערכים שווים אז ההחלפה הצליחה. אבל מה שכחתי? NaN == NaN תמיד נותן false! ולכן תקעתי בלולאה אינסופית כי התנאי לעולם לא ייתקיים. החלפתי לבדיקה בערכים שלמים (קרי ייצוג בינארי) והכל עבד חלק.

מסקנה NaN הוא טריקי... יש לכבדו

עדכוני dlprimitives

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

מספר עדכונים:

  • התקדמות יפה עם pytorch - בוצעה ולידציה של מרבית הרשתות של סיווג הנמצאות ה־torchvision:

    • alexnet
    • resnet18
    • resnet50
    • vgg16
    • densenet161
    • googlenet
    • squeezenet1_0
    • inception_v3
    • shufflenet_v2_x1_0
    • mobilenet_v2
    • mobilenet_v3_large
    • mobilenet_v3_small
    • resnext50_32x4d
    • wide_resnet50_2
    • mnasnet1_0
    • efficientnet_b0
    • efficientnet_b4
    • regnet_y_400mf

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

  • ניסיתי לעשות אינטגרציה עם OneDNN של אינטל (מאין cudnn ל־GPU שלהם) רק כדי לגלות שהביצועים שלהם בפורמט NCHW גרועים. כיוון שרוב התשתיות עובדות עם הפורמט הזה pytorch, caffe, mxnet ועוד אז OneDNN לא ממש רלוונטי בינתיים. אחזור לשם כשיקרה אחד מהשניים:

    • אינטל יתקנו את הביצועים עבור הפורמט הנפוץ
    • אני אפתח תמיכה ב־NHWC לטובת TensorFlow בו זה פורמט ברירת מחדל

המשך יבוא

התחלתי להתקדם לאימון בקוד פתוח: pytorch עם תמיכה ב־OpenCL

ב־יום ראשון, 10 באוקטובר 2021, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, בינה מלאכותית; ‏2 תגובות

תקציר: הצלחתי לבצע inference של AlexNet ב־pytorch ב־OpenCL. הביצועים זהים לפעלה ישירה של dlprimitives.

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

http://blog.dlprimitives.org/post/5

מדוע אנחנו זקוקים ל־deep-learning מבוסס OpenCL?

ב־יום ראשון, 12 בספטמבר 2021, מאת ארתיום; פורסם תחת: תכנה חופשית, בינה מלאכותית; ‏0 תגובות

במאמר חדש http://blog.dlprimitives.org/post/2 אני סוקר את הסיבות והצורך בהקמת תשתית למידה חישובית מבוססת OpenCL. אני מתייחס כאן לסיבות שהן לאו דווקא סיבות "אידואולוגיות" כמו שימוש בקוד פתוח אלא גם מתייחס לנושאים טכניים ומהותיים:

  • מחקר ואלגוריתמים
  • וניהול פרויקטים לטווח רחוק
  • שיפור מוצר ע"י תחרותיות

השוואה בין תפוחים ירוקים ואדומים

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

כשמודבר ב־Deep Learning זה מאוד קשה להשוות בין GPU של החברות המובילות AMD ו־NVidia. בניגוד למשחקי מחשב שנותנים לך מדדים ברורים על עלות מול תועלת, תחום DL נשלט באופן בלעדי ע"י NVidia. גם אם קיימים פתרונות של AMD הם לא תמיד עובדים. למשל כרטיסי RDNA/RDNA2 עדיין לא נתמכים ע"י AMD לטובת Deep Learning - והם בעצם הכרטיסים הזמינים היחידים היום בשוק.

ובכן כחלק מפרויקט DLPrimitives עשיתי השוואה כזו:

http://blog.dlprimitives.org/post/1

וכן גם השקתי בלוג חדש לטובת עדכונים על הפרויקט.

העמוד הבא

דפים

נושאים