על למידה חישובית, תכנה חופשית ומה שביניהם

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

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

היום קיימות עשרות תשחתיות (frameworks) לעבודה עם רשתות נוירונים - וכל הפופולריים ביניהם הם תכנה חופשית: tensorflow, pytorch, caffe, keras, mxnet ועוד רבים אחרים הם תכנה חופשית שמופצת תחת רשיונות די מתרניים. חברות ענק שעומדות מאוחרי חלק מהם כמו facebook ו־google דואגים להחזיק את הקוד הפתוח - כי רק כך ניתן לשרוד בעולם הזה בו השיטות והמאמרים שפורסמו לפני שנה כבר לא מספיק עדכניים.

אבל, יש פה אבל אחד גדול מאוד. כל התשתיות האלה, דורשות שימוש ב־GPU על מנת לקבל תוצאות בזמן סביר. נקח לדוגמה את הרשת המקורית הידועה בשם alex-net שהייתה אחת פרצות הדרך מהמשעותיות ביותר בתחום הלמידה החישובי בשני עשורים אחרונים. זמן אימון הרשת ב־2012 לקח סדר גודל של שבועיים תוך שימוש בשני כרטיסים גרפיים.

כמובן אין כל פסול בשימוש בכרטיסים גרפיים - הם בסה"כ עושים מה שהם יודעים לעשות טוב number-crunching. אבל, היום כמט כל התשתיות מסתמכות של טכנולוגיה אחת וספק אחד - כולם משתמשים ב־cuda וב־nVidia. יתרה מזו חלק מהתשתיות מסתכמות באופן בלעדי על ספריה סוגרה אחת בשם cuDNN שמאפשרת לנצל את כל החישוב של החומרה עד תום. cuDNN ו־cuBLAS הן הספריות שבלעדיהם tensorflow או pytorch פשוט לא יכולים להקיים מבחינת לקוח הקצה.

כן, קיימות תשתיות שמאפשרות אימון גם על טכנולוגיה פתוחה. לדוגמה ל־caffe יש ענף opencl העובד על בסיס טכנולוגיות פתוחות ויודע לרוץ גם על כרטיסים של AMD ואפילו של Intel. אבל

  1. פיתוח של caffe די נפסק - ובעולם הדינאמי של היום זה אומר - הפרויקט במצב מוות קליני
  2. גם כשאתה משתמש בו אתה מקבל קנס לא קטן מבחינת ביצועיים. זמני הריצה הם איטיים בערך פי שתיים.

בהתחשב בעובדה שחלק מהאימונים יכולים לקחת שעות רבות אפילו ימים זה הופך את הענף של opencl לפחות רלוונטי. הסיבה לאיטיות היא שהמימוש לא נהנה האופטימיזציות מטורפות וכתיבה ב־assembly ש־nVidia הייתה יכולה לעשות ב־cudnn ו־cuBlas.

אבל מה עם AMD? האם הם ישנים? כן ולא. AMD דאגו לפתח אלטרנטיבה בשם ROCm. למעשה אם אתה עובד על לינוקס ויש לך כרטיס כמו rx580 או Vega 56 אתה יכול באמץ סביר להריץ את ה־tensorflow ו־pytorch ואפילו caffe על AMD. והיתרון הגדול של ROCm הוא שמדובר בקוד פתוח לחלוטין. החסרון?.. מאיפה להתחיל

  1. ROCm תומך אך ורק בלינוקס אם אתה על Mac או על Windows... לא
  2. ספריית MIOpen שלהם שמהווה מאין תחליף ל־cudnn, אפילו שתומכת ב־OpenCL עובדת אך ורק על דיריבר rocm של AMD. משמעות - אומנם זה קוד פתוח אבל זה vendor-lock-in לא פחות מ־cudnn של nvidia
  3. ROCm לא תומך עדיין ברטיסים הגרפיים העדכניים ביותר מבוססי rdna כמו Rx 5700XT וחבריו. עברה שנה מאז שהכטריסים האלה הושקו אבל עדיין לא ניתן להשתמש בהם לטובת למידה חישובית.
  4. הוא גם לא נותן מענה ל־APUs. הכרטיסים הגרפיים המובנים שבאים במעבדים כמו Razen 3400G - לא יעבדו עם tensorflow או pytorch. ויש לציין של־Vega 11 שבא עם 3400G יש יותר כוח החישוב מ־GTX 580 ש־alex-net המקורי אומן עליו.

למעשה נראה כי AMD עשתה הכל כדי למנוע ממישו אפילו להסתכל בכיוון שלהם לטובת deep-learnים.

מה עם פתרונות עבור intel? הרי גם להם יש GPU? מעבר לעובד שביצועי Intel GPU הם בדיחה, גם intel דאגה לכתוב ספריית deep-learning משלה שלא עובדת עם שום כרטיס גרפי אחר.

שורה תחתונה

