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

לחבר שני תחביבים

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

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

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

אמרנו לינוקס?

אז מה המצב התוכנה בתחום זה מבחינת תוכנה חופשית ולינוקס? יש ויש. חלק הארי של הכלים הם חופשיים/קוד־פתוח. יש לא מעט תוכנה ללינוקס, אם כי הדברים הטובים ביותר רצים על חלונות. רוב הדרייברים של המצלמות דווקא סגורים. אבל לרוב יש גרסאות לינוקס, Raspberry PI ועוד.

עכשיו, בצילום אסטרונומי יש נדבך חשוב שמעניין אותו במיוחד: Electronically Assisted Astronomy או EAA בקיצור. פירושו ביצוע כל הפעולות הנדרשות לצילום (כולל עיבוד, איסוף תמונות והערמה) בזמן אמת, כאשר עם כל תמונה חדשה של האובייקט, אתה מקבל את התמונה הסופית המשופרת יותר ויותר. המטרה של EAA בניגוד לצילום, לא להגיע לתמונה הטובה ביותר אפשרית, אלא להגיע לתמונה שמספיק טובה כדי לראות את האובייקט ולהנות ממנו.

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

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

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

אז הרמתי את דגל

בניתי פתרון ל־EAA עבור לינוקס ואנדרואיד ושמו OpenLiveStacker. והוא בנוי בצורה הבאה:

  • הקוד כתוב ב־C++‎ עם שימוש ב־OpenCV לצורך עיבוד תמונה
  • הממשק בנוי כ־web interface שמדבר ב־REST עם השרת - מה שמאפשר בניית ממשק בלינוקס ואנדרואיד באותה צורה וגם מקל על גישה מרחוק במקרה והתוכנה רצה על pi. כמובן שהשרת מבוסס CppCMS. מה שמאפשר חיבור קל ונוח בין הקוד שדורש ביצועים הגובהים לממשק משתמש.
  • הדרייברים נטענים דינאמית:
    • אחד עבור מצלמה גנרית עם פרוטוקול UVC על בסיס libusb/libuvc- שתומך במצלמות רשת או במצלמות כמו SVBony sv105 - אבל הוא מוגבל לצורכים אסטרונומיים
    • דרייבר של ASI ZWO - החברה המובילה בתחום, שעובד מול SDK שלהם. לצערי הדרייבר עצמו הוא קוד סגור, אבל יש להם גרסה לאנדרואיד.
    • דרייבר גנרי שיודע לקרוא קבצים מהספרייה איך שהם מגיעים - מה שמאפשר חיבור לכל מצלמה אחרת דרך כלים קיימים כמו indi/ekos.
  • לצורך תמיכה באנדרואיד יש אפליקציה קטנה שעוטפת את השרת ומנהלת גישה ל־USB (כי באנדרואיד הכל צריך להיות מסובך)
  • לצורך הקלה על התמצאות יש חיבור לתוכנה פופולרית מאוד בתחום אסטרונומיה: ASTAP שיש לה גם גרסה (קובץ ריצה) לאנדרואיד. הדבר המעניין בתוכנה הזו שהיא כתובה בפסקל! לא חשבתי שאתקל בדבר כזה בימינו.

מה למדתי?

  • בניית אפליקציות אנדרואיד זה די סיוט וזה לא בגלל השפה אלא בגלל שצריך ללמוד פחות או יותר הכל מ־0. מזל שרוב הקוד ניתן לכתוב ב־C++‎.
  • כמעט כל דבר באנדרואיד עובד "קצת שונה". למשל: אין לך ‎/tmp, להריץ exe חיצוני זה סיפור שעלה לי בלילה לבן, להביא קבצים עם אפליקציה זה גם לא משהו טריוויאלי. בקיצור. זה לינוקס, אבל לא בדיוק.
  • אני שונא לעבוד עם קוד סגור. אומנם ASI ZWO משחררים דרייברים לאנדרואיד, אבל הם גם הכניסו באג מעצבן שגורם ל־RTTI לא לעבוד! למעשה כל תכנת החיבור ל־SDK שלהם כתבתי ב־C+-‎ בגלל אי זמינות של RTTI. וזה לא היה משהו מסובך אם הייתי יכול לקמפל את הדרייבר מחדש הבעיה הייתה פשוט נעלמת.

שורה תחתונה

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

התקדמות חשובה בתמיכה ב־OpenCL ב־pytorch.

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

רקע

היום pytorch היא אחת התשתיות המובילות בעולם למידה עמוקה. יש לה יתרונות רבות, אבל מבחינת המפתח זה קוד איכותי ותיעוד טוב. הקוד כתוב בצורה מאוד מודרנית עם שימוש נכון ביכולות C++‎ מה שמאוד מקל על הפיתוח. אני עובד בתקופה האחרונה על פיתוח מנוע עבור pytorch מבוסס OpenCL כחלופה ל־cuda.

כבר כתבתי בעבר על חשיבות התמיכה ב־OpenCL.

