התאמה נכונה

התכונה התאמה נכונה משתמשת ברמזים למשאבים של Apache Beam כדי להתאים אישית את משאבי העובדים לצינור עיבוד נתונים. היכולת לטרגט כמה משאבים שונים לשלבים ספציפיים בצינור עיבוד הנתונים מספקת גמישות ויכולת נוספות לצינור עיבוד הנתונים, ויכולה להוביל לחיסכון בעלויות. אפשר להקצות משאבים יקרים יותר לשלבים בצינור שזקוקים להם, ומשאבים זולים יותר לשלבים אחרים בצינור. אפשר להשתמש בהתאמה הנכונה כדי לציין את דרישות המשאבים עבור צינור עיבוד נתונים שלם או עבור שלבים ספציפיים בצינור עיבוד הנתונים.

תמיכה ומגבלות

הפעלה של התאמה לצד ימין

כדי להפעיל התאמה נכונה, משתמשים באחת או יותר מהצעות המשאבים הזמינות בצינור. כשמשתמשים ברמז למשאב בצינור, התאמה נכונה מופעלת באופן אוטומטי. מידע נוסף זמין בקטע שימוש בהצעות למשאבים במסמך הזה.

רמזים זמינים למשאבים

אלה רמזים למשאבים שזמינים:

רמז למשאב תיאור
min_ram

כמות ה-RAM המינימלית בג'יגה-בייט להקצאה לעובדים. מערכת Dataflow משתמשת בערך הזה כגבול תחתון כשמקצים זיכרון לעובדים חדשים (שינוי קנה מידה אופקי) או לעובדים קיימים (שינוי קנה מידה אנכי).

לדוגמה:

min_ram=NUMBERGB
  • מחליפים את NUMBER בערך המינימלי של זיכרון העובד שנדרש לצינור או לשלב בצינור.
  • ‫min_ram הוא מפרט מצטבר לכל עובד. זה לא מפרט לכל vCPU. לדוגמה, אם מגדירים את min_ram=15GB, ‏ Dataflow מגדיר את הזיכרון המצטבר שזמין בכל המעבדים הווירטואליים בעובד ל-15GB לפחות.
cpu_count

מספר המעבדים הווירטואליים להקצאה לכל עובד. כשמשתמשים ברמז המשאבים הזה, Dataflow בוחר סוגי מכונות עם מספר יחידות ה-vCPU שצוין ועומדות בדרישות הזיכרון.

לדוגמה:

cpu_count=NUMBER
  • מחליפים את NUMBER במספר השלם של המעבדים הווירטואליים שנדרשים לצינור או לשלב בצינור לכל עובד.
accelerator

הקצאה של יחידות GPU שסופקה על ידי המשתמש, שמאפשרת לכם לשלוט בשימוש ביחידות GPU ובעלות שלהן בצינור העיבוד ובשלבים שלו. מציינים את הסוג והמספר של מעבדי ה-GPU שרוצים לצרף לעובדי Dataflow כפרמטרים של הדגל.

לדוגמה:

accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
  • מחליפים את GPU_TYPE בסוג ה-GPU שרוצים להשתמש בו. רשימה של סוגי GPU שנתמכים ב-Dataflow זמינה במאמר תמיכה ב-GPU ב-Dataflow.
  • מחליפים את GPU_COUNT במספר המעבדים הגרפיים שרוצים להשתמש בהם.
  • אופציונלי: מחליפים את MACHINE_TYPE בסוג המכונה שרוצים להשתמש בה עם מעבדי ה-GPU.
    • סוג המכונה צריך להיות תואם לסוג ה-GPU שנבחר. פרטים על סוגי GPU וסוגי המכונות התואמים להם מופיעים במאמר פלטפורמות GPU.
    • אם מציינים סוג מכונה גם בaccelerator resource hint וגם בpipeline option של סוג מכונת העובד, ה-pipeline option מתעלם מההתאמה הנכונה.
  • כדי להשתמש ב-GPU של NVIDIA עם Dataflow, צריך להגדיר את install-nvidia-driver אפשרות ההגדרה.
    • יש תמיכה באפשרויות של גרסת הדרייבר default וגם latest.
    • אפשרות גרסת הדרייבר חייבת להיות זהה בכל צינור הנתונים, גם אם היא מושמטת. אי אפשר לשלב בין גרסה ללא מנהל התקן לבין גרסה של מנהל ההתקן default.

