אתם יכולים לצרף מאיצי GPU לעומסי עבודה (workloads) של אצווה ב-Managed Service for Apache Spark כדי להשיג את התוצאות הבאות:
לזרז את העיבוד של עומסי עבודה של ניתוח נתונים בהיקף גדול.
האצת אימון מודלים במערכי נתונים גדולים באמצעות ספריות של למידת מכונה ב-GPU.
לבצע ניתוח נתונים מתקדם, כמו עיבוד של סרטונים או של שפה טבעית.
כל סביבות זמן הריצה הנתמכות של Managed Service for Apache Spark מוסיפות את ספריית Spark RAPIDS לכל צומת של עומס עבודה. בנוסף, גרסה 1.1 של Managed Service for Apache Spark runtime מוסיפה את ספריית XGBoost לצמתים של עומסי עבודה. הספריות האלה מספקות כלים רבי עוצמה לשינוי נתונים ול-machine learning, שאפשר להשתמש בהם בעומסי עבודה עם האצת GPU.
היתרונות של GPU
אלה כמה מהיתרונות של שימוש במעבדים גרפיים עם עומסי עבודה של Spark ב-Managed Service for Apache Spark:
שיפור הביצועים: האצת GPU יכולה לשפר באופן משמעותי את הביצועים של עומסי עבודה ב-Spark, במיוחד במשימות עתירות-חישוב, כמו למידת מכונה ולמידה עמוקה, עיבוד גרפים וניתוחים מורכבים.
אימון מודלים מהיר יותר: במשימות של למידת מכונה, צירוף של מעבדי GPU יכול לקצר באופן משמעותי את הזמן שנדרש לאימון מודלים, וכך לאפשר למדעני נתונים ולמהנדסים לבצע איטרציות ולהתנסות במהירות.
יכולת הרחבה: לקוחות יכולים להוסיף עוד צמתים של מעבדי GPU או מעבדי GPU חזקים יותר לצמתים כדי לטפל בצרכים מורכבים יותר של עיבוד.
יעילות בעלויות: למרות שמעבדי GPU דורשים השקעה ראשונית, אפשר לחסוך בעלויות לאורך זמן כי זמני העיבוד מתקצרים והניצול של המשאבים יעיל יותר.
ניתוח נתונים משופר: האצת GPU מאפשרת לכם לבצע ניתוח מתקדם, כמו ניתוח תמונות וסרטונים ועיבוד שפה טבעית, במערכי נתונים גדולים.
מוצרים משופרים: עיבוד מהיר יותר מאפשר קבלת החלטות מהירה יותר ויישומים עם תגובה מהירה יותר.
מגבלות ושיקולים
מאיצי GPU זמינים ברמת התמחור פרימיום.
אפשר לחבר מעבדי GPU מסוג NVIDIA A100 או NVIDIA L4 לעומסי עבודה של אצווה ב-Managed Service for Apache Spark. מאיצי A100 ו-L4 כפופים לזמינות אזורית של GPU ב-Compute Engine.
ספריית XGBoost מסופקת רק לעומסי עבודה מואצי GPU של Managed Service for Apache Spark כשמשתמשים ב-Managed Service for Apache Spark בזמן ריצה של Spark בגרסה 1.x.
חבילות (batches) של Managed Service for Apache Spark עם האצת GPU ו-XGBoost משתמשות במכסות מוגדלות של Compute Engine. לדוגמה, כדי להריץ עומס עבודה של אצווה ללא שרת שמשתמש ב-GPU NVIDIA L4, צריך להקצות את מכסת NVIDIA_L4_GPUS.
אי אפשר להשתמש במדיניות הארגון
constraints/compute.requireShieldedVmבמשרות שמופעל בהן מאיץ. אם הארגון שלכם אוכף את המדיניות הזו, משימות שמופעל בהן שיפור המהירות לא יפעלו בהצלחה.כשמשתמשים בהאצת GPU של RAPIDS עם זמני ריצה נתמכים של שירות מנוהל ל-Apache Spark בגרסאות קודמות לגרסה
2.2, צריך להגדיר את ערכת התווים שמוגדרת כברירת מחדל ל-UTF-8. מידע נוסף זמין במאמר יצירת עומס עבודה של אצווה ללא שרתים עם מאיצי GPU.
תמחור
מאיצי GPU זמינים ברמת התמחור פרימיום. מידע על תמחור של מאיצים זמין במאמר בנושא תמחור של Managed Service for Apache Spark.
לפני שמתחילים
לפני יצירת עומס עבודה של אצווה ללא שרת עם מאיצי GPU מצורפים, צריך לבצע את הפעולות הבאות:
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init - במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.
- לוחצים על יצירה.
- ממלאים את פרטי הקטגוריה בדף Create a bucket. כדי לעבור לשלב הבא לוחצים על Continue.
-
בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:
- מזינים שם ייחודי בהיקף גלובלי שעומד בקריטריונים לשמות של קטגוריות.
- כדי להוסיף תווית לדלי, מרחיבים את הקטע Labels (תוויות) (), לוחצים על add_box
Add label (הוספת תווית) ומציינים
keyו-valueבשביל התווית.
-
בקטע Choose where to store your data, מבצעים את הפעולות הבאות:
- בוחרים סוג מיקום.
- בתפריט הנפתח Location type, בוחרים מיקום שבו יישמרו נתוני הקטגוריה באופן קבוע.
- אם בוחרים את סוג המיקום בשני אזורים, אפשר גם להפעיל רפליקציה בקצב טורבו באמצעות תיבת הסימון הרלוונטית.
- כדי להגדיר שכפול בין מאגרי מידע, בוחרים באפשרות הוספת שכפול בין מאגרי מידע באמצעות Storage Transfer Service ופועלים לפי השלבים הבאים:
הגדרה של רפליקציה בין מאגרי מידע
- בתפריט Bucket, בוחרים באפשרות הרצויה.
בקטע הגדרות השכפול, לוחצים על הגדרה כדי להגדיר את ההגדרות של משימת השכפול.
מופיעה החלונית Configure cross-bucket replication.
- כדי לסנן אובייקטים לשכפול לפי קידומת של שם האובייקט, מזינים קידומת שרוצים לכלול או להחריג אובייקטים ממנה, ואז לוחצים על הוספת קידומת.
- כדי להגדיר סוג אחסון לאובייקטים המשוכפלים, בוחרים סוג אחסון בתפריט סוג אחסון. אם מדלגים על השלב הזה, האובייקטים המשוכפלים ישתמשו בסוג האחסון של קטגוריית היעד כברירת מחדל.
- לוחצים על סיום.
-
בקטע Choose how to store your data, מבצעים את הפעולות הבאות:
- בוחרים default storage class לקטגוריה או Autoclass לניהול אוטומטי של סוג האחסון (storage class) של נתוני הקטגוריה.
- כדי להפעיל מרחב שמות היררכי, בקטע Optimize storage for data-intensive workloads, בוחרים באפשרות Enable hierarchical namespace on this bucket.
- בקטע Choose how to control access to objects, בוחרים אם הקטגוריה אוכפת public access prevention או לא, ואז בוחרים שיטת בקרת גישה לאובייקטים של הקטגוריה.
-
בקטע Choose how to protect object data, מבצעים את הפעולות הבאות:
- בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
- כדי להפעיל מחיקה עם יכולת שחזור, מסמנים את התיבה מדיניות מחיקה עם יכולת שחזור (לשחזור נתונים) ומציינים את מספר הימים שבהם רוצים לשמור אובייקטים אחרי המחיקה.
- כדי להגדיר ניהול גרסאות של אובייקטים, מסמנים את התיבה ניהול גרסאות של אובייקטים (לשליטה בגרסאות) ומציינים את מספר הגרסאות המקסימלי לכל אובייקט ואת מספר הימים שאחריהם הגרסאות הלא עדכניות יפוגו.
- כדי להפעיל את מדיניות שמירת הנתונים על אובייקטים וקטגוריות, לוחצים על תיבת הסימון שמירת נתונים (לצורך תאימות), ואז מבצעים את הפעולות הבאות:
- כדי להפעיל את הנעילה של שמירת אובייקטים, מסמנים את התיבה הפעלת שמירת אובייקטים.
- כדי להפעיל את נעילת הקטגוריה, מסמנים את תיבת הסימון הגדרת מדיניות שמירת נתונים בקטגוריה ובוחרים יחידת זמן ואת משך הזמן של תקופת השמירה.
- כדי לבחור איך להצפין את נתוני האובייקט, מרחיבים את הקטע Data encryption () ובוחרים Data encryption method.
- בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
-
בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:
- לוחצים על יצירה.
יצירת עומס עבודה של אצווה ללא שרת (serverless) עם מאיצי GPU
שליחת עומס עבודה באצווה של Managed Service for Apache Spark שמשתמש ב-GPU מסוג NVIDIA L4 כדי להריץ משימת PySpark מקבילית. כדי לעשות זאת באמצעות ה-CLI של gcloud:
לוחצים על Expand me (הרחבה) ואז יוצרים את קוד PySpark שמופיע ברשימה ושומרים אותו בקובץ
test-py-spark-gpu.pyבמחשב המקומי באמצעות עורך טקסט או עורך קוד.#!/usr/bin/env python """S8s Accelerators Example.""" import subprocess from typing import Any from pyspark.sql import SparkSession from pyspark.sql.functions import col from pyspark.sql.types import IntegerType from pyspark.sql.types import StructField from pyspark.sql.types import StructType spark = SparkSession.builder.appName("joindemo").getOrCreate() def get_num_gpus(_: Any) -> int: """Returns the number of GPUs.""" p_nvidia_smi = subprocess.Popen( ["nvidia-smi", "-L"], stdin=None, stdout=subprocess.PIPE ) p_wc = subprocess.Popen( ["wc", "-l"], stdin=p_nvidia_smi.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, ) [out, _] = p_wc.communicate() return int(out) num_workers = 5 result = ( spark.sparkContext.range(0, num_workers, 1, num_workers) .map(get_num_gpus) .collect() ) num_gpus = sum(result) print(f"Total accelerators: {num_gpus}") # Run the join example schema = StructType([StructField("value", IntegerType(), True)]) df = ( spark.sparkContext.parallelize(range(1, 10000001), 6) .map(lambda x: (x,)) .toDF(schema) ) df2 = ( spark.sparkContext.parallelize(range(1, 10000001), 6) .map(lambda x: (x,)) .toDF(schema) ) joined_df = ( df.select(col("value").alias("a")) .join(df2.select(col("value").alias("b")), col("a") == col("b")) .explain() )
משתמשים ב-CLI של gcloud במחשב המקומי כדי לשלוח את משימת האצווה של Managed Service for Apache Spark serverless עם חמישה עובדים, כאשר כל עובד מואץ באמצעות GPU מסוג L4:
gcloud dataproc batches submit pyspark test-py-spark-gpu.py \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=BUCKET_NAME \ --version=1.1 \ --properties=spark.dataproc.executor.compute.tier=premium,spark.dataproc.executor.disk.tier=premium,spark.dataproc.executor.resource.accelerator.type=l4,spark.executor.instances=5,spark.dataproc.driverEnv.LANG=C.UTF-8,spark.executorEnv.LANG=C.UTF-8,spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager
הערות:
- PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
- REGION: אזור זמין ב-Compute Engine להפעלת עומס העבודה.
- BUCKET_NAME: שם הקטגוריה של Cloud Storage. מערכת Spark מעלה את התלויות של עומס העבודה לתיקייה
/dependenciesבקטגוריה הזו לפני הפעלת עומס העבודה של האצווה. - --version: כל זמני הריצה הנתמכים של Managed Service for Apache Spark מוסיפים את ספריית RAPIDS לכל צומת של עומס עבודה עם האצת GPU. רק בגרסה 1.1 של זמן הריצה נוספת ספריית XGBoost לכל צומת בעומס עבודה עם האצת GPU.
--properties (ראו מאפייני הקצאת משאבים ב-Spark) :
-
spark.dataproc.driverEnv.LANG=C.UTF-8ו-spark.executorEnv.LANG=C.UTF-8(נדרש בגרסאות של זמן ריצה שקודמות ל-2.2): המאפיינים האלה מגדירים את ערכת התווים שמוגדרת כברירת מחדל ל-C.UTF-8.
spark.dataproc.executor.compute.tier=premium(חובה): עומסי עבודה עם האצת GPU מחויבים באמצעות יחידות מחשוב נתונים (DCU) פרימיום. ראו מחירון של Managed Service for Apache Spark Accelerator.
spark.dataproc.executor.disk.tier=premium(חובה): בצמתים עם מאיצים מסוג A100-40, A100-80 או L4 צריך להשתמש ברמת פרימיום של דיסק.
spark.dataproc.executor.resource.accelerator.type=l4(חובה): צריך לציין רק סוג GPU אחד. בעבודת הדוגמה נבחר GPU מסוג L4. אפשר לציין את סוגי המאיצים הבאים עם שמות הארגומנטים הבאים:סוג ה-GPU שם הארגומנט A100 40GB a100-40A100 80GB a100-80
spark.executor.instances=5(חובה): צריך לציין לפחות שני ערכים. בדוגמה הזו, הערך הוא 5.
spark.executor.cores(אופציונלי): אפשר להגדיר את המאפיין הזה כדי לציין את מספר ליבות ה-vCPU. הערכים התקינים של מעבדים גרפיים מסוג L4 הם4, ברירת המחדל, או8, 12, 16, 24, 48או96. הערך התקין היחיד, וערך ברירת המחדל, ל-GPU מסוג A100 הוא12. במכונות עם יחידות GPU מסוג L4 וליבות24,48או96, מצורפות יחידות GPU מסוג2,4או8לכל מפעיל. לכל שאר ההגדרות מצורף GPU1.
spark.dataproc.executor.disk.size(חובה): ל-GPU מסוג L4 יש גודל דיסק קבוע של 375 GB, למעט הגדרות עם ליבות24,48או96, שבהן הגודל הוא750,1,500או3,000GB, בהתאמה. אם תגדירו את המאפיין הזה לערך אחר כשאתם שולחים עומס עבודה עם האצה ברמה 4, תתרחש שגיאה. אם בוחרים ב-GPU מסוג A100 40 או A100 80, הגדלים התקינים הם 375g, 750g, 1,500g, 3,000g, 6,000g ו-9,000g.
spark.executor.memory(אופציונלי) ו-spark.executor.memoryOverhead(מוגבל): אפשר להגדיר זיכרון, אבל לא זיכרון עודף. כמות הזיכרון הזמין שלא נצרכה על ידי המאפיין שהוגדר מוקצה למאפיין שלא הוגדר. הערך שלspark.executor.memoryOverheadמוגדר ל-40% מהזיכרון שזמין לעומסי עבודה של אצווה ב-PySpark, ול-10% לעומסי עבודה אחרים (ראו מאפייני הקצאת משאבים של Spark).בטבלה הבאה מוצג נפח הזיכרון המקסימלי שאפשר להגדיר לתצורות שונות של A100 ו-L4 GPU. הערך המינימלי של כל אחת מהמאפיינים הוא
1024MB.A100 (40 GB) A100 (80GB) L4 (4 ליבות) L4 (8 ליבות) L4 (12 ליבות) L4 (16 cores) L4 (24 ליבות) L4 (48 ליבות) L4 (96 ליבות) סך הזיכרון המקסימלי (MB) 78040 165080 13384 26768 40152 53536 113072 160608 321216 מאפייני Spark RAPIDS (אופציונלי): כברירת מחדל, Managed Service for Apache Spark מגדיר את ערכי המאפיינים הבאים של Spark RAPIDS:
spark.plugins=com.nvidia.spark.SQLPluginspark.executor.resource.gpu.amount=1spark.task.resource.gpu.amount=1/$spark_executor_cores-
spark.shuffle.manager=''. כברירת מחדל, המאפיין הזה לא מוגדר. NVIDIA ממליצה להפעיל את RAPIDS shuffle manager כשמשתמשים במעבדים גרפיים (GPU) כדי לשפר את הביצועים. כדי לעשות זאת, מגדירים אתspark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManagerכששולחים עומס עבודה. spark.rapids.sql.concurrentGpuTasks= minimum of (gpuMemoryinMB/ 8, 4)-
spark.rapids.shuffle.multiThreaded.writer.threads= minimum of (cpu cores in the VM / gpu count per VM, 32) -
spark.rapids.shuffle.multiThreaded.reader.threads= minimum of (cpu cores in the VM / gpu count per VM, 32)
כדי להגדיר מאפייני Spark RAPIDS, אפשר לעיין במאמר בנושא הגדרת RAPIDS Accelerator ל-Apache Spark. כדי להגדיר מאפייני Spark מתקדמים, אפשר לעיין במאמר בנושא הגדרות מתקדמות של RAPIDS Accelerator ל-Apache Spark.
-