למרות שמבחוץ נראה שכל נושא למידה חישובית על רשתות נוירונים מתבסס על תכנה חופשית, במציאות יש רק דרך אחת לעבוד - לעבוד עם הקוד הסגור של ספק אחד. ללא שילוב של nVidia/cuda/cudnn התחזיות של Deep-Learning די עגומות

שוחררה גרסת בטא ראשונה של CppCMS 2.0.0

ב־יום רביעי, 26 באוגוסט 2020, מאת ארתיום; פורסם תחת: תכנה חופשית, תכנה ומחשבים, CppCMS; ‏0 תגובות

שוחררה גרסת בטא הראשונה. השינויי העיקרי - לפי דרישת הקהילה זה מעבר ל־C++11 כברירת מחדל - מה שאפשר לנקות חלקים נכבדים מספריית booster הממשים פונקציונליות שהייתה חסרה ב־C++2003:

ביניהם:

  • מצביעים חכמים
  • תמיכה ב־threads
  • שימוש ב־std::error_code ונגזרותיו
  • החלפת auto_ptr ז"ל ל־unique_ptr ועוד.

ראוי לציין שהגרסה הקודמת עבדה עם C++11 אבל לא ניצלה את היכולות שלה כמו למשל move-constructor וכד'.

כיוון שהשינויים לא ב־100% תואמים לאחור זוהי גרסת משמעותית מבחינת משתמשים.

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

בנוסף כיוון ש־python2.7 הגיע ל־End-Of-Life הסבתי את הקוד של unit-tests ושל ה־template compiler לתמיכה גם python2.7 וגם ב־python >= 3.5. חייב לציין שאני עדיין מתפלא מהשטות הזו של הסבת מחרוזות ל"unicode" במקום שימוש ב־utf-8 פשוט. למה להרוס לאנשים שאת הקוד הקיים?

בינה מלאכותית על ZX Spectrum

ב־יום שבת, 28 בדצמבר 2019, מאת ארתיום; פורסם תחת: תכנה חופשית, תכנה ומחשבים, בינה מלאכותית; תגובה אחת

המחשב הראשון שלי היה ZX Spectrum. למדתי עליו לתכנת, למדתי לכתוב קוד אסמבלי, וגם את ההבנה איך מעבדים בנויים רכשתי שם.

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

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

אז לקחתי את ה-Hello World של למידה חישובית זיהוי ספרות בכתב היד והחלטתי לממש את זה ב-ZX Spectrum.

להלן התוצאות:

https://github.com/artyom-beilis/zx_spectrum_deep_learning

mnist2

ניתן למצוא מאמר מלא באנגלית והסברים מלאים על התהליך כאן:

http://blog.cppcms.com/post/125

CppCMS עובר מ-LGPLv3 ל-MIT

ב־יום שלישי, 16 בינואר 2018, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים, CppCMS, C++‎‏; ‏0 תגובות

היום עדכנתי רישיון של CppCMS ל-MIT. הגרסה הקרובה 1.2 תשוחרר עם רישיון מעודכן

ההחלטה נובעת ממספר סיבות:

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

אחרי תקופה ארוכה שוחררה בטא של CppCMS 1.1.0

ב־יום רביעי, 12 ביולי 2017, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, CppCMS, C++‎‏; ‏0 תגובות

אחרי תקופה ארוכה של המתנה שוחררה גרסת בטא 1.1.0 של CppCMS. גרסה זו מכילה המון שיפורים ושיוניים. ביניהם:

  • תכנון מחדש של application pool לתיקון מספר בעיות מובנות שהיו קיימות בו עד כה
  • API חדש של פעולות non-blocking לשיפור משמעותי בביצועי אפליקציות אסינכרוניות
  • סיכון ועיבוד בזמן העלאה של התוכן (למשל עיבוד או בדיקה של קבצים תוך כדי העלאה)
  • תמיכה משופרת ב-RESTful API
  • מערכת לניהול plugin ושיפורים מערכת תבניות (templates) בהם.
  • אפשרות ניהול session ללא עוגיות (למקרה והמשתמש ממש צריך)
  • שילוב ניהול ה-session מול טכנולוגיות אחרות כולל מימוש עבור PHP, Java Servlet, ASP.Net ו-Python Django
  • שיפורי ביצועים רבים
  • ועוד...

התכנון הוא לבצע בדיקת בטא מהירה, לשחרר 1.2 כגרסה יציבה (גם ככה חלק ניכר מהמשתמשים כבר עובד בענף הפיתוח ב-git).

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

  • ל-1.4 תמיכה מלאה ב-HTTP/1.1, ב-HTTPS ומימוש של websockets
  • ל-2.0 להעביר CppCMS ל-C++11 תוך ניקוי חלק מה-API שילקח מספריה סטנדרטית כמו std::shared_ptr

אתם מוזמנים להתנסות בגרסת בטא האחרונה!

העמוד הקודם

העמוד הבא

דפים

נושאים