אבל בכל זאת אזכיר כמה נקודות מבחינת קהילת תוכנה חופשית וקוד פתוח:

  1. אנחנו זקוקים בתמיכה חוצת פלטפורמה בכרטיסי מסך מיצרנים שונים כמו AMD, Intel וכמובן nVidia.
  2. אנחנו זקוקים למימוש האלגוריתמים המרכזיים כקוד פתוח הזמין לכל (ולא כקופסה סגורה ש־nVidia נותנת)
  3. אנחנו רוצים לעבוד עם סטנדרטים פתוחים וזמינים כמו OpenCL ולא מימושים ספציפיים של יצרן (כמו cuda).

הפרוייקט ב־github‏

אז מה חדש? קלות אינטגרציה!

עם שחרור גרסה 1.13 של pytorch חל שיפור משמעותי ב־out-of-tree-backend. עכשיו הוספת מנוע אימון מבוסס OpenCL היא פשוטה מאוד ולמעשה שאלה של מספר דקות, אפילו בוונידוס העניין יחסית פשוט. המשמעות שאפשר להשתמש במנוע OpenCL בקלות רבה הן בלינוקס והן בווינדוס.

מה עם הביצועים? אם משווים מול גרסת cuda/cudnn על אותו ה־gpu מדובר בין 50 ל־70 אחוז ביצועי cuda באימון ובין כ־60 ל־80 באבלואציה (תלוי ברשת כמובן).

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

המנוע עצמו מבוסס על ספריית dlprimitives‏ שאני מפתח במקביל והיא חלופה ל־cuDNN על בסיס OpenCL וגם מנוע חיזוי שעובד עם מודלים בפורמט ONNX - שזה נושא גדול בפני עצמו.

מה המשמעות של זה?

  • משתמשי AMD יכולים לאמן רשתות. הם לא מוגבלים למספר מצומצם של דגמים ש־rocm תומך בהם או לשימוש בלינוקס בלבד. התמיכה היא גורפת מ־APUים ישנים כמו Stoney Ridge ועד ל־RDNA 2 וגם זה עובד על "חלונות" למי שמעוניין.

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

  • תשתית אימון היא קוד פתוח לגמרי גם אם עובדים עם nVidia (טוב חוץ מהדרייבר שלהם)

  • כל מה שצריך זה דרייברי של OpenCL. לא צריך את כל המפלצת של cuda (מי שיצא לו להתקין לשדרג לגלות בעיות תאימות יבין אותי מידי)

מחפש עזרה...

מישהו יודע איך אפשר לבנות ולפרסם whl לפלטפורמות שונות? רצוי איזה שירות ענן שיעשה זאת? כדי שזה יהיה ממש במרחק של pip install :-)

מעשה בשני 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 הוא טריקי... יש לכבדו

חצי שנה אחרי פיתוח אפליקציה AstroHopper, הידוע גם בשם SkyHopper

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

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

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

אבל מה שאני רציתי דווקא לדבר עליו זה המשוב שקיבלתי מהמשתמשים. עד היום רוב הקוד הרציני כתבתי לטובת מתכנתים עצמם: cppcms, boost, cppdb ופה ושם היו כמו פרויקט לקהלים פחות טכניים biditex, makeahmap אבל כולם בסופו של דבר עבדו דרך "קובץ הגדרות". לעומתם AstroHopper זהו היישום קוד פתוח הראשון בו באמת השקעתי בכתיבת ממשק משתמש גרפי. יותר מזה מדובר בממשק לטלפון נייד.

אני קיבלתי המון הערות והצעות שיפור בונות שאת רובם יישמתי וראיתי כיצד זה שיפר את חווית המשתמש (שלי ושל אחרים)

  • לשנות צורה של בחירת נק' איפוס
  • כיצד להקל על איפוס אחרי איפוס
  • לבטל כפתורים מיותרים
  • להתאים את ממשק למסכים קטנים
  • לשפר את תיבת החיפוש וההתנהגות שלה
  • לשנות בחירת הפרמטרים לתצוגה
  • אפשר שליטה על גודל הפונטים במפה (שהסתבר מאוד קריטית לאלו שמשתמשים במשקפיים וגם לי כי בלילה בחושך פונטים כגודלים יותר עוזרים)
  • לעשות איפוס על כוכבי הלכת ולא רק כוכבים ואפילו על גרמי שמיים עמוקים אחרים
  • גם עזרו בלעשות תיקונים ל־iPhone אפילו שלא היה ברשותי

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

יש עוד דברים שאפשר לשפר כמו לעשות zoom in-out בעזרת תנועת pinch שמסתבר לא כל־כך קלה למימוש. אבל בכל הסיפור הזה הבנתי דבר פשוט - שאולי יישמע טרויוואלי למי שמפתח UI למחייתו:

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

שורה תחתונה - זה אחד הפרויקטים היותר מיוחדים שעבדתי עליו; וגם אחד הקטנים בהיקף הקוד בצורה מפתיעה - רק כ־2,500 שורות הקוד כולל התיעוד!

עדכוני 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 בו זה פורמט ברירת מחדל

המשך יבוא

העמוד הבא

העמוד הבא

דפים

נושאים