שימוש ב-GPU

אתם יכולים לצרף מאיצי 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 זמינים ברמת התמחור פרימיום. מידע על תמחור של מאיצים זמין במאמר בנושא תמחור של Managed Service for Apache Spark.

לפני שמתחילים

לפני יצירת עומס עבודה של אצווה ללא שרת עם מאיצי GPU מצורפים, צריך לבצע את הפעולות הבאות:

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  15. לוחצים על יצירה.
  16. ממלאים את פרטי הקטגוריה בדף Create a bucket. כדי לעבור לשלב הבא לוחצים על Continue.
    1. בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:
    2. בקטע Choose where to store your data, מבצעים את הפעולות הבאות:
      1. בוחרים סוג מיקום.
      2. בתפריט הנפתח Location type, בוחרים מיקום שבו יישמרו נתוני הקטגוריה באופן קבוע.
      3. כדי להגדיר שכפול בין מאגרי מידע, בוחרים באפשרות הוספת שכפול בין מאגרי מידע באמצעות Storage Transfer Service ופועלים לפי השלבים הבאים:

        הגדרה של רפליקציה בין מאגרי מידע

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

          מופיעה החלונית Configure cross-bucket replication.

          • כדי לסנן אובייקטים לשכפול לפי קידומת של שם האובייקט, מזינים קידומת שרוצים לכלול או להחריג אובייקטים ממנה, ואז לוחצים על הוספת קידומת.
          • כדי להגדיר סוג אחסון לאובייקטים המשוכפלים, בוחרים סוג אחסון בתפריט סוג אחסון. אם מדלגים על השלב הזה, האובייקטים המשוכפלים ישתמשו בסוג האחסון של קטגוריית היעד כברירת מחדל.
          • לוחצים על סיום.
    3. בקטע Choose how to store your data, מבצעים את הפעולות הבאות:
      1. בוחרים default storage class לקטגוריה או Autoclass לניהול אוטומטי של סוג האחסון (storage class) של נתוני הקטגוריה.
      2. כדי להפעיל מרחב שמות היררכי, בקטע Optimize storage for data-intensive workloads, בוחרים באפשרות Enable hierarchical namespace on this bucket.
    4. בקטע Choose how to control access to objects, בוחרים אם הקטגוריה אוכפת public access prevention או לא, ואז בוחרים שיטת בקרת גישה לאובייקטים של הקטגוריה.
    5. בקטע Choose how to protect object data, מבצעים את הפעולות הבאות:
      • בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
        • כדי להפעיל מחיקה עם יכולת שחזור, מסמנים את התיבה מדיניות מחיקה עם יכולת שחזור (לשחזור נתונים) ומציינים את מספר הימים שבהם רוצים לשמור אובייקטים אחרי המחיקה.
        • כדי להגדיר ניהול גרסאות של אובייקטים, מסמנים את התיבה ניהול גרסאות של אובייקטים (לשליטה בגרסאות) ומציינים את מספר הגרסאות המקסימלי לכל אובייקט ואת מספר הימים שאחריהם הגרסאות הלא עדכניות יפוגו.
        • כדי להפעיל את מדיניות שמירת הנתונים על אובייקטים וקטגוריות, לוחצים על תיבת הסימון שמירת נתונים (לצורך תאימות), ואז מבצעים את הפעולות הבאות:
          • כדי להפעיל את הנעילה של שמירת אובייקטים, מסמנים את התיבה הפעלת שמירת אובייקטים.
          • כדי להפעיל את נעילת הקטגוריה, מסמנים את תיבת הסימון הגדרת מדיניות שמירת נתונים בקטגוריה ובוחרים יחידת זמן ואת משך הזמן של תקופת השמירה.
      • כדי לבחור איך להצפין את נתוני האובייקט, מרחיבים את הקטע Data encryption () ובוחרים Data encryption method.
  17. לוחצים על יצירה.

יצירת עומס עבודה של אצווה ללא שרת (serverless) עם מאיצי GPU

שליחת עומס עבודה באצווה של Managed Service for Apache Spark שמשתמש ב-GPU מסוג NVIDIA L4 כדי להריץ משימת PySpark מקבילית. כדי לעשות זאת באמצעות ה-CLI של gcloud:

  1. לוחצים על 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()
    )
  2. משתמשים ב-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-40
      A100 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 לכל מפעיל. לכל שאר ההגדרות מצורף GPU 1.

    • spark.dataproc.executor.disk.size (חובה): ל-GPU מסוג L4 יש גודל דיסק קבוע של ‎375 GB, למעט הגדרות עם ליבות 24, 48 או 96, שבהן הגודל הוא 750,‏ 1,500 או 3,000 GB, בהתאמה. אם תגדירו את המאפיין הזה לערך אחר כשאתם שולחים עומס עבודה עם האצה ברמה 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.SQLPlugin
      • spark.executor.resource.gpu.amount=1
      • spark.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.