מדריך זה מדגים כיצד להשתמש בכלים הזמינים עם TensorFlow Profiler כדי לעקוב אחר הביצועים של דגמי TensorFlow שלך. תלמד כיצד להבין כיצד המודל שלך מתפקד במארח (CPU), במכשיר (GPU), או בשילוב של המארח והמכשיר(ים).
יצירת פרופילים עוזרת להבין את צריכת משאבי החומרה (זמן וזיכרון) של פעולות TensorFlow השונות (ops) במודל שלך ולפתור צווארי בקבוק בביצועים ובסופו של דבר לגרום למודל לפעול מהר יותר.
מדריך זה ידריך אותך כיצד להתקין את ה- Profiler, את הכלים השונים הזמינים, את המצבים השונים של האופן שבו ה- Profiler אוסף נתוני ביצועים, וכמה שיטות עבודה מומלצות מומלצות למיטוב ביצועי המודל.
אם אתה רוצה פרופיל ביצועי המודל שלך על ענן TPUs, עיין במדריך הענן TPU .
התקן את התנאים המוקדמים של Profiler ו-GPU
התקן את הפלאגין Profiler עבור TensorBoard עם pip. שימו לב שהפרופיל דורש את הגירסאות העדכניות ביותר של TensorFlow ו-TensorBoard (>=2.2).
pip install -U tensorboard_plugin_profile
כדי ליצור פרופיל ב-GPU, עליך:
- פגוש את הנהגים GPU NVIDIA® ודרישות Toolkit CUDA® הנסחרות דרישות תוכנה תמיכה TensorFlow GPU .
ודאו כלי פרופיל NVIDIA® CUDA® הממשק (CUPTI) מקיימים על הנתיב:
/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \ grep libcupti
אם אתה לא צריך CUPTI על השביל, שיתווסף ספריית ההתקנה שלה $LD_LIBRARY_PATH
משתנה הסביבה על ידי הפעלה:
export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
ואז, להפעיל את ldconfig
הפקודה הנ"ל שוב כדי לוודא כי הספרייה CUPTI נמצא.
פתרון בעיות הרשאות
כשמפעילים פרופילים עם Toolkit CUDA® בסביבה דוקר או על לינוקס, אתה עלול להיתקל בבעיות הקשורות הרשאות CUPTI מספיקות ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
). עבור אל Docs Developer NVIDIA כדי ללמוד עוד על איך אתה יכול לפתור בעיות אלה על לינוקס.
כדי לפתור בעיות הרשאות CUPTI בסביבת Docker, הפעל
docker run option '--privileged=true'
כלים לפרופילים
גש Profiler מן הכרטיסייה 'פרופיל TensorBoard, אשר מופיעה רק אחרי שצילמת כמה נתונים מודל.
ל-Profiler יש מבחר של כלים שיעזרו בניתוח ביצועים:
- דף סקירה כללית
- מנתח צינור קלט
- סטטיסטיקות TensorFlow
- Trace Viewer
- נתונים סטטיסטיים של ליבת GPU
- כלי פרופיל זיכרון
- Pod Viewer
דף סקירה כללית
דף הסקירה מספק תצוגה ברמה העליונה של הביצועים של המודל שלך במהלך ריצת פרופיל. הדף מציג לך דף סקירה מצטבר עבור המארח שלך וכל המכשירים, וכמה המלצות לשיפור ביצועי האימון שלך במודל. אתה יכול גם לבחור מארחים בודדים בתפריט הנפתח מארח.
דף הסקירה מציג נתונים באופן הבא:
סיכום ביצועים: הצגת סיכום ברמה גבוהה של ביצועי המודל שלך. סיכום הביצועים כולל שני חלקים:
פירוט זמן שלבים: מפרק את זמן הצעד הממוצע למספר קטגוריות של מקומות בילוי:
- קומפילציה: הזמן המושקע בקומפילציה של גרעינים.
- קלט: הזמן המושקע בקריאת נתוני קלט.
- פלט: הזמן המושקע בקריאת נתוני הפלט.
- השקת ליבה: זמן השקת המארח להפעלת גרעינים
- זמן חישוב מארח..
- זמן תקשורת בין מכשיר למכשיר.
- זמן חישוב במכשיר.
- כל השאר, כולל Python תקורה.
דיוק מחשוב במכשיר - מדווח על אחוז זמן החישוב של המכשיר המשתמש בחישובים של 16 ו-32 סיביות.
שלב אמת גרף: מציג גרף של זמן צעד התקן (באלפיות שנייה) מעל כל השלבים שנדגמו. כל שלב מחולק לקטגוריות מרובות (עם צבעים שונים) של המקום שבו הזמן מבלה. האזור האדום תואם לחלק מזמן הצעד שבו המכשירים ישבו ללא פעילות והמתינו לנתוני קלט מהמארח. האזור הירוק מראה כמה זמן המכשיר פעל בפועל.
Top 10 פעולות TensorFlow במכשיר (למשל GPU): מציג את ops על-מכשיר רץ הכי הרבה זמן.
כל שורה מציגה את הזמן העצמי של המבצע (כאחוז הזמן שלוקח כל המבצעים), זמן מצטבר, קטגוריה ושם.
הפעלת סביבה: מציג סיכום ברמה גבוהה של סביבת ריצת המודל כוללת:
- מספר המארחים בשימוש.
- סוג מכשיר (GPU/TPU).
- מספר ליבות המכשיר.
המלצה על הצעד הבא: דוחות כאשר המודל הוא כבול קלט וממליץ כלים שבהם ניתן להשתמש כדי לאתר צווארי בקבוק בביצועים מודל לפתור.
מנתח צינור קלט
כאשר תוכנת TensorFlow קוראת נתונים מקובץ היא מתחילה בחלק העליון של גרף TensorFlow בצורה צנרת. תהליך הקריאה מחולק למספר שלבי עיבוד נתונים המחוברים בסדרה, כאשר הפלט של שלב אחד הוא הקלט לשלב הבא. מערכת זו של נתונים שקראו נקראת צינור ההזנה.
צינור טיפוסי לקריאת רשומות מקבצים כולל את השלבים הבאים:
- קריאת קובץ.
- עיבוד מקדים של קבצים (אופציונלי).
- העברת קבצים מהמארח למכשיר.
צינור קלט לא יעיל יכול להאט מאוד את היישום שלך. יישום נחשב קלט מחויב כשזה מבלה חלק ניכר זמן בצנרת הקלט. השתמש בתובנות שהתקבלו מנתח צינור הקלט כדי להבין היכן צינור הקלט אינו יעיל.
מנתח צינור הקלט אומר לך מיד אם התוכנית שלך קשורה לקלט ומנחה אותך דרך ניתוח צד המכשיר והמארח כדי לאתר באגים בצווארי בקבוק בכל שלב בצינור הקלט.
עיין בהנחיות לגבי ביצועי צינור קלט לקבלת שיטות מומלצות מומלצות למיטוב צינורות קלט הנתונים שלך.
לוח מחוונים של צינור קלט
לפתיחת מנתח צינור ההזנה, בחר פרופיל, ולאחר מכן בחר input_pipeline_analyzer מתוך התפריט הנפתח כלים.
לוח המחוונים מכיל שלושה חלקים:
- סיכום: מסכם את צינור הזנה הכולל מידע על אם היישום שלך הוא כבול קלט, ואם כן, בכמה.
- ניתוח ההתקנים בצד: מציג המפורטים, תוצאות הניתוח בצד המכשיר, כולל הצעד פעמי למכשיר ואת טווח הזמן שבו המכשיר בילה מחכה נתוני הקלט ברחבי ליבות בכל שלב.
- ניתוח Host-לוואי: מופעי ניתוח מפורט בצד המארח, כולל פירוט של זמן עיבוד קלט במחשב המארח.
סיכום צינור קלט
סיכום מדווח אם התוכנית שלך היא קלט מחויב בהצגת אחוז הזמן שבו המכשיר בילה על המתנה לנתוני מהמארח. אם אתה משתמש בצינור קלט סטנדרטי שעבר מכשירים, הכלי מדווח היכן מושקע רוב זמן עיבוד הקלט.
ניתוח צד המכשיר
ניתוח צד המכשיר מספק תובנות לגבי זמן שהייה במכשיר לעומת המארח וכמה זמן המכשיר הושקע בהמתנה לנתוני קלט מהמארח.
- זמן שלב זממו נגד מספר שלבים: מציג גרף של זמן התקן צעד (באלפיות שנייה) מעל כל השלבים שנדגמו. כל שלב מחולק לקטגוריות מרובות (עם צבעים שונים) של המקום שבו הזמן מבלה. האזור האדום מתאים לחלק מזמן הצעד שבו המכשירים ישבו בטל והמתינו לנתוני קלט מהמארח. האזור הירוק מראה כמה מהזמן המכשיר פעל בפועל.
- נתונים סטטיסטיים בזמן שלב: דוחות סטיית הממוצע, התקן, וטווח ([מינימום, מקסימום]) של זמן צעד התקן.
ניתוח צד המארח
הניתוח המארח בצד מדווח פירוט של זמן עיבוד קלט (הזמן המושקע על tf.data
ops API) במארח למספר קטגוריות:
- קריאת נתונים מקבצים על פי דרישה: זמן בילה על קריאת נתונים מקבצים בלי במטמון, הכנה מקדימה, ו interleaving.
- קריאת נתונים מקבצים מראש: הזמן בילה בקריאת קבצים, כולל במטמון, הכנה מקדימה, ו interleaving.
- נתונים עיבוד מקדים: זמן בילה על ops עיבוד מקדים, כגון שחרור לחץ לתמונה.
- נתונים Enqueuing שיועברו למכשיר: זמן בילה לשים נתונים לתוך תור infeed לפני העברת נתונים למכשיר.
להרחיב סטטיסטיקות אופ קלטו לבדוק את הסטטיסטיקה עבור ops קלט מסוים ובקטגוריות שלהם בחלוקה לפי זמן ביצוע.
טבלת נתוני מקור תופיע עם כל ערך שמכיל את המידע הבא:
- אופ קלט: מראה את שם אופ TensorFlow של op קלט.
- מילים: מציג את המספר הכולל של מקרים של הוצאה להורג אופ בתקופת פרופיל.
- זמן כולל (ms): מציג את הסכום המצטבר של משך זמן על כל המקרים האלה.
- סה"כ זמן%: מציג את הזמן הכולל שהוצא על מאמר דעה כשבר של הזמן הכולל של הביקור בעיבוד קלט.
- סה"כ עצמי זמן (ב- ms): מציג את הסכום המצטבר של הזמן העצמי שמוקדש בכל המקרים האלה. הזמן העצמי כאן מודד את הזמן המושקע בתוך גוף הפונקציה, לא כולל את הזמן המושקע בפונקציה שהוא קורא.
- סה"כ עצמי זמן%. מציג את הזמן העצמי הכולל כשבריר מהזמן הכולל שהושקע בעיבוד קלט.
- קטגוריה. מציג את קטגוריית העיבוד של הקלט op.
נתונים סטטיסטיים של TensorFlow
הכלי TensorFlow Stats מציג את הביצועים של כל TensorFlow מבצע (op) שמתבצע במארח או במכשיר במהלך הפעלת פרופילים.
הכלי מציג מידע על ביצועים בשתי חלוניות:
החלונית העליונה מציגה עד ארבעה תרשימי עוגה:
- חלוקת זמן הביצוע העצמי של כל פעולה על המארח.
- חלוקת זמן הביצוע העצמי של כל סוג פעולה על המארח.
- חלוקת זמן הביצוע העצמי של כל פעולה במכשיר.
- התפלגות זמן הביצוע העצמי של כל סוג פעולה במכשיר.
החלונית התחתונה מציגה טבלה המדווחת על נתונים על פעולות TensorFlow עם שורה אחת עבור כל פעולה ועמודה אחת עבור כל סוג של נתונים (מיין עמודות על ידי לחיצה על כותרת העמודה). לחץ על הכפתור ייצא כ- CSV בצד ימין של חלונית העליון כדי לייצא את הנתונים מטבלה זו כקובץ CSV.
ציין זאת:
אם למבצעים מסוימים יש אופציות ילדים:
- הזמן ה"נצבר" הכולל של ניתוח כולל את הזמן המושקע בתוך המבצעים של הילד.
- הזמן ה"עצמי" הכולל של ניתוח אינו כולל את זמן השהות בתוך ניתוח הילד.
אם פועל על המארח:
- האחוז מסך הזמן העצמי במכשיר שנגרם על ידי ההפעלה יהיה 0.
- האחוז המצטבר מהזמן העצמי הכולל במכשיר עד וכולל פעולה זו יהיה 0.
אם מבצעים פעולה במכשיר:
- האחוז מסך הזמן העצמי על המארח שייגרם על ידי מבצע זה יהיה 0.
- האחוז המצטבר של הזמן העצמי הכולל במארח עד וכולל פעולה זו יהיה 0.
אתה יכול לבחור לכלול או לא לכלול זמן סרק בתרשימים ובטבלה.
צופה עקבות
מציג המעקב מציג ציר זמן המציג:
- משך הזמן של הפעולות שבוצעו על ידי מודל TensorFlow שלך
- איזה חלק של המערכת (מארח או מכשיר) הוציא לפעולה. בדרך כלל, המארח מבצע פעולות קלט, מעבד מראש נתוני אימון ומעביר אותם למכשיר, בעוד שהמכשיר מבצע את אימון המודל בפועל
מציג המעקב מאפשר לך לזהות בעיות ביצועים במודל שלך, ולאחר מכן לנקוט בצעדים כדי לפתור אותן. לדוגמה, ברמה גבוהה, אתה יכול לזהות אם אימון קלט או מודל לוקח את רוב הזמן. בקידוח למטה, אתה יכול לזהות אילו פעולות לוקח הכי הרבה זמן לבצע. שימו לב שצופה המעקב מוגבל למיליון אירועים לכל מכשיר.
מעקב אחר ממשק הצופה
כאשר אתה פותח את מציג המעקב, הוא מופיע עם ההפעלה האחרונה שלך:
מסך זה מכיל את המרכיבים העיקריים הבאים:
- בחלונית Timeline: מופעים ops כי המכשיר המארח להורג לאורך זמן.
- בחלונית פרטים: מידע נוסף מופעים עבור ops הנבחר בחלונית Timeline.
חלונית ציר הזמן מכילה את הרכיבים הבאים:
- בסרגל העליון: מכיל פקדים עזר שונים.
- ציר זמן: מופעי זמן ביחס לתחילת העקבות.
- סעיף ותוויות המסלול: כל קטע מכיל מספר רב של מסלולים ויש לו משולש מצד שמאל שאתה יכול ללחוץ כדי להרחיב ולכווץ את הקטע. יש סעיף אחד לכל רכיב עיבוד במערכת.
- בורר כלי: מכיל כלים שונים עבור אינטראקציה עם הצופה עקבות כגון זום, פאן, בחר, ותזמון. השתמש בכלי התזמון כדי לסמן מרווח זמן.
- אירועים: אלה מראים את הזמן שבמהלכו אופ הוצא להורג או את המשך-אירועים מטא, כגון צעדי אימונים.
קטעים ומסלולים
מציג המעקבים מכיל את הסעיפים הבאים:
- סעיף אחת עבור כל צומת התקן, שכותרתו עם מספר השבב למכשיר ואת הצומת המכשיר בתוך שבב (למשל,
/device:GPU:0 (pid 0)
). כל קטע של צומת מכשיר מכיל את הרצועות הבאות:- שלב: מציג את משך הצעדים הכשרים שפעלו על המכשיר
- Ops TensorFlow: מראה את ops להורג על המכשיר
- Ops XLA: מופעים XLA פעולות (ops) רץ על המכשיר אם XLA הוא המהדר בשימוש (כל אופ TensorFlow מתורגם ops XLA אחד או מספר למהדר XLA מתרגמת את ops XLA לקוד שרץ על המכשיר.).
- מדור אחד הנושאים לרוץ על המעבד של המחשב המארח, שכותרתו "חוטים Host". הקטע מכיל רצועה אחת עבור כל פתיל CPU. שים לב שאתה יכול להתעלם מהמידע המוצג לצד תוויות הסעיפים.
אירועים
אירועים בתוך ציר הזמן מוצגים בצבעים שונים; לצבעים עצמם אין משמעות ספציפית.
מציג המעקבים יכול גם להציג עקבות של קריאות לפונקציות Python בתוכנית TensorFlow שלך. אם אתה משתמש tf.profiler.experimental.start
API, אתה יכול לאפשר Python התחקות על ידי שימוש ProfilerOptions
namedtuple כאשר מתחיל יצירת פרופיל. לחלופין, אם אתה משתמש במצב הדגימה לאפיון, אתה יכול לבחור את רמת התחקות על ידי שימוש באפשרויות הנפתחת ב השיח בפרופיל הלכיד.
נתונים סטטיסטיים של ליבת GPU
כלי זה מציג נתונים סטטיסטיים של ביצועים והאופציה המקורית עבור כל ליבה מואצת של GPU.
הכלי מציג מידע בשתי חלוניות:
החלונית העליונה מציגה תרשים עוגה המציג את גרעיני ה-CUDA בעלי הזמן הכולל הגבוה ביותר שחלף.
החלונית התחתונה מציגה טבלה עם הנתונים הבאים עבור כל זוג קרנל-op ייחודי:
- דירוג בסדר יורד של משך ה-GPU הכולל שחלף, מקובץ לפי זוג קרנל-op.
- שם הקרנל שהושק.
- מספר אוגרי GPU בשימוש על ידי הליבה.
- הגודל הכולל של זיכרון משותף (סטטי + דינמי משותף) בשימוש בבתים.
- ממד הבלוק מבוטא
blockDim.x, blockDim.y, blockDim.z
. - מידות הרשת מבוטאות
gridDim.x, gridDim.y, gridDim.z
. - בין אם op כשיר לשימוש ליבות מותחות .
- האם הקרנל מכיל הוראות Tensor Core.
- שם האופציה שהשיקה את הגרעין הזה.
- מספר המופעים של זוג קרנל-op זה.
- הזמן הכולל שחלף ב-GPU במיקרו-שניות.
- זמן ה-GPU הממוצע שחלף במיקרו-שניות.
- זמן ה-GPU המינימלי שחלף במיקרו-שניות.
- זמן ה-GPU המקסימלי שחלף במיקרו-שניות.
כלי פרופיל זיכרון
מפקח הכלי בפרופיל זיכרון השימוש בזיכרון של המכשיר במהלך הפסקת הפרופיל. אתה יכול להשתמש בכלי זה כדי:
- נפה באגים בבעיות מחוץ לזיכרון (OOM) על ידי איתור שיא השימוש בזיכרון והקצאת הזיכרון המתאימה למבצעי TensorFlow. ניתן גם באגים בעיות Oom שעלולות להתעורר כאשר אתה מפעיל ריבוי משתמשים היקש.
- ניפוי באגים של פיצול זיכרון.
כלי פרופיל הזיכרון מציג נתונים בשלושה חלקים:
- סיכום פרופיל זיכרון
- זיכרון ציר זמן גרף
- טבלת פירוט זיכרון
סיכום פרופיל הזיכרון
סעיף זה מציג סיכום ברמה גבוהה של פרופיל הזיכרון של תוכנית TensorFlow שלך כפי שמוצג להלן:
לסיכום פרופיל הזיכרון יש שישה שדות:
- מזהה זיכרון: נפתחת אשר מפרט את כל מערכות זיכרון המכשיר זמין. בחר את מערכת הזיכרון שברצונך להציג מהתפריט הנפתח.
- #Allocation: מספר הקצאות זיכרון שבוצעו במהלך מרווח הפרופיל.
- #Deallocation: מספר deallocations זיכרון בקטע פרופילים
- קיבולת זיכרון: הקיבולת הכוללת (ב gibs) של מערכת הזיכרון שבחרת.
- שיא בצריכת החשמל היפ: השימוש בזיכרון השיא (ב gibs) מאז המודל התחיל לרוץ.
- שימוש בזיכרון שיא: השימוש בזיכרון השיא (ב gibs) במרווח פרופיל. שדה זה מכיל את שדות המשנה הבאים:
- חותם זמן: חותמת הזמן של מועד את השימוש בזיכרון השיא התרחש על גרף ציר הזמן.
- הזמנת סטאק: כמות זיכרון שמור על הערימה (ב gibs).
- הקצאת היפ: כמות הזיכרון מוקצה על הערימה (ב gibs).
- חינם זיכרון: כמות זיכרון פנוי (ב gibs). קיבולת הזיכרון היא הסכום הכולל של שמירת המחסנית, הקצאת הערימה והזיכרון הפנוי.
- פיצול: אחוז הפיצול (נמוך עדיף). זה מחושב כאחוז
(1 - Size of the largest chunk of free memory / Total free memory)
.
גרף ציר זמן זיכרון
סעיף זה מציג עלילה של השימוש בזיכרון (ב-GiBs) ואחוז הפיצול מול זמן (ב-ms).
ציר ה-X מייצג את ציר הזמן (ב-ms) של מרווח הפרופיל. ציר ה-Y משמאל מייצג את השימוש בזיכרון (ב-GiBs) וציר ה-Y מימין מייצג את אחוז הפיצול. בכל נקודת זמן על ציר ה-X, הזיכרון הכולל מתחלק לשלוש קטגוריות: מחסנית (באדום), ערימה (בכתום) וחופשית (בירוק). העבר את העכבר מעל חותמת זמן ספציפית כדי להציג את הפרטים על אירועי הקצאת/ביטול ההקצאה של זיכרון באותה נקודה כמו להלן:
החלון המוקפץ מציג את המידע הבא:
- חותמת (ms): מיקומו של האירוע שנבחר על ציר הזמן.
- אירוע: סוג האירוע (הקצאה או deallocation).
- requested_size (gibs): כמות הזיכרון מבוקשת. זה יהיה מספר שלילי עבור אירועי ביטול ההקצאה.
- allocation_size (gibs): הסכום בפועל של זיכרון שהוקצה. זה יהיה מספר שלילי עבור אירועי ביטול ההקצאה.
- tf_op: אופ TensorFlow כי בקשות להקצאה / deallocation.
- step_id: צעד האימונים שבה אירוע זה התרחש.
- REGION_TYPE: סוג ישות נתון בזיכרון המוקצה הזה מיועד. ערכים אפשריים הם
temp
עבור temporaries,output
עבור הפעלות והדרגות, וכןpersist
/dynamic
עבור משקולות וקבוע. - DATA_TYPE: סוג האלמנט המותח (למשל, uint8 עבור שלם 8 סיבי חתום).
- tensor_shape: הצורה מותח להיות מוקצה / deallocated.
- memory_in_use (gibs): זיכרון הכולל שנמצא בשימוש בשלב זה של הזמן.
טבלת פירוט זיכרון
טבלה זו מציגה את הקצאות הזיכרון הפעילות בנקודת שיא השימוש בזיכרון במרווח הפרופיל.
יש שורה אחת לכל TensorFlow Op ולכל שורה יש את העמודות הבאות:
- אופ שם: השם של op TensorFlow.
- גודל הקצאה (gibs): הסכום הכולל של זיכרון שהוקצה op זה.
- גודל מבוקש (gibs): הסכום הכולל של זיכרון המבוקש עבור op זה.
- מופעים: מספר הקצאות op זה.
- סוג אזור: סוג ישות נתונים שזיכרון זה מוקצה הוא. ערכים אפשריים הם
temp
עבור temporaries,output
עבור הפעלות והדרגות, וכןpersist
/dynamic
עבור משקולות וקבוע. - סוג נתונים: סוג האלמנט המותח.
- Shape: הצורה של טנזורים המוקצה.
מציג פוד
הכלי Pod Viewer מציג את פירוט שלב ההדרכה על פני כל העובדים.
- בחלונית העליונה יש מחוון לבחירת מספר הצעד.
- החלונית התחתונה מציגה תרשים עמודות מוערם. זוהי תצוגה ברמה גבוהה של קטגוריות מפורקות של זמן-שלב הממוקמות זו על גבי זו. כל עמודה מוערמת מייצגת עובד ייחודי.
- כאשר אתה מרחף מעל עמודה מוערמת, הכרטיס בצד שמאל מציג פרטים נוספים על פירוט השלבים.
ניתוח צוואר בקבוק של tf.data
tf.data
כלי ניתוח צוואר הבקבוק מזהים אוטומטית צווארי בקבוק tf.data
צינורות הזנה בתכנית שלך ומספקים המלצות על איך לתקן אותם. זה עובד עם כל תוכנית באמצעות tf.data
קשר לפלטפורמה (CPU / GPU / TPU). הניתוח וההמלצות שלה מבוססים על זה מדריך .
הוא מזהה צוואר בקבוק על ידי ביצוע השלבים הבאים:
- מצא את המארח הכי קשור לקלט.
- מצא הביצוע האיטי ביותר של
tf.data
צינור הזנה. - שחזר את גרף צינור הקלט ממעקב הפרופיל.
- מצא את הנתיב הקריטי בגרף צינור הקלט.
- זהה את הטרנספורמציה האיטית ביותר בנתיב הקריטי כצוואר בקבוק.
ממשק המשתמש מחולק לשלושה חלקים: סיכום ניתוח ביצועים, סיכום של כל קלט צינורות קלט צינור גרף.
סיכום ניתוח ביצועים
חלק זה מספק את סיכום הניתוח. הוא מדווח על איטיות tf.data
צינורות הזנה זוהו הפרופיל. סעיף זה מציג גם את המארח המקושר ביותר לקלט ואת צינור הקלט האיטי ביותר שלו עם השהיה המקסימלית. והכי חשוב, הוא מזהה איזה חלק בצינור הקלט הוא צוואר הבקבוק וכיצד לתקן אותו. מידע צוואר הבקבוק מסופק עם סוג האיטרטור ושמו הארוך.
כיצד לקרוא את השם הארוך של tf.data iterator
שם ארוך מעוצב כמו Iterator::<Dataset_1>::...::<Dataset_n>
. בשם רב, <Dataset_n>
שמתאים לסוג iterator ואת מערכי נתונים אחרים בשם ארוך מייצגים טרנספורמציות במורד הזרם.
לדוגמה, שקול את מערך הנתונים הבא של צינור הקלט:
dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)
השמות הארוכים של האיטרטורים ממערך הנתונים שלמעלה יהיו:
סוג איטרטור | שם ארוך |
---|---|
טווח | איטרטור::אצווה::חזרה::מפה::טווח |
מַפָּה | Iterator::אצווה::Repeat::Map |
חזור | איטרטור::אצווה::חזור |
קבוצה | Iterator::אצווה |
סיכום כל צינורות הקלט
סעיף זה מספק את הסיכום של כל צינורות הקלט בכל המארחים. בדרך כלל יש צינור קלט אחד. בעת שימוש אסטרטגיית ההפצה, יש צינור הזנת מארח אחד מפעיל את התכנית tf.data
קוד וצינורות קלט התקן מרובים יחזרו נתונים מצינור ההזנה המארח והעברתה המכשירים.
עבור כל צינור קלט, הוא מציג את הסטטיסטיקה של זמן הביצוע שלו. שיחה נספרת כאיטית אם היא נמשכת יותר מ-50 מיקרומטר שניות.
גרף צינור קלט
סעיף זה מציג את גרף צינור הקלט עם מידע זמן הביצוע. אתה יכול להשתמש ב-"Host" ו-"Input Pipeline" כדי לבחור איזה מארח וצינור קלט לראות. הוצאות להורג של צינור הזנה מסודרים על ידי זמן הביצוע בסדר יורד שבו אתה יכול לבחור בעזרת התפריט הנפתח דרגה.
לצמתים בנתיב הקריטי יש קווי מתאר מודגשים. לצוואר הבקבוק, שהוא הצומת עם הזמן העצמי הארוך ביותר בנתיב הקריטי, יש קו מתאר אדום. שאר הצמתים הלא קריטיים כוללים קווי מתאר מקווקו אפורים.
בכל צומת, שעת התחלה מציין את שעת ההתחלה של ביצוע. באותו הצומת ניתן לחתום מספר פעמים, למשל, אם יש Batch
אופ בצנרת קלט. אם הוא מבוצע מספר פעמים, זוהי שעת ההתחלה של הביצוע הראשון.
סה"כ משך הזמן קיר ההוצאה להורג. אם הוא מבוצע מספר פעמים, זהו סכום זמני הקיר של כל הביצועים.
Self זמן הוא סה"כ זמן ללא זמן חפף עם בלוטות הילד מיידיות.
"# שיחות" הוא מספר הפעמים שצינור הקלט מבוצע.
איסוף נתוני ביצועים
TensorFlow Profiler אוסף פעילויות מארח ועקבות GPU של דגם TensorFlow שלך. אתה יכול להגדיר את Profiler לאסוף נתוני ביצועים דרך המצב התוכנותי או מצב הדגימה.
ממשקי API ליצירת פרופילים
אתה יכול להשתמש בממשקי ה-API הבאים כדי לבצע פרופילים.
מצב תוכניתית באמצעות Callback TensorBoard Keras (
tf.keras.callbacks.TensorBoard
)# Profile from batches 10 to 15 tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, profile_batch='10, 15') # Train the model and use the TensorBoard Keras callback to collect # performance profiling data model.fit(train_data, steps_per_epoch=20, epochs=5, callbacks=[tb_callback])
מצב תוכניתית באמצעות
tf.profiler
API פונקציהtf.profiler.experimental.start('logdir') # Train the model here tf.profiler.experimental.stop()
מצב פרוגרמטי באמצעות מנהל ההקשרים
with tf.profiler.experimental.Profile('logdir'): # Train the model here pass
דגימת מצב: בצע על פי דרישת פרופילים באמצעות
tf.profiler.experimental.server.start
להתחיל בשרת gRPC עם ריצת דגם TensorFlow שלך. לאחר הפעלת שרת gRPC והפעלת המודל שלך, אתה יכול ללכוד פרופיל דרך הכפתור בפרופיל הלכיד ב plugin פרופיל TensorBoard. השתמש בסקריפט בסעיף התקנת פרופיל למעלה כדי להפעיל מופע TensorBoard אם הוא עדיין לא פועל.לדוגמא,
# Start a profiler server before your model runs. tf.profiler.experimental.server.start(6009) # (Model code goes here). # Send a request to the profiler server to collect a trace of your model. tf.profiler.experimental.client.trace('grpc://localhost:6009', 'gs://your_tb_logdir', 2000)
דוגמה ליצירת פרופיל של מספר עובדים:
# E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you # would like to profile for a duration of 2 seconds. tf.profiler.experimental.client.trace( 'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466', 'gs://your_tb_logdir', 2000)
השתמש שיח בפרופיל הלכיד לציין:
- רשימה מופרדת בפסיקים של כתובות URL של שירותי פרופיל או שמות TPU.
- משך פרופיל.
- רמת מעקב אחר שיחות מכשיר, מארח ופונקציית Python.
- כמה פעמים אתה רוצה ש-Profiler ינסה שוב ללכוד פרופילים אם לא יצליח בהתחלה.
יצירת פרופילים של לולאות אימון מותאמות אישית
לפרופיל לולאות אימון מותאם אישית בקוד TensorFlow שלך, מכשיר הלולאה אימונים עם tf.profiler.experimental.Trace
API כדי לסמן את גבולות צעד עבור Profiler.
name
הטיעון משמש כקידומת עבור שמות הצעד, את step_num
טיעון המילה מצורף בשמות הצעד, ואת _r
טיעון המילה עושה אירוע העקבות הזה עובר עיבוד כאירוע צעד ידי Profiler.
לדוגמא,
for step in range(NUM_STEPS):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_data = next(dataset)
train_step(train_data)
זה יאפשר את ניתוח הביצועים המבוסס על שלבים של Profiler ויגרום לאירועי הצעד להופיע במציג המעקב.
ודא כי אתה כולל את iterator הנתונים בתוך tf.profiler.experimental.Trace
בהקשר לניתוח מדויק של צינור הזנה.
קטע הקוד שלהלן הוא אנטי דפוס:
for step, train_data in enumerate(dataset):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_step(train_data)
מקרי שימוש בפרופיל
הפרופיל מכסה מספר מקרי שימוש לאורך ארבעה צירים שונים. חלק מהשילובים נתמכים כעת ואחרים יתווספו בעתיד. חלק ממקרי השימוש הם:
- לעומת מקומי מרחוק פרופיל: אלו הם שתי דרכים נפוצות של הקמת סביבת הפרופיל שלך. ביצירת פרופיל מקומי, ממשק ה-API של הפרופיל נקרא באותו מכונה שהדגם שלך מפעיל, למשל, תחנת עבודה מקומית עם GPUs. ביצירת פרופילים מרחוק, ממשק ה-API לפרופילים נקרא במכונה אחרת מהמקום שבו המודל שלך מבצע, למשל, ב-Cloud TPU.
- בניית פרופיל עובדים רבים: ניתן פרופיל מכונות מרובות בעת השימוש ביכולות אימון המופצת של TensorFlow.
- פלטפורמת חומרה: מעבד בפרופיל, GPUs, ו TPUs.
הטבלה שלהלן מספקת סקירה מהירה של מקרי השימוש הנתמכים ב-TensorFlow שהוזכרו לעיל:
API לפרופילים | מְקוֹמִי | מְרוּחָק | מספר עובדים | פלטפורמות חומרה |
---|---|---|---|---|
TensorBoard Keras Callback | נתמך | אינו נתמך | אינו נתמך | מעבד, GPU |
tf.profiler.experimental Start / Stop API | נתמך | אינו נתמך | אינו נתמך | מעבד, GPU |
tf.profiler.experimental client.trace API | נתמך | נתמך | נתמך | מעבד, GPU, TPU |
ממשק API של מנהל הקשר | נתמך | אינו נתמך | אינו נתמך | מעבד, GPU |
שיטות עבודה מומלצות לביצועי מודל מיטביים
השתמש בהמלצות הבאות בהתאם לדגמי TensorFlow שלך כדי להשיג ביצועים מיטביים.
באופן כללי, בצע את כל השינויים במכשיר וודא שאתה משתמש בגרסה התואמת האחרונה של ספריות כמו cuDNN ו-Intel MKL עבור הפלטפורמה שלך.
בצע אופטימיזציה של צינור נתוני הקלט
השתמש בנתונים מה-[#input_pipeline_analyzer] כדי לייעל את צינור קלט הנתונים שלך. צינור קלט נתונים יעיל יכול לשפר באופן דרסטי את מהירות ביצוע המודל שלך על ידי הפחתת זמן סרק המכשיר. נסו לשלב את שיטות העבודה המומלצות המפורטות ביצועים טובים יותר עם ה- API tf.data מדריך ומתחת לעשות צינור הזנה הנתונים שלך יעיל יותר.
באופן כללי, הקבילה של כל פעולות שאין צורך לבצע ברצף יכולה לייעל באופן משמעותי את צינור קלט הנתונים.
במקרים רבים, זה עוזר לשנות את הסדר של כמה שיחות או לכוון את הטיעונים כך שיעבדו בצורה הטובה ביותר עבור הדגם שלך. תוך כדי אופטימיזציה של צינור נתוני הקלט, השוואת רק את מטעין הנתונים ללא שלבי ההדרכה וההפצה לאחור כדי לכמת את השפעת האופטימיזציות באופן עצמאי.
נסה להפעיל את המודל שלך עם נתונים סינתטיים כדי לבדוק אם צינור הקלט הוא צוואר בקבוק ביצועים.
השתמש
tf.data.Dataset.shard
להכשרה רב GPU. הקפד לרסיס מוקדם מאוד בלולאת הקלט כדי למנוע הפחתה בתפוקה. כשאתה עובד עם TFRecords, ודא שאתה מפציץ את רשימת ה-TFRecords ולא את התוכן של TFRecords.טען במקביל בכמה ops ידי קביעת הערך הדינמי של
num_parallel_calls
באמצעותtf.data.AUTOTUNE
.שקול להגביל את השימוש של
tf.data.Dataset.from_generator
כפי שהוא איטי יותר בהשוואה ops TensorFlow טהור.שקול להגביל את השימוש של
tf.py_function
כפי שהוא לא יכול להיות בהמשכים ואינה נתמכת לרוץ TensorFlow מופץ.השתמש
tf.data.Options
לשלוט אופטימיזציות סטטי צינור הזנה.
כמו כן קרא את tf.data
ניתוח ביצועי המדריך לקבלת הנחיות נוספות על אופטימיזציה צינור ההזנה שלך.
בצע אופטימיזציה של הגדלת נתונים
כאשר עובדים עם נתוני התמונה, להפוך את הגדלת נתונים יעיל יותר על ידי הטלת כדי סוגי נתונים שונים לאחר החלת השינויים המרחביים, כגון מרפרף, חיתוך, סיבוב, וכו '
השתמש ב-NVIDIA® DALI
במקרים מסוימים, כגון כאשר יש לך מערכת עם יחס GPU למעבד גבוה, ייתכן שכל האופטימיזציות לעיל לא יספיקו כדי לבטל צווארי בקבוק בטעינת הנתונים שנגרמו עקב מגבלות של מחזורי CPU.
אם אתה משתמש NVIDIA® GPUs עבור ראייה ממוחשבת ויישומים למידה עמוקים אודיו, שקול להשתמש בטעינת נתון הספרייה ( DALI ) כדי להאיץ את צינור הנתונים.
בדוק את NVIDIA® DALI: תפעול בתיעוד רשימת ops DALI נתמך.
השתמש בהברגה ובביצוע מקביל
Ops לרוץ על הנושאים CPU מרובים עם tf.config.threading
API לבצע אותם מהר.
TensorFlow מגדיר אוטומטית את מספר השרשורים המקבילים כברירת מחדל. מאגר השרשורים הזמין להפעלת TensorFlow ops תלוי במספר שרשורי המעבד הזמינים.
שליטת ההאצה במקביל מקסימלית עבור אופ יחיד באמצעות tf.config.threading.set_intra_op_parallelism_threads
. שימו לב שאם תפעילו מספר פעולות במקביל, כולם ישתפו את מאגר השרשורים הזמין.
אם יש לך ops עצמאית חסימת אי (ops ללא נתיב ביים ביניהם על הגרף), שימוש tf.config.threading.set_inter_op_parallelism_threads
להריץ אותם במקביל להשתמש בבריכה חוט זמין.
שונות
כאשר עובדים עם מודלים קטנים על GPUs NVIDIA®, אתה יכול להגדיר tf.compat.v1.ConfigProto.force_gpu_compatible=True
לכפות כל tensors CPU שיוקצו עם זיכרון CUDA מוצמד לתת דחיפה משמעותית בביצועים מודל. עם זאת, היזהר בעת השימוש באפשרות זו עבור דגמים לא ידועים/גדולים מאוד מכיוון שהדבר עלול להשפיע לרעה על ביצועי המארח (CPU).
שפר את ביצועי המכשיר
בצע את שיטות העבודה המומלצות המפורטות כאן וגם מדריך מיטוב ביצועי GPU לבצע אופטימיזציה על-מכשיר ביצועי מודל TensorFlow.
אם אתה משתמש ב-NVIDIA GPUs, רישום את ה-GPU ואת ניצול הזיכרון לקובץ CSV על ידי הפעלת:
nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv
הגדר פריסת נתונים
כאשר עובדים עם נתונים המכילים מידע על ערוצים (כמו תמונות), בצע אופטימיזציה של פורמט פריסת הנתונים כדי להעדיף את הערוצים האחרונים (NHWC על פני NCHW).
ערוץ-אחרוני פורמטי נתונים לשפר מותח Core ניצול ולספק שיפורי ביצועים משמעותיים במיוחד מודלי קונבולוציה כאשר מצמידים עם AMP. ניתן עדיין להפעיל פריסות נתונים של NCHW על ידי Tensor Cores, אך מציגים תקורה נוספת עקב פעולות טרנספוזיציה אוטומטיות.
אתה יכול לייעל את פריסת הנתונים להעדיף פריסות NHWC ידי הגדרת data_format="channels_last"
עבור שכבות כגון tf.keras.layers.Conv2D
, tf.keras.layers.Conv3D
, ו tf.keras.layers.RandomRotation
.
השתמש tf.keras.backend.set_image_data_format
להגדיר את פורמט פריסת נתוני ברירת מחדל עבור ה- API backend Keras.
למקסם את המטמון L2
When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.
import ctypes
_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128
Configure GPU thread usage
The GPU thread mode decides how GPU threads are used.
Set the thread mode to gpu_private
to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.
import os
os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'
Configure GPU memory options
In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.
Also, use tf.config.experimental.set_memory_growth
to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.
To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.
Miscellaneous
Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.
Disable reporting OOM errors during tensor allocation in production code. Set
report_tensor_allocations_upon_oom=False
intf.compat.v1.RunOptions
.For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.
Use TF Stats to find out how efficiently on-device ops run.
Use
tf.function
to perform computations and optionally, enable thejit_compile=True
flag (tf.function(jit_compile=True
). To learn more, go to Use XLA tf.function .Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.
Keep the device compute units busy.
Send data to multiple devices in parallel.
Consider using 16-bit numerical representations , such as
fp16
—the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.
Additional resources
- The TensorFlow Profiler: Profile model performance tutorial with Keras and TensorBoard where you can apply the advice in this guide.
- The Performance profiling in TensorFlow 2 talk from the TensorFlow Dev Summit 2020.
- The TensorFlow Profiler demo from the TensorFlow Dev Summit 2020.
Known limitations
Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3
TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace
API.
CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1
and libcupti.so.10.1
:
sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1