למידע נוסף על שימוש ביחידות GPU, אפשר לעיין במאמר בנושא יחידות GPU עם Dataflow.

בחירה אוטומטית של מכונות וירטואליות לסוגי מכונות worker

כשמשתמשים ברמזים למשאבים min_ram או cpu_count לשלבים בצינור שלא דורשים מאיצים, הגמישות של המופע (בחירת מכונה וירטואלית אוטומטית) מופעלת אוטומטית. באמצעות התכונה 'בחירה אוטומטית של מכונות וירטואליות', העובדים מקבלים הקצאת משאבים מתוך מבחר של סוגי מכונות שעומדים בדרישות ה-RAM והמעבד שלכם.

התכונה 'בחירה אוטומטית של מכונות וירטואליות' מבצעת אופטימיזציה של בחירת המכונות הווירטואליות בעיקר לצורך אמינות ולא לצורך ביצועים. המשמעות היא שאולי תהיה ירידה בביצועים בזמן השימוש בתכונה 'בחירה אוטומטית של מכונות וירטואליות' כדי לשפר את המהימנות של חלק מהמשימות המותאמות במיוחד. מומלץ לבדוק את התכונה 'בחירה אוטומטית של מכונה וירטואלית' על קבוצת משנה של המשימות הקיימות לפני שפורסים אותה בהדרגה לכלל המשימות.

אם אתם משתמשים בשמירת מקום ב-Compute Engine עם בחירה אוטומטית של מכונות וירטואליות, חשוב לשים לב לנקודות הבאות:

  • אם יש לכם הזמנות עם שימוש אוטומטי, יכול להיות שהמערכת תשתמש בהן אם Compute Engine יקצה מכונות וירטואליות מסוג מכונה תואם.
  • התכונה 'בחירה אוטומטית של מכונות וירטואליות' לא תומכת בשימוש במופעים מתוך הזמנה ספציפית.
  • אין תמיכה בבחירה אוטומטית של מכונות וירטואליות עם שינוי גודל אוטומטי אנכי.

מידע נוסף זמין במאמר גמישות בהזמנות של מכונות וירטואליות.

קינון של רמזים למשאבים

ההיררכיה של הצינורות לשינוי נתונים שבהם נעשה שימוש ברמזים למשאבים היא כזו:

  • ‫min_ram: הערך בטרנספורמציה מוערך כערך הרמז הגדול ביותר min_ram מבין הערכים שמוגדרים בטרנספורמציה עצמה ובכל ההורים שלה בהיררכיה של הטרנספורמציה.
    • לדוגמה: אם רמז להמרת נתונים פנימי מגדיר את min_ram ל-16GB, ורמז להמרת נתונים חיצוני בהיררכיה מגדיר את min_ram ל-32GB, המערכת תשתמש ברמז של 32GB לכל השלבים בהמרת הנתונים כולה.
    • לדוגמה: אם רמז לשינוי פנימי מגדיר את min_ram ל-16GB, ורמז לשינוי חיצוני בהיררכיה מגדיר את min_ram ל-8GB, רמז של 8GB ישמש לכל השלבים בשינוי החיצוני שלא נמצאים בשינוי הפנימי, ורמז של 16GB ישמש לכל השלבים בשינוי הפנימי.
  • ‫accelerator: הערך הפנימי ביותר בהיררכיית הטרנספורמציה מקבל עדיפות.
    • דוגמה: אם רמז להמרת נתונים פנימית accelerator שונה מרמז להמרת נתונים חיצונית accelerator בהיררכיה, המערכת משתמשת ברמז להמרת נתונים פנימית accelerator להמרת הנתונים הפנימית.

