5 טיפים לאימון ריבוי GPU עם Keras PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

5 טיפים להכשרה רב GPU עם Keras

עמוק למידה (מילת הבאז המועדפת על סוף 2010, יחד עם blockchain / bitcoin ו- Data Science / Machine Learning) אפשרה לנו לעשות כמה דברים ממש מגניבים בשנים האחרונות. מלבד ההתקדמות באלגוריתמים (שבודאי מבוססים על רעיונות שכבר ידועים מאז שנות התשעים "עידן כריית נתונים"), ניתן לייחס את הסיבות העיקריות להצלחתו בזמינותם של מערכי נתונים גדולים בחינם, הצגת ספריות קוד פתוח ו השימוש ב- GPUs. בפוסט בבלוג זה אתמקד בשניים האחרונים ואשתף אתכם בכמה טיפים שלמדתי בדרך הקשה.

מדוע TensorFlow & Keras?

TensorFlow היא ספריית Deep Learning פופולרית מאוד שפותחה על ידי גוגל ומאפשרת לך להעלות טיפוס מהיר לרשתות מורכבות במהירות. זה מגיע עם הרבה תכונות מעניינות כמו בידול אוטומטי (מה שחוסך ממך לאמוד / קידוד הדרגות של פונקציות העלות) ותמיכה ב- GPU (המאפשרת לך להשיג שיפור מהיר במהירות 200x באמצעות חומרה הגונה). יתר על כן הוא מציע ממשק Python שפירושו שתוכלו להשתמש באב-טיפוס במהירות מבלי שתצטרכו לכתוב קוד C או CUDA. יש להודות שיש הרבה מסגרות אחרות בהן ניתן להשתמש במקום TensorFlow, כמו לפיד, MXNet, Theano, Caffe, Deeplearning4j, CNTK וכו ', אך הכל מסתכם במקרה השימוש שלכם ובהעדפתכם האישית.

אבל למה קרס? בשבילי שימוש ישיר TF זה כמו לעשות Machine Learning עם Numpy. כן זה אפשרי ומדי פעם צריך לעשות את זה (במיוחד אם אתה כותב שכבות / פונקציות אובדן מותאמות אישית) אבל אתה באמת רוצה לכתוב קוד שמתאר את הרשתות המורכבות כסדרה של פעולות וקטוריות (כן, אני יודע יש שיטות ברמה גבוהה יותר ב- TF אבל הן לא מגניבות כמו קרס)? מה גם אם תרצו לעבור לספריה אחרת? ובכן, כנראה שתצטרך לשכתב את הקוד, שמוצץ. טא טא טאאא, קרס להציל! Keras מאפשרת לך לתאר את הרשתות שלך באמצעות מושגים ברמה גבוהה ולכתוב קוד שהוא אגנוסטי תומך, כלומר אתה יכול להפעיל את הרשתות בספריות למידה עמוקות שונות. כמה דברים שאני אוהבת בקארס זה שהיא כתובה היטב, יש בה ארכיטקטורה מונחת עצמים, קל לתרום ויש בה קהילה ידידותית. אם אתה אוהב את זה, תגיד תודה ל פרנסואה חולט לפיתוחו ומיקורו פתוח.

טיפים וגטאות להכשרה רב-GPU

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

1. הכשרה רב-GPU אינה אוטומטית

