הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
איך ללמוד תכנות בגיל צעיר?
כשהייתי בן 11 הורים שלי קנו לנו מחשב קטן ZX Spectrum עם מעבד Zilog Z80 מ־48KB של זכרון. "מערכת ההפעלה" שלו הייתה BASIC פשוט, הוא התחבר לטלוויזיה, התוכנה נשמרה ונטענה מקלטות. אומנם קיבלנו את המחשב בתחילת שנות ה־90 אבל בפועל זו הייתה טכנולוגיה של שנות ה־80. כך או אחרת זה הדליק את העניין שלי ושל אחי בתוכנה התווה את הדרך המקצועית של שנינו. למדתי עליו תכנות בסיסי והאסמבלי של Z80 הוא הראשון (ובעצם היחיד) שלמדתי לעומק.
קצת נוסטלגיה
עבר המון זמן. אבל תמיד אהבתי את המחשב הקטן ההוא. שחקתי עם אמולטורים שלו כמו fuse ואפילו בניתי תוכנה עבורו. אפילו חשבתי לקנות אחד ישן - אבל תמיד זה העלה שאלות - חיבור למסכים, אלטרוניקה של שנות ה־80 עם קבלים שלרוב נהרסו ועוד כל מיני שיקולים.
אבל לאחרונה יצאה מחשב "מחודש" הנקרא "The Spectrum" שמעשה מדמה את המחשב הישן נראה בדיוק כמוהו אבל עובד עם טכנולוגיה מודרנית - מאפשר לטעון טכנה מדיסק־און־קיי ומתחבר למסך עם HDMI. אחרי הרהורים קצרים הזמנתי אחד מ־Amazon צרפת ו... לא התאכזבתי. באמת, מחשב קטן וגאוני. מהר מאוד כתבתי בשבילו כמה משחקים פשוטים ב־BASIC למשל Snake. הראיתי את המחשב לבתי הגדולה. הראיתי כמה פקודות פשוטות. כתבתי לידה משחק פשוט בו תפוסים קוביה שנופלת
1 BORDER 1
5 LET row=0
6 LET score=0
10 LET p=16
20 LET col=15
25 LET row=0
30 PRINT AT row,col;"#"
40 LET row=row+1
100 PRINT AT 20,p;"^"
105 LET psave=p
110 IF INKEY$="p" AND p<31 THEN LET p=p+1
120 IF INKEY$="q" AND p>0 THEN LET p=p-1
130 IF psave<>p THEN PRINT AT 20,psave;" "
140 PRINT AT row-1,col;" "
145 IF row>20 AND p=col THEN LET score=score+1: PRINT AT 21,0;"Score ";score;
150 IF row>20 THEN LET row=0: LET col=INT (16*RND)+7
200 GO TO 30
הפתיעה אותה כמה קל זה היה אז במחשבי 8bit הפשוטים לכתוב דברים כאלה. הייתי רוצה לתת גם לילדים שלי להיחשף לעולם התוכנה. ולמרות שברור לי מחשב כזה הוא נפלא למשימות האלה, אני לא חושב שזה רעיון טוב ללמיד את הטכנולוגיה של שנות השמונים.
אז מה האלטרנטיבות הים?
אני רציתי סביבה בה אפשר לבנות דברים פשוטים כאלה בלי "לפתוח חלונות" לטפל באלף הגדרות ממשק וכד'. משהו שלילד (וגם מבוגר) יהיה קל וכיף להיכנס.
לפני שתגידו Scratch - אני מכיר - אבל הבעיה שלי עם Scratch ש"שפת התכנות" מזעזעת. לא הצלחתי להתחבר. וגם כשנתתי לבתי הגדולה היא לא המשיכה הרבה עם זה. אולי בגלל שאני גם לא הצלחתי.
פתחתי דיוק בנושא בקבוצת פייסבוק של משתמשי ZX Spectrum שוודאי יבינו את הכוונה שלי:
- שפת תכנות קלה יחסית
- אפשרות הפעלה של הכל דרך ide (שלא אצטרך ללמד גם שורת פקודות)
- קל מאוד להגיע לתוצאות מהירות
ועלו מספר אפשרויות:
- love2d עם Lua
- pygame-zero עם Python
- processing עפ שפת תכנות מבוססת Java
- כמובן אותו ה־Scratch
התחלתי לחקור ופתחתי פרוייקט שכולל קוד המקור של כולם (מלבד Scratch)
מטרה - לכתוב משחק פשוט בו כדור נופל ממקום אקראי ומנסים תפוס אותו עם המשטח שמזזים אותו בעזרת מקשים. אם תופסים הניקוד עולה ומוצג למשתמש. הנה דוגמה של המחשק שבניתי ב־pygame zero:
תמיכה בחצובה או סיפורי הסבת indi ו-indigo לאנדרואיד
מה שטוב בסטנדרטים זה שיש הרבה כאלה...
אחרי תקופה ארוכה של פיתוח תוכנה/אפליקציית OpenLiveStacker המיועדת לצילום אסטרונימי בזמן אמת, הגעתי לנקודה שמעבר לתמיכה במצלמה נדרשת תמיכה בחצובה ובמצלמה גנרית. אז איך מתחברים במשהו גנרי? משתמשים בממשק סטנדרטי! בעולם "חלונות" יש ASCOM. בעולם הלינוקס המצב נותן מגוון רחב של סטנדרטים
המשך...הפצה? למי איכפת. האמת שכן
אני יודע שימי מלחמת הפצות לינוקס כבר פחות מעניינים - כי כולם בסופו של דבר +/- אותו הדבר. אבל החלטתי להיזכר מה הייתה הדרך שלי.
התחלתי עם Fedora 3 - הנתנה לי הרגשה מה זה לינוקס מודרני (אז). אבל מהר מאוד התייאשתי - כי הרעיון לשדרג כל 6 חודשים להפצה חצי יציבה - כי זו מעבדתי ניסויים של Red Hat - לא קסם לי.
המשכתי ל־Debian - ה־stable אז היה ממש ישן עברתי ל־testing שאומנם עבד אבל... היה קשה וגם חיכיתי המון לגרסה "יציבה" שהייתה ישנה עם ההגעה.
כשרכשתי מחשב מחדש 64 ביט התקנתי עליו גרסת LTS הראשונה של Ubuntu 6.06 ומשם בבית אני עם גרסאות LTS - למה? כי לא בא לי להתעסק יותר מידי בלינוקס.
בעבודה עבדתי עם RHEL וגם עם CentOS וגם עם גרסאות שונות ומשונות של Ubuntu. שורה תחתונה. זה עובד וזהו. לא משנה מה.
העיקר שיהיה יציב שלא ישגע עם שדרוגים יותר מידי ויעבוד. ונחמד כשזה נתמך ע"י תוכנה מסחרית
למידה עמוקה מחוץ לקופסת nVidia
לפני 3 וחצי שנים סקרתי את מצב הלמידה העמוקה בקוד פתוח (מחוץ לעולם nVidia) והמצב היה בכי רע.
גם עכשיו המצב לא מזהיר. לפני מספר שנים רכשתי AMD rx6600XT ולא מזמן בתור ניסוי קניתי Intel Arc a380.
נתחיל מפתרון מבית AMD - השכפול של cuda בשם hip
קודם כל בניגוד לשנים הקודמות בהן אפילו לא הייתה תמיכה בכרטיסי RNDA התקנתי לאחרונה אובונטו 22.04 התקנתי rocm הורדתי pytorch מתאים - וזה עבד (כמעט היה צריך להגדיר משתנה סביבה כדי שיכיר בכרטיס שלא נתמך באופן רשמי) אבל זה עבד. לא נתקלתי עד עכשיו במשהו שלא עבד. שזה בהחלט התקדמות מרשימה. כמובן גם כל הקוד של AMD הוא פתוח שזה יתרון ענק.
אבל... הם זרקו תמיכה ב-GCN4 זאת אומרת הכרטיס הישן rx560 כבר לא עובד עם rocm ואפילו דרייבר OpenCL שלהם קורס. דרייבר Mesa פשוט גרוע ו-rustocl קטסטרופה אחת גדולה, אבל הצלחתי להתקין amdgpu-pro הישן והלא נתמך - אבל לפחות עובד.
כלומר בעלי RDNA נראה יהנו, אולי גם אלה עם Vega (אבל לא APU) ורק אם משתמשים בלינוקס.
השחקנית החדשה בשוק היא Intel Arc
בניגוד ל-AMD הם לא שכתבו cuda אלא עובדים עם pytorch כ-plugin. ההתקנה קצת יותר מסובכת אבל הצלחתי. להבנתי החל מ-pytorch 2.5 או 2.6 זה כבר אמור להיות שקוף יותר. הכרטיס עובד. האימונים? תלוי עד כמה הקוד שאתה מנסה להריץ תלוי בעבודה ישירה מול cuda בלבד. אבל הצלחתי אפילו להריץ yolo ועוד כל מיני רכיבים. כך שהמצב נראה טוב יחסית. אבל כמובן Intel החליטו ללכת בדרך ה-nית שאף אחד לא עובד עם זה sycl... טוב לפחות זה תקן פתוח (שתכל'ס רק Intel עובדים איתו)
מה לגבי ביצועים. טוב. עשיתי השוואה בין gtx960 לבין arc a380. מבחינת המפרט
- לשניהם יש 1024 מעבדים
- מהירות הזכרון של אינטל כ-143GB/s לעומת כ84GB/s בנבידיה
- השעון הוא 2450MHz לאינטל לעומת כ-1506MHz משמע: יש כ-5020GFlops מול 3080GFlops יתרון
איך הביצועים... לא בדיוק טובים לעומת מה שכתוב על הנייר
למרות שהמהירות התיאורתית אמורה להיות יותר טובה בכ-%63 בפועל באימון היתרון היה סה"כ 38% באימון בממוצע ו-48% בחיזוי. אם לוקחים חציון המצב עוד יותר גרוע. 13% שיפור באימון ו-40% בחיזוי.
סיכום
אז המצב השתפר פלאים לעומת מה שהיה. זה רחוק מהליות מושלם אבל יש התקדמות ומה שחשוב שההתקדמות החדשה היא בתחום קוד פתוח.
עכשיו מה לא טוב? עדיין כל אחת מהחברות הגדולות בוחרת בפתרון משלה...
- nVidia זה cuda
- AMD זה hip/rocm (העתק של cuda)
- Intel זה - sycl אבל לפחות יש תמיכה גם ב-opencl ב-onednn
- Apple זה metal
- microsoft זה DirectML
נפלתם על הראש? ברור ש-nvidia תהיה מונופול בשוק.
ומה אני עושה?
ממשיך לעשות את הבלתי אפשרי ושחררתי עוד גרסה מספר 0.2.0 של OpenCL backend ל-Pytorch עם הרבה תיקונים.
מוזמנים לנסות - אבל הדרך עוד ארוכה
כשכבר מזמן לא איכפת לך מה גרסת מערכת ההפעלה שלך כל עוד זה לינוקס
לאור רכישת מחשב חדש התקנתי מערכת הפעלה על נקי. כבר מספר שנים (כ-6) הרצתי Ubuntu 18.04 וזה כבר התחיל לתת אותות התיישנות, לא בגלל שמשהו חסר לי אלא פתאום כבר אין תמיכה בכל מיני דברים חדשים.
אז הורדתי גרסה עדכנית של Kubuntu התקנתי הכל עבד יחסית חלק מערכת הפעלה חדשה נקיה, התקנתי כל כלי הפיתוח סידרתי Steam וקצת משחקים אחרים. התקנתי rocm כך שאני יכול להריץ pytorch על כרטיס AMD עם הפתרון הרשמי שלהם (וזה אפילו עבד חלק).
את המחשב הקודם הישן (בן 8 אבל עדיין טוב וחזק) הכנתי לבת שלי (שהגיע הזמן) גם התקנתי את ה-Kubuntu ופתאום קלטתי שבמהלך ההתקנה מופיע 22.04 ולא 24.04 - איזה באג מוזר. נו. סיימתי התקנה ואז החלטתי לבדוק. זה 22.04 ולא 24.04 - הלכתי למחשב שהתקנתי לפני שבועיים - גם כן! איך פספסתי! הסתכלתי על iso שהורדתי וזה באמת 22.04 והייתי כל הזמן בטוח ששמתי 24.04.
האמת, זה כל-כך לא משנה. כל עוד הדברים עובדים. רק צריך יהיה מתישהו לשדרג (אני שונא שדרוגים)