רמזים שמוגדרים לצינור כולו מטופלים כאילו הם מוגדרים בהמרת החוץ הנפרדת.

שימוש ברמזים למשאבים

אפשר להגדיר רמזים למשאבים בכל צינור הנתונים או בשלבים של צינור הנתונים.

הינטים של משאבים בפייפליין

אפשר להגדיר רמזים למשאבים בצינור כולו כשמריצים את צינור העיבוד משורת הפקודה.

gcloud

כדי להגדיר רמזים למשאבים כשמריצים צינור עיבוד נתונים עם תבנית Flex, משתמשים בדגל --additional-pipeline-options עם הפקודה gcloud dataflow flex-template run. שם האפשרות של צינור העיבוד תלוי בשפת ה-SDK. לדוגמה, לגבי רמזים למשאבים:

  • לצינורות Java, משתמשים ב-resourceHints.
  • לצינורות עיבוד נתונים של Python, צריך להשתמש ב-resource_hints.

בדוגמה הבאה מוסבר איך להגדיר רמזים למשאבים כשמריצים צינור עיבוד נתונים של תבנית Flex ב-Java:

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location="gs://TEMPLATE_LOCATION" \
    --region="REGION" \
    --additional-pipeline-options=resourceHints=min_ram=numberGB \
    --additional-pipeline-options=resourceHints=cpu_count=number \
    --additional-pipeline-options=resourceHints=accelerator="type:type;count:number;install-nvidia-driver" \
    --parameters ...

בדוגמה הבאה אפשר לראות איך מגדירים רמזים למשאבים כשמריצים צינור של תבנית Flex ב-Python:

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location="gs://TEMPLATE_LOCATION" \
    --region="REGION" \
    --additional-pipeline-options=resource_hints=min_ram=numberGB \
    --additional-pipeline-options=resource_hints=cpu_count=number \
    --additional-pipeline-options=resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
    --parameters ...

Python

הוראות להגדרת סביבת Python מופיעות במדריך ל-Python.

בדוגמה הבאה אפשר לראות איך מגדירים רמזים למשאבים כשמריצים צינור עיבוד נתונים של Python:

python my_pipeline.py \
    --runner=DataflowRunner \
    --resource_hints=min_ram=numberGB \
    --resource_hints=cpu_count=number \
    --resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
    ...

רמזים לגבי משאבים בשלב של צינור עיבוד נתונים

אפשר להגדיר רמזים למשאבים בשלבים של צינור הנתונים (טרנספורמציות) באופן פרוגרמטי.

Java

כדי להתקין את Apache Beam SDK for Java, אפשר לעיין במאמר בנושא התקנה של Apache Beam SDK.

אפשר להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות באמצעות הסיווג ResourceHints.

בדוגמה הבאה מוצג איך להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות עיבוד נתונים.

pcoll.apply(MyCompositeTransform.of(...)
    .setResourceHints(
        ResourceHints.create()
            .withMinRam("15GB")
            .withCpuCount(8)
            .withAccelerator(
    "type:nvidia-l4;count:1;install-nvidia-driver")))

pcoll.apply(ParDo.of(new BigMemFn())
    .setResourceHints(
        ResourceHints.create()
          .withMinRam("30GB")
          .withCpuCount(16)))

כדי להגדיר רמזים למשאבים באופן פרוגרמטי בכל צינור הנתונים, צריך להשתמש בממשק ResourceHintsOptions.

Python

כדי להתקין את Apache Beam SDK ל-Python, אפשר לעיין במאמר בנושא התקנה של Apache Beam SDK.

אפשר להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות באמצעות הסיווג PTransforms.with_resource_hints. מידע נוסף זמין במאמר בנושא ResourceHint class.

בדוגמה הבאה מוצג איך להגדיר רמזים למשאבים באופן פרוגרמטי בהמרות של צינורות עיבוד נתונים.