אימון מודלים ב- GPU באמצעות Keras & Tensorflow הוא חלק. אם יש לך כרטיס NVIDIA והתקנת את CUDA, הספריות יאתרו אותו באופן אוטומטי וישתמשו בו לאימונים. כל כך מגניב! אבל מה אם אתה פרחח מפונק ויש לך מספר GPUs? ובכן, למרבה הצער תצטרך לעבוד קצת כדי להשיג הכשרה מרובת GPU.
5 טיפים לאימון ריבוי GPU עם Keras PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.
ישנן מספר דרכים להקביל רשת, תלוי במה שאתה רוצה להשיג, אך שתי הגישות העיקריות הן הקבלה של הדגם והנתונים. הראשון יכול לעזור לך אם הדגם שלך מורכב מכדי להתאים ל- GPU יחיד בעוד שהאחרון עוזר כשאתה רוצה להאיץ את הביצוע. בדרך כלל כאשר אנשים מדברים על אימונים מרובי GPU הם מתכוונים לאחרון. בעבר היה קשה יותר להשיג אך למרבה המזל Keras כלל לאחרונה שיטת שירות הנקראת mutli_gpu_model מה שמקל על האימונים / החיזויים המקבילים (זמין כרגע רק עם תומך TF). הרעיון המרכזי הוא שתעביר את המודל שלך דרך השיטה והיא תועתק על פני מכשירי GPU שונים. הקלט המקורי מחולק לנתחים המוזנים ל- GPUs השונים ואז הם מצטברים כפלט יחיד. ניתן להשתמש בשיטה זו להשגת אימונים ותחזיות מקבילות, עם זאת יש לזכור כי לאימונים היא לא מתרחשת בקנה מידה ליניארי עם כמות ה- GPUs עקב הסנכרון הנדרש.

2. שימו לב לגודל האצווה

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

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

הִתכַּנְסוּת: אם אתה משתמש ב- Stochastic Gradient Decent (SGD) או בחלק מהגרסאות שלו כדי לאמן את הדגם שלך, עליך לזכור שגודל האצווה יכול להשפיע על היכולת של הרשת שלך להתכנס ולהכליל. גדלי אצווה אופייניים בבעיות רבות בראיית מחשבים הם בין 32-512 דוגמאות. כפי ש קסקר ואח ' במילים אחרות, "נצפה בפועל כי כאשר משתמשים באצווה גדולה יותר (מ -512) ישנה השפלה באיכות המודל, כפי שנמדד ביכולתה להכליל." שים לב שלמיטבי אופטימיזציה שונים אחרים יש תכונות שונות וטכניקות אופטימיזציה מבוזרות מיוחדות יכולות לעזור בבעיה. אם אתה מעוניין בפרטים המתמטיים, אני ממליץ לקרוא את התזה של Joeri Hermans "על למידה עמוקה מדרגית ומקבילת ירידת שיפוע".
5 טיפים לאימון ריבוי GPU עם Keras PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.
משחית את המשקולות: זהו פרט טכני מגעיל שיכול להביא לתוצאות הרסניות. כשאתה מבצע אימונים מרובי GPU, חשוב להזין את כל ה- GPU עם נתונים. זה יכול לקרות שלצוות האחרונה של התקופה שלך יש פחות נתונים מההגדרת (מכיוון שלא ניתן לחלק את גודל הנתונים שלך בדיוק לפי גודל האצווה שלך). זה עשוי לגרום לחלק מה- GPU שלא לקבל נתונים במהלך השלב האחרון. לרוע המזל, חלק משכבות Keras, ובמיוחד שכבת הנורמליזציה של אצווה, אינן יכולות להתמודד עם זה שמוביל לערכי נאן המופיעים במשקלים (הממוצע הפועל ושונות בשכבת BN). כדי להפוך את הדברים ליותר מטושטשים, לא יתבוננו בבעיה במהלך האימונים (בעוד שלב הלמידה הוא 1) מכיוון שהשכבה הספציפית משתמשת בממוצע / שונות של האצווה באומדנים. עם זאת במהלך תחזיות (שלב הלמידה מוגדר כ- 0), נעשה שימוש בממוצע / שונות משתנה אשר במקרה שלנו יכול להפוך לנאן המוביל לתוצאות לא טובות. אז עשו לעצמכם טובה ותמיד וודאו שגודל האצווה שלכם קבוע כאשר אתם מבצעים אימונים מרובי GPU. שתי דרכים פשוטות להשיג זאת הן באמצעות דחיית קבוצות שאינן תואמות את הגודל המוגדר מראש או לחזור על הרשומות בתוך האצווה עד שתגיע לגודל המוגדר מראש. ואחרון חביב זכור כי בהתקנה מרובת GPU, גודל האצווה אמור להיות כפול ממספר ה- GPUs הזמינים במערכת שלך.

3. נתוני GPU רעב המכונה גם המעבדים אינם יכולים לעמוד בקצב ה- GPU

