מבוא לספריית cuDNN - הבסיס שעליו נבנו כל מסגרות הלמידה העמוקה¶
בפוסט הקודם דיברנו על cuBLAS, ספריית האלגברה הלינארית שמריצה כפלי מטריצות מתחת למכסה המנוע. אבל רשתות נוירונים עמוקות לא בנויות רק מכפלי מטריצות. יש להן שכבות ייחודיות - קונבולוציה, pooling, נורמליזציה - שדורשות ספרייה משלהן. זו בדיוק cuDNN.
אז מה זה בעצם cuDNN¶
cuDNN, ראשי תיבות של CUDA Deep Neural Network library, היא ספרייה של NVIDIA שמספקת מימושים מותאמים ומהירים במיוחד לפעולות הבסיסיות שמרכיבות רשתות נוירונים עמוקות. במקום שכל מפתח מסגרת עבודה יכתוב את הפעולות האלה בעצמו מאפס, cuDNN נותנת בסיס משותף, מותאם היטב לחומרת NVIDIA, שכל מסגרת עבודה יכולה לבנות עליו.
הפעולה הכי מוכרת בתוך cuDNN היא קונבולוציה, ה-building block המרכזי של רשתות קונבולוציה שמשמשות בעיבוד תמונה ובראייה ממוחשבת. אבל הספרייה כוללת גם מימושים לpooling, נורמליזציה, פונקציות הפעלה, ורכיבים נוספים שחוזרים על עצמם בכמעט כל ארכיטקטורת רשת נוירונים.
למה קונבולוציה כל כך מורכבת לאופטימיזציה¶
אם כפל מטריצות כבר דורש הבנה עמוקה של tiling, coalescing, ורגיסטרים, קונבולוציה מוסיפה עוד רבדים של מורכבות. יש כמה אלגוריתמים שונים לחישוב קונבולוציה, כל אחד עם יתרונות וחסרונות תלוי בגודל הפילטר, גודל הקלט, וכמות הערוצים. חלק מהגישות ממירות את הבעיה לכפל מטריצות ומשתמשות ביתרונות שכבר קיימים שם, וגישות אחרות מבצעות את החישוב בצורה ישירה יותר, מותאמת ספציפית לתבנית של קונבולוציה.
cuDNN לא רק מממשת כמה אלגוריתמים כאלה, היא גם כוללת מנגנון שבוחר אוטומטית את האלגוריתם הכי מתאים לגודל הספציפי של הבעיה שלכם, על סמך בדיקות ביצועים שהצוות של NVIDIA ביצע מראש על החומרה. זו בדיוק סוג ההחלטה שקשה מאוד למפתח בודד לקבל נכון בלי משאבים דומים.
איך מסגרות עבודה משתמשות בזה¶
בדיוק כמו cuBLAS, גם cuDNN היא בדרך כלל שכבה שאתם לא רואים ישירות. כשאתם מגדירים שכבת קונבולוציה בPyTorch או בכל מסגרת עבודה אחרת ללמידה עמוקה, מאחורי הקלעים היא קוראת ל-cuDNN כדי לבצע את החישוב בפועל. זו הסיבה שביצועי אימון והרצה של רשתות קונבולוציה תלויים לא רק בקוד Python שאתם כותבים, אלא גם בגרסת cuDNN המותקנת ובאופן שבו היא מנצלת את החומרה הספציפית שלכם.
הקשר לTensor Cores¶
בדורות GPU מודרניים יותר, חלק גדול מהביצועים של cuDNN מגיע מניצול חומרה ייעודית לחישובי מטריצות בדיוק מעורב, שנקראת Tensor Cores. cuDNN יודעת מתי ואיך לנצל את היחידות המיוחדות האלה, בלי שהמשתמש צריך לדעת שהן קיימות. זו עוד דוגמה לכך שהפער בין ביצועים טובים לביצועים מעולים תלוי בהיכרות עמוקה עם החומרה הספציפית, לא רק בכתיבת אלגוריתם נכון.
למה זה חשוב להבין¶
אם אתם מנפים ביצועים של מודל, או מנסים להבין למה אימון מהיר או איטי, ההבנה שcuDNN עומדת מאחורי רוב השכבות שלכם עוזרת להבין איפה בכלל אפשר להשפיע - בבחירת ארכיטקטורת הרשת, בגדלי batch, בסוג הדיוק, ולא בניסיון לכתוב קונבולוציה מהירה יותר בעצמכם.
זה בדיוק הסוג של הקשר שאנחנו נותנים בקורס תכנות GPU, שמראה איך כל השכבות - מkernel בודד ועד ספריות מקצועיות כמו cuDNN - מתחברות יחד למערכת שלמה.
לסיכום¶
cuDNN היא הספרייה שמבצעת בפועל את רוב הפעולות הייחודיות לרשתות נוירונים עמוקות, ומגיעה עם עשרות אלגוריתמים מותאמים ובחירה אוטומטית ביניהם. כמעט כל מסגרת עבודה ללמידה עמוקה נשענת עליה, גם אם המשתמש הסופי אף פעם לא רואה אותה בשמה.
בואו תבינו מה עומד מאחורי כל שכבת רשת שאתם מגדירים, עם קהילה שכבר שם.