pcoll | MyPTransform().with_resource_hints(
    min_ram="4GB",
    cpu_count=8,
    accelerator="type:nvidia-tesla-l4;count:1;install-nvidia-driver")

pcoll | beam.ParDo(BigMemFn()).with_resource_hints(
    min_ram="30GB",
    cpu_count=16)

כדי להגדיר רמזים למשאבים בכל צינור עיבוד הנתונים, משתמשים באפשרות --resource_hintspipeline כשמריצים את צינור עיבוד הנתונים. דוגמה מופיעה במאמר בנושא רמזים למשאבי צינורות.

המשך

אין תמיכה ברמזים למשאבים ב-Go.

תמיכה במספר מאיצים

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

התאמה ומיזוג נכונים

במקרים מסוימים, אפשר להפעיל טרנספורמציות שהוגדרו עם רמזים שונים למשאבים בעובדים באותו מאגר עובדים, כחלק מתהליך אופטימיזציה של מיזוג. כשממזגים טרנספורמציות, Dataflow מפעיל אותן בסביבה שעומדת בדרישות של איחוד רמזי המשאבים שהוגדרו בטרנספורמציות. במקרים מסוימים, זה כולל את כל הצינור.

אם אי אפשר למזג רמזים למשאבים, לא מתבצע מיזוג. לדוגמה, אי אפשר למזג רמזים למשאבים של GPU שונים, ולכן לא ניתן לבצע מיזוג של טרנספורמציות כאלה.

אפשר גם למנוע מיזוג על ידי הוספת פעולה לצינור עיבוד הנתונים שמאלצת את Dataflow ליצור חומר ביניים של PCollection. האפשרות הזו שימושית במיוחד כשמנסים לבודד משאבים יקרים כמו מעבדי GPU או מכונות עם זיכרון גבוה משלבים איטיים או משלבים שדורשים הרבה משאבי מחשוב ולא צריכים את המשאבים המיוחדים האלה. במקרים כאלה, יכול להיות שיהיה כדאי להכריח פיצול של המיזוג בין השלבים האיטיים שמוגבלים על ידי המעבד לבין השלבים שדורשים את המעבדים הגרפיים היקרים או מכונות עם זיכרון גבוה, ולשלם את העלות של יצירת חומר שמשויכת לפיצול המיזוג. מידע נוסף זמין במאמר בנושא מניעת מיזוג.

התאמה נכונה של סטרימינג

במשימות סטרימינג, אפשר להפעיל התאמה נכונה על ידי הגדרת אפשרות הצינור --experiments=enable_streaming_rightfitting.

התאמה נכונה יכולה לשפר את הביצועים של צינור העיבוד אם הוא כולל שלבים עם דרישות שונות של משאבים.

דוגמה: צינור עם שלב שדורש הרבה משאבי CPU ושלב שדורש GPU

דוגמה לצינור עיבוד נתונים שיכול להפיק תועלת מהתאמה נכונה היא צינור שמבצע שלב שדורש הרבה משאבי CPU, ואחריו שלב שדורש משאבי GPU. אם לא מתאימים את הגודל של מאגר העובדים, צריך להגדיר מאגר עובדים יחיד של GPU כדי להריץ את כל שלבי צינור העיבוד, כולל השלב שדורש הרבה משאבי CPU. זה עלול להוביל לניצול חלקי של משאבי ה-GPU כשמאגר העובדים מבצע את השלב שדורש הרבה משאבי CPU.

אם האפשרות 'התאמה נכונה' מופעלת ורמז למשאב מוחל על השלב שדורש GPU, צינור הנתונים ייצור שני מאגרי עובדים נפרדים, כך שהשלב שדורש CPU יבוצע על ידי מאגר העובדים של ה-CPU, והשלב שדורש GPU יבוצע על ידי מאגר העובדים של ה-GPU.