בדרך כלל החלק היקר ביותר בזמן אימון / חיזוי רשתות עמוקות הוא האומדן שקורה ב- GPUs. הנתונים מעובדים מראש במעבדי CPU על הרקע והם מוזנים ל- GPU מעת לעת. עם זאת אסור להמעיט בערך המהירות של ה- GPU; זה יכול לקרות שאם הרשת שלך רדודה מדי או שלב העיבוד המוקדם מורכב מדי עד שה- CPU שלך לא יוכל לעמוד בקצב ה- GPU שלך או במילים אחרות הם לא מאכילים אותם בנתונים מספיק מהר. זה יכול להוביל לשימוש נמוך ב- GPU שמתורגם לכסף / משאבים מבוזבזים.
5 טיפים לאימון ריבוי GPU עם Keras PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.
Keras בדרך כלל מבצע את האומדנים של הקבוצות במקביל בכל זאת, בגלל ה- GIL של Python (מנעול המתורגמן הגלובלי) אינך יכול באמת להשיג ריבוי חוטים אמיתיים בפייתון. ישנם שני פתרונות לכך: או השתמשו בתהליכים מרובים (שימו לב שיש המון גצ'ות בזה שלא אני מתכוון לכסות כאן) או שמרו על שלב העיבוד המקדים שלכם פשוט. בעבר שלחתי בקשה למשוך על Keras בכדי להקל על כמה מהמתחים המיותרים שהפעלנו על מעבדי ה- CPU במהלך עיבוד תמונה מוקדם, כך שרוב המשתמשים לא צריכים להיות מושפעים אם הם משתמשים בגנרטורים הסטנדרטיים. אם יש לך גנרטורים מותאמים אישית, נסה לדחוף כמה שיותר היגיון לספריות C כמו נופי, מכיוון שחלק מהשיטות הללו למעשה שחרר את ה- GIL מה שאומר שאתה יכול להגדיל את מידת ההקבלה. דרך טובה לגלות אם אתם עומדים בפני רעב נתונים של GPU היא לעקוב אחר השימוש ב- GPU, עם זאת, יש להזהיר שזו לא הסיבה היחידה להתבונן בכך (הסנכרון שמתרחש במהלך אימונים ברחבי ה- GPU המרובים הוא גם אשם בשימוש נמוך. ). בדרך כלל ניתן לאתר רעב של נתוני GPU על ידי התבוננות בפרצי GPU ואחריהן הפסקות ארוכות ללא שימוש. בעבר פתחתי מקור שלוחה ל- Dstat שיכול לעזור לך למדוד את השימוש ב- GPU שלך, אז תסתכל על פוסט מקורי בבלוג.

4. שמירת הדגמים המקבילים שלך

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

5. לספירת ה- GPUs הזמינים יש תופעת לוואי מגעילה

לרוע המזל כרגע ישנה תופעת לוואי מגעילה בשיטת tensorflow.python.client.device_lib.list_local_devices () הגורמת ליצירת מושב TensorFlow חדש ולאתחול של כל ה- GPUs הזמינים במערכת. זה יכול להוביל לתוצאות בלתי צפויות כמו הצגת יותר GPUs ממה שצוין או אתחול מוקדם של פעילויות באתר חדשות (אתה יכול לקרוא את כל הפרטים על זה בקשת משיכה). כדי להימנע מהפתעות דומות מומלץ להשתמש במקום זאת בשיטת K.get_session (). List_devices () של Keras, שתחזיר לך את כל ה- GPU הרשום כרגע בפגישה. אחרון חביב, זכור כי התקשרות לשיטת list_devices () היא איכשהו יקר, כך שאם אתה מעוניין רק במספר ה- GPUs הזמינים, התקשר לשיטה פעם אחת ואחסן את המספר שלהם במשתנה מקומי.

זהו זה! מקווה שמצאת שהרשימה הזו מועילה. אם מצאת גיצ'ות / טיפים אחרים להכשרה ב- GPU בנושא קרס, שתף אותם בהמשך בתגובות. 🙂

בול זמן:

עוד מ דטומבוקס