זמן הריצה של TensorFlow שעבר אופטימיזציה מבצע אופטימיזציה של מודלים כדי להסיק מסקנות מהר יותר ובעלות נמוכה יותר בהשוואה לקונטיינרים מוכנים מראש של TensorFlow Serving שמבוססים על קוד פתוח. זמן הריצה האופטימלי של TensorFlow עושה זאת באמצעות טכנולוגיות קנייניות וטכנולוגיות בקוד פתוח של Google.
ככל שמודל למידת מכונה (ML) גדול יותר, כך עלות השימוש בו גבוהה יותר. עם זמן הריצה המותאם של TensorFlow, העלות של הצגת מודל למידת המכונה והמהירות של ההסקה יכולות להיות נמוכות יותר בהשוואה לשימוש בזמן ריצה של TensorFlow שמבוסס על קוד פתוח. כדי ליהנות מ-TensorFlow runtime שעבר אופטימיזציה כשמשתמשים ב-Vertex AI, לא צריך לשנות את הקוד. במקום זאת, בוחרים קובץ אימג' של קונטיינר להצגת מודעות שמשתמש בו.
זמן הריצה של TensorFlow שעבר אופטימיזציה תואם לאחור למאגרי TensorFlow Serving מוכנים מראש. אם אתם מפעילים מודלים של TensorFlow עם קונטיינר מוכן מראש, אתם יכולים לעבור לקונטיינר של זמן ריצה אופטימלי של TensorFlow במאמץ מינימלי.
הביצועים של המודל משתפרים כשמשתמשים ב-TensorFlow runtime שעבר אופטימיזציה, אבל צריך לצפות לכך שההשפעה על הביצועים תהיה שונה בסוגים שונים של מודלים.
סקירה כללית על זמן ריצה של TensorFlow שעבר אופטימיזציה
זמן הריצה של TensorFlow שעבר אופטימיזציה משתמש באופטימיזציות של מודלים ובטכנולוגיות קנייניות חדשות של Google כדי לשפר את המהירות ולהפחית את העלות של הסקת מסקנות בהשוואה לקונטיינרים מוכנים מראש של TensorFlow Serving שמבוססים על קוד פתוח.
האופטימיזציה מתבצעת כש-Vertex AI מעלה מודל, לפני שהוא מופעל. אחרי שפורסים מודל לנקודת קצה, יומן האופטימיזציה מתווסף ליומן ההסקה. אפשר להשתמש ביומנים האלה כדי לפתור בעיות שעלולות להתרחש במהלך האופטימיזציה.
בנושאים הבאים מוסבר על שיפורים באופטימיזציה של זמן הריצה של TensorFlow שעבר אופטימיזציה.
אופטימיזציות של המודל
האופטימיזציות הבאות של המודלים כלולות בסביבת זמן הריצה האופטימלית של TensorFlow.
קומפילציה מראש של Model XLA
כשמריצים מודל TensorFlow, כל הפעולות מורצות בנפרד. יש תקורה קטנה כשמריצים פעולות בודדות. זמן הריצה האופטימלי של TensorFlow יכול להסיר חלק מהתקורה הזו באמצעות XLA כדי לבצע קומפילציה מראש של כל הגרף של TensorFlow או חלק ממנו לקרנלים גדולים יותר.
הקומפילציה מראש של מודל XLA היא אופציונלית ומושבתת כברירת מחדל. במאמר הפעלת קומפילציה מראש של מודל XLA מוסבר איך להפעיל קומפילציה מראש של מודל XLA במהלך פריסה.
אופטימיזציות של דחיסת מודלים
זמן הריצה האופטימלי של TensorFlow יכול להריץ חלק מהמודלים מהר יותר עם השפעה קטנה על הדיוק של המודל, וכך לאפשר אופטימיזציה של דחיסת המודל. כשמפעילים אופטימיזציה של דחיסת מודלים, סביבת זמן הריצה האופטימלית של TensorFlow משתמשת בטכניקות כמו קוונטיזציה וגיזום משקלים כדי להריץ מודלים מהר יותר.
התכונה לביצוע אופטימיזציה של דחיסת מודלים מושבתת כברירת מחדל. במאמר הפעלה של אופטימיזציה של דחיסת מודלים מוסבר איך להפעיל אופטימיזציה של דחיסת מודלים במהלך פריסה.
שיפור הביצועים של מודלים טבלאיים ב-GPU
מודלים טבלאיים של TensorFlow בדרך כלל מופעלים במעבדי CPU כי הם לא יכולים להשתמש במאיצים בצורה יעילה. סביבת זמן הריצה האופטימלית של TensorFlow פותרת את הבעיה הזו על ידי הפעלת חלקים יקרים מבחינת חישובים במודל ב-GPU. שאר המודל פועל במעבדי CPU על ידי מזעור התקשורת בין המארח למאיץ. הפעלת החלקים היקרים של המודל במעבדים גרפיים (GPU) והשאר במעבדים (CPU) מאפשרת להציג מודלים טבלאיים מהר יותר ובעלות נמוכה יותר.
זמן הריצה האופטימלי של TensorFlow מבצע אופטימיזציה להצגת סוגי המודלים הטבלאיים הבאים.
אופטימיזציה אוטומטית של מודלים ל-Cloud TPU
הקונטיינרים המובנים מראש של TensorFlow runtime שעברו אופטימיזציה ותומכים ב-Cloud TPU יכולים לבצע חלוקה לאזורים ואופטימיזציה של המודלים באופן אוטומטי כדי להריץ אותם ב-TPU. מידע נוסף זמין במאמר פריסה ב-Cloud TPU.
שימוש בסביבת זמן הריצה של TensorFlow (TFRT)
זמן הריצה של TensorFlow שעבר אופטימיזציה יכול להשתמש בזמן הריצה של TensorFlow (TFRT). הספרייה TFRT משתמשת ביעילות במעבדי CPU של המארח עם ריבוי תהליכים, תומכת במודלים של תכנות אסינכרוני ועברה אופטימיזציה ליעילות ברמה נמוכה.
ה-CPU של TFRT מופעל בכל קובצי האימג' של קונטיינרים של זמן ריצה של TensorFlow שעברו אופטימיזציה, למעט גרסה 2.8. כדי להשבית את ה-CPU של TFRT, מגדירים את הדגל use_tfrt לערך false.
ה-GPU של TFRT זמין בקובצי אימג' של קונטיינרים של TensorFlow runtime GPU שעברו אופטימיזציה ומתעדכנים מדי לילה, ובקובצי אימג' של קונטיינרים של TensorFlow runtime GPU שעברו אופטימיזציה בגרסה 2.13 ואילך. כדי להפעיל את ה-GPU של TFRT, מגדירים את הדגלים use_tfrt ו-allow_precompilation לערך true.
TFRT בקובץ אימג' של קונטיינר של GPU ממזערת את התקורה של העברת נתונים בין המעבד המארח לבין ה-GPU. אחרי שמפעילים את TFRT, הוא פועל יחד עם קומפילציית XLA. בגלל שהקומפילציה מראש של XLA מופעלת, יכול להיות שתיתקלו בתופעות לוואי כמו עלייה בחביון בבקשה הראשונה.
מידע נוסף זמין במאמר הפעלת קומפילציה מראש של מודל XLA.
שימוש בסביבת זמן הריצה של Google
TensorFlow runtime שעבר אופטימיזציה מבוסס על מחסנית פנימית של Google, ולכן הוא יכול לפעול בסביבת זמן ריצה קניינית של Google.
קובצי אימג' של קונטיינרים עם זמן ריצה אופטימלי של TensorFlow
Vertex AI מספק שני סוגים של קובצי אימג' של קונטיינרים עם TensorFlow runtime שעברו אופטימיזציה: stable ו-nightly.
תמונות קונטיינר יציבות
קונטיינרים יציבים של זמן ריצה אופטימלי של TensorFlow קשורים לגרסה ספציפית של TensorFlow, בדיוק כמו קונטיינרים מוכנים מראש של TensorFlow Serving שמבוססים על קוד פתוח. קונטיינרים של TensorFlow runtime שעברו אופטימיזציה ומקושרים לגרסה ספציפית נשמרים למשך אותו פרק זמן כמו גרסת ה-build של הקוד הפתוח שמקושרת לאותה גרסה. גרסאות ה-build של TensorFlow עם זמן ריצה אופטימליות הן בעלות אותן תכונות כמו גרסאות ה-build של TensorFlow בקוד פתוח, אבל עם הסקה מהירה יותר.
הגרסאות תואמות לדורות קודמים. המשמעות היא שתוכלו להריץ מודלים שאומנו בגרסאות ישנות יותר של TensorFlow באמצעות קונטיינר עדכני יותר. הביצועים של מאגרי תגים מהזמן האחרון טובים יותר מאלה של מאגרי תגים ישנים. במקרים נדירים, יכול להיות שמודל שאומן בגרסה ישנה יותר של TensorFlow לא יפעל עם קונטיינר עדכני יותר.
קובצי אימג' של קונטיינרים שמתעדכנים מדי לילה
גרסאות build אוטומטיות של TensorFlow runtime שעברו אופטימיזציה כוללות את השיפורים והאופטימיזציות האחרונים,
אבל יכול להיות שהן לא יהיו אמינות כמו גרסאות build יציבות. הם משמשים בעיקר למטרות ניסוי. שמות של גרסאות build אוטומטיות כוללים את התווית nightly. בניגוד לקובצי אימג' יציבים של קונטיינרים, קונטיינרים ליליים לא כלולים בהסכם רמת השירות (SLA) של Vertex AI.
קובצי אימג' זמינים של קונטיינרים
קובצי האימג' הבאים של קונטיינרים של Docker עם זמן ריצה אופטימלי של TensorFlow זמינים בגרסאות יציבות ובגרסאות ליליות.
| גרסת ה-framework של למידת מכונה | מאיצים נתמכים (וגרסת CUDA, אם רלוונטי) | תאריך סיום התמיכה והתיקונים | סיום הזמינות | תמונות נתמכות |
|---|---|---|---|---|
| ללילה | מעבד בלבד | לא רלוונטי | לא רלוונטי |
|
| ללילה | GPU (CUDA 12.x) | לא רלוונטי | לא רלוונטי |
|
| ללילה | Cloud TPU | לא רלוונטי | לא רלוונטי |
|
| 2.17 | מעבד בלבד | 11 ביולי 2024 | 11 ביולי 2025 |
|
| 2.17 | GPU (CUDA 12.x) | 11 ביולי 2024 | 11 ביולי 2025 |
|
| 2.17 | Cloud TPU | 11 ביולי 2024 | 11 ביולי 2025 |
|
| 2.16 | מעבד בלבד | Apr 26, 2024 | Apr 26, 2025 |
|
| 2.16 | GPU (CUDA 12.x) | Apr 26, 2024 | Apr 26, 2025 |
|
| 2.16 | Cloud TPU | Apr 26, 2024 | Apr 26, 2025 |
|
| 2.15 | מעבד בלבד | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.15 | GPU (CUDA 12.x) | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.15 | Cloud TPU | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.14 | מעבד בלבד | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.14 | GPU (CUDA 12.x) | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.13 | מעבד בלבד | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.13 | GPU (CUDA 11.x) | Aug 15, 2024 | 15 באוגוסט 2025 |
|
| 2.12 | מעבד בלבד | 15 במאי 2024 | 15 במאי 2025 |
|
| 2.12 | GPU (CUDA 11.x) | 15 במאי 2024 | 15 במאי 2025 |
|
| 2.11 | מעבד בלבד | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.11 | GPU (CUDA 11.x) | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.10 | מעבד בלבד | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.10 | GPU (CUDA 11.x) | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.9 | מעבד בלבד | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.9 | GPU (CUDA 11.x) | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.8 | מעבד בלבד | 15 בנובמבר 2023 | Nov 15, 2024 |
|
| 2.8 | GPU (CUDA 11.x) | 15 בנובמבר 2023 | Nov 15, 2024 |
|
שימוש בזמן הריצה של TensorFlow שעבר אופטימיזציה עם נקודת קצה פרטית
שימוש בנקודות קצה פרטיות כדי להפעיל מסקנות אונליין באמצעות Vertex AI מספק חיבור מאובטח עם השהיה נמוכה לשירות המסקנות אונליין של Vertex AI, שהוא מהיר יותר משימוש בנקודות קצה ציבוריות. סביר להניח שזמן הריצה האופטימלי של TensorFlow משמש מודלים שרגישים לזמן אחזור, ולכן כדאי להשתמש בו עם נקודות קצה פרטיות. מידע נוסף זמין במאמר בנושא שימוש בנקודות קצה פרטיות להסקת מסקנות אונליין.
פריסת מודל באמצעות זמן הריצה המותאם של TensorFlow
תהליך הפריסה של מודל להסקת מסקנות באמצעות זמן הריצה המותאם של TensorFlow כמעט זהה לתהליך הפריסה של מודלים באמצעות קונטיינרים מוכנים מראש של TensorFlow Serving שמבוססים על קוד פתוח. ההבדלים היחידים הם שאתם מציינים קובץ אימג' של קונטיינר שמשתמש בזמן הריצה המותאם של TensorFlow כשאתם יוצרים את המודל, ואתם יכולים להפעיל את דגלי האופטימיזציה שמתוארים בהמשך המסמך. לדוגמה, אם פרסתם את המודל שלכם באמצעות מאגר us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest, תוכלו להפעיל את אותו מודל באמצעות זמן הריצה המותאם של TensorFlow באמצעות מאגר us-docker.pkg.dev/vertex-ai-restricted/prediction/tf_opt-cpu.2-8:latest.
בדוגמת הקוד הבאה אפשר לראות איך ליצור מודל באמצעות קונטיינר זמן הריצה האופטימלי של TensorFlow: us-docker.pkg.dev/vertex-ai-restricted/prediction/tf_opt-cpu.nightly:latest כדי לפרוס את המודל הזה, משתמשים באותו תהליך שבו משתמשים כדי לפרוס מודל עם קונטיינרים מוכנים מראש של TensorFlow Serving.
מידע נוסף על ModelServiceClient שמשמש במדגם הזה זמין במאמר Class ModelServiceClient.
למידע נוסף על פריסת מודלים באמצעות Vertex AI, אפשר לעיין במאמר בנושא פריסת מודל באמצעות Vertex AI API.
מידע נוסף על ההגדרות allow_precompilation ו-allow_compression מופיע בקטע אופטימיזציות של מודלים שבהמשך המאמר.
from google.cloud.aiplatform import gapic as aip
PROJECT_ID = PROJECT_ID
REGION = LOCATION
API_ENDPOINT = f"{REGION}-aiplatform.googleapis.com"
PARENT = f"projects/{PROJECT_ID}/locations/{REGION}"
client_options = {"api_endpoint": API_ENDPOINT}
model_service_client = aip.ModelServiceClient(client_options=client_options)
tf_opt_model_dict = {
"display_name": "DISPLAY_NAME",
"metadata_schema_uri": "",
"artifact_uri": "MODEL_URI",
"container_spec": {
"image_uri": "us-docker.pkg.dev/vertex-ai-restricted/prediction/tf_opt-cpu.nightly:latest",
"args": [
# The optimized TensorFlow runtime includes the following
# options that can be set here.
# "--allow_precompilation=true" - enable XLA precompilation
# "--allow_compression=true" - enable
# model compression optimization
],
},
}
tf_opt_model = model_service_client.upload_model(
parent=PARENT,
model=tf_opt_model_dict).result(timeout=180).model
דגלים לאופטימיזציה של מודלים
כשפורסים מודל באמצעות זמן הריצה האופטימלי של TensorFlow, אפשר להפעיל שתי תכונות שעשויות לשפר עוד יותר את ההצגה של מודלים של TensorFlow.
אפשר להפעיל בו-זמנית אופטימיזציה של דחיסת מודלים וקומפילציה מראש של מודל XLA. בקטעים הבאים מוסבר איך להפעיל את האפשרויות האלה באמצעות דגלים במהלך הפריסה.
הפעלת קדם-קומפילציה של מודל XLA
כדי להגדיר את זמן הריצה האופטימלי של TensorFlow כך שיבצע קומפילציה מראש של מודלים, מגדירים את הדגל allow_precompilation לערך true. הקומפילציה מראש של מודל XLA פועלת עבור סוגים שונים של מודלים, וברוב המקרים משפרת את הביצועים. הקומפילציה מראש של XLA פועלת בצורה הטובה ביותר עבור בקשות עם גודלי אצווה גדולים.
הקומפילציה המוקדמת של מודל XLA מתרחשת כשהבקשה הראשונה עם גודל האצווה החדש מגיעה. כדי לוודא שסביבת זמן הריצה מאותחלת לפני הבקשה הראשונה, אפשר לכלול קובץ של בקשות חימום. מידע נוסף זמין במאמר בנושא חימום מוקדם של SavedModel במסמכי התיעוד של TensorFlow.
השלב של קומפילציה מראש של XLA נמשך בין כמה שניות לכמה דקות, בהתאם למורכבות של המודל. אם אתם משתמשים בהידור מראש של מודל XLA, כדאי לקחת בחשבון את הנקודות הבאות.
אם אתם משתמשים בקובץ חימום, נסו לכלול בקשות עם גדלי אצווה שמייצגים את גדלי האצווה שאתם מצפים שהמודל יקבל. אם מספקים מספר גדול של בקשות בקובץ ההפעלה, ההפעלה של שרת המודל תהיה איטית יותר.
אם אתם מצפים שהמודל שלכם יקבל בקשות עם גדלים שונים של אצווה, כדאי להפעיל אצווה בצד השרת עם קבוצה של ערכים קבועים ל-
allow_batch_sizes. מידע נוסף על הפעלת תיוג בצד השרתלמידע על עיבוד באצווה, אפשר לעיין במאמר הפעלת עיבוד באצווה של בקשות בצד השרת ב-TensorFlow במסמכי התיעוד של TensorFlow.
הקומפילציה מראש של XLA מוסיפה תקורה של זיכרון, ולכן יכול להיות שחלק מהמודלים הגדולים ייכשלו עם שגיאת out of memory ב-GPU.
מומלץ לבדוק את ההידור מראש של XLA במודל לפני שמפעילים את התכונה הזו בסביבת הייצור.
הפעלת אופטימיזציה של דחיסת מודלים
כדי להגדיר את זמן הריצה האופטימלי של TensorFlow לשימוש באופטימיזציה של דחיסת מודלים, צריך להגדיר את הדגל allow_compression שלו לערך true. בודקים איך הפעלת הדגל הזה משפיעה על הדיוק של המודל, ואז מחליטים אם רוצים להפעיל אותו בסביבת הייצור.
השבתת האופטימיזציות
כדי להגדיר את זמן הריצה של TensorFlow שעבר אופטימיזציה להרצת מודלים ללא אופטימיזציה, צריך להגדיר את הדגל disable_optimizer שלו לערך true.
מגבלות אופטימליות של זמן ריצה ב-TensorFlow
לזמן הריצה האופטימלי של TensorFlow יש את המגבלות הבאות:
- זמן הריצה האופטימלי של TensorFlow לא תואם למעבדי GPU ישנים של NVIDIA, כמו Tesla P4 ו-Tesla P100.
- בשלב הזה, זמן הריצה של TensorFlow שעבר אופטימיזציה תומך רק בדגימה של Shapley.
תמחור
פריסת מודלים באמצעות זמן הריצה האופטימלי של TensorFlow לא כרוכה בחיובים נוספים. העלות זהה לעלויות של פריסות אחרות של הסקת מסקנות, שבהן החיוב מבוסס על מספר המכונות הווירטואליות והמאיצים שנעשה בהם שימוש. מידע נוסף זמין במאמר בנושא תמחור Vertex AI.