בצנרת הזו לדוגמה, בטבלת שינוי הגודל האוטומטי אפשר לראות שמאגר העובדים שמבצע את השלב שדורש הרבה משאבי CPU‏, Pool 0, גדל בהתחלה ל-99 עובדים, ואחר כך קטן ל-87 עובדים. מאגר העובדים שמבצע את השלב שדורש GPU‏, Pool 1, מוגדל ל-13 עובדים:

טבלה שבה מוצגים שני מאגרי משאבים עם שינוי גודל אוטומטי.

בתרשים ניצול המעבד (CPU) אפשר לראות שרמת ניצול המעבד הכוללת של העובדים בשני מאגרי העובדים גבוהה:

תרשים שבו מוצג ניצול המעבד של עובדים משתי קבוצות שונות.

פתרון בעיות שקשורות להתאמה נכונה

בקטע הזה מפורטות הוראות לפתרון בעיות נפוצות שקשורות להתאמה נכונה של מודעות.

הגדרות אישיות לא תקינות

כשמנסים להשתמש בהתאמה לימין, מתרחשת השגיאה הבאה:

Workflow failed. Causes: One or more operations had an error: 'operation-OPERATION_ID':
[UNSUPPORTED_OPERATION] 'NUMBER vCpus with NUMBER MiB memory is
an invalid configuration for NUMBER count of 'GPU_TYPE' in family 'MACHINE_TYPE'.'.

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

מקביליות לא צפויה עם בחירת VM אוטומטית

אם אתם רואים ניצול נמוך של CPU או מקביליות לא צפויה במכונות וירטואליות של עובדים כשאתם משתמשים בבחירה אוטומטית של מכונות וירטואליות עם התאמה נכונה, יכול להיות שיש בעיה שבה מספר השרשורים לכל עובד לא מוגדר אוטומטית כך שיתאים למספר ה-vCPU של סוג המכונה שנבחר.

כדי לעקוף את הבעיה הזו, צריך להגדיר במפורש את אותו ערך גם לnumberOfWorkerHarnessThreads אפשרות הצינור וגם לרמז למשאב הצינור cpu_count. לדוגמה, אם אתם צריכים 2 מעבדים וירטואליים, צריך להגדיר את --numberOfWorkerHarnessThreads=2 ואת --resourceHints=cpu_count=2. הערה: האפשרות numberOfWorkerHarnessThreads חלה באופן גלובלי על כל מאגרי העובדים בצינור עיבוד הנתונים.

אימות ההתאמה הנכונה

כדי לוודא שהתאמה נכונה מופעלת, אפשר לעיין במדדי שינוי הגודל האוטומטי ולוודא שהעמודה Worker pool מוצגת ומופיעים בה מאגרי משאבים שונים:

טבלה שבה מוצגת היסטוריית העובדים של צינור עם כמה מאגרי עובדים כשהתכונה 'התאמה נכונה' מופעלת.

ביצועים של התאמה לזכויות סטרימינג

יכול להיות שצינורות סטרימינג עם התאמה נכונה לא תמיד יניבו ביצועים טובים יותר מצינורות בלי התאמה נכונה. לדוגמה:

  1. הצינור משתמש ביותר עובדים
  2. זמן האחזור של המערכת ארוך יותר או שהתפוקה נמוכה יותר
  3. הגדלים של מאגרי העובדים משתנים בתדירות גבוהה יותר, או שלא מתייצבים

אם אתם רואים את זה בפייפליין שלכם, אתם יכולים להשבית את ההתאמה הנכונה על ידי הסרת --experiments=enable_streaming_rightfitting אפשרות הפייפליין. בנוסף, צינורות סטרימינג עם התאמה נכונה שמופעלת באמצעות רמזים למשאבי האצה עשויים להשתמש ביותר מאיצי תוכנה מהרצוי. אם אתם רואים את זה בצינור עיבוד הנתונים שלכם, אתם יכולים להגדיר מספר מקסימלי של מאיצים שצינור עיבוד הנתונים משתמש בהם על ידי הגדרת אפשרות צינור עיבוד הנתונים --experiments=max_num_accelerators=NUM.