搭配使用 GPU 和 Google Cloud Serverless for Apache Spark

您可以將 GPU 加速器附加至 Google Cloud Serverless for Apache Spark 批次工作負載,以達成下列結果:

  • 加快處理大規模資料分析工作負載的速度。

  • 使用 GPU 機器學習程式庫,加速訓練大型資料集的模型。

  • 執行進階資料分析,例如影片或自然語言處理。

所有支援的 Serverless for Apache Spark Spark 執行階段,都會在每個工作負載節點中新增 Spark RAPIDS 程式庫。Serverless for Apache Spark Spark 執行階段 1.1 版也將 XGBoost 程式庫新增至工作負載節點。這些程式庫提供強大的資料轉換和機器學習工具,可用於 GPU 加速工作負載。

GPU 的優點

搭配使用 GPU 和 Serverless for Apache Spark Spark 工作負載的優點如下:

  • 提升效能:GPU 加速功能可大幅提升 Spark 工作負載的效能,特別是機器學習和深度學習、圖形處理和複雜分析等需要大量運算資源的工作。

  • 加快模型訓練速度:對於機器學習工作,附加 GPU 可大幅縮短模型訓練所需的時間,讓資料科學家和工程師快速疊代及實驗。

  • 擴充性:客戶可以為節點新增更多 GPU 節點或更強大的 GPU,以處理日益複雜的處理需求。

  • 成本效益:雖然 GPU 需要初期投資,但由於處理時間縮短且資源利用率更高,長期下來可節省成本。

  • 強化資料分析:GPU 加速功能可讓您對大型資料集執行進階分析,例如圖片和影片分析,以及自然語言處理。

  • 更優質的產品:處理速度更快,決策速度也更快,應用程式的回應速度也更快。

限制和注意事項

定價

GPU 加速器適用於進階定價層級。 如需加速器定價資訊,請參閱「Serverless 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. 安裝 Google Cloud CLI。

  6. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  7. 執行下列指令,初始化 gcloud CLI:

    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. 安裝 Google Cloud CLI。

  12. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  13. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  14. 前往 Google Cloud 控制台的 Cloud Storage「Buckets」(值區) 頁面。

    前往「Buckets」(值區) 頁面

  15. 點選 「Create」(建立)
  16. 在「建立 bucket」頁面中,輸入 bucket 資訊。如要前往下一個步驟,請按「繼續」
    1. 在「開始使用」部分,執行下列操作:
      • 輸入符合值區命名規定的全域不重複名稱。
      • 如要新增值區標籤,請展開「標籤」部分 (),按一下 「新增標籤」,然後為標籤指定 keyvalue
    2. 在「Choose where to store your data」(選擇資料的儲存位置) 專區中,執行下列操作:
      1. 選取「位置類型」
      2. 從「位置類型」下拉式選單中,選擇要永久儲存 bucket 資料的位置。
        • 如果您選取「雙區域」位置類型,也可以使用相關核取方塊啟用強化型複製
      3. 如要設定跨值區複製,請選取「透過 Storage 移轉服務新增跨值區複製作業」,然後按照下列步驟操作:

        設定跨 bucket 複製作業

        1. 在「Bucket」選單中選取 bucket。
        2. 在「複製設定」部分,按一下「設定」,設定複製作業的設定。

          系統隨即會顯示「設定跨 bucket 複製作業」窗格。

          • 如要依物件名稱前置字串篩選要複製的物件,請輸入要納入或排除物件的前置字串,然後按一下「新增前置字串」
          • 如要為複製的物件設定儲存空間級別,請從「儲存空間級別」選單中選取儲存空間級別。如果略過這個步驟,複製的物件預設會使用目標值區的儲存空間級別。
          • 按一下 [完成]
    3. 在「選擇資料儲存方式」部分,執行下列操作:
      1. 選取 bucket 的預設儲存空間級別,或選取「Autoclass」,讓系統自動管理 bucket 資料的儲存空間級別。
      2. 如要啟用階層命名空間,請在「為資料密集型工作負載提供最理想的儲存空間」部分,選取「為這個值區啟用階層命名空間」
    4. 在「選取如何控制物件的存取權」部分,選取 bucket 是否要強制執行禁止公開存取,並為 bucket 的物件選取存取權控管方法
    5. 在「選擇保護物件資料的方式」部分,執行下列操作:
      • 在「資料保護」下方,選取要為 bucket 設定的選項。
        • 如要啟用虛刪除,請按一下「虛刪除政策 (用於資料復原)」核取方塊,並指定要保留物件的天數 (刪除後)。
        • 如要設定「物件版本管理」,請按一下「物件版本管理 (用於版本管控)」核取方塊,並指定每個物件的版本數量上限,以及非現行版本失效的天數。
        • 如要為物件和 bucket 啟用保留政策,請勾選「保留 (符合法規)」核取方塊,然後執行下列操作:
          • 如要啟用 Object Retention Lock,請按一下「啟用物件保留功能」核取方塊。
          • 如要啟用「Bucket Lock」,請勾選「Set bucket retention policy」(設定值區保留政策) 核取方塊,然後選擇保留期限的時間單位和長度。
      • 如要選擇物件資料的加密方式,請展開「資料加密」部分 (),然後選取「資料加密」方法
  17. 點選「建立」

使用 GPU 加速器建立無伺服器批次工作負載

提交使用 NVIDIA L4 GPU 的 Serverless for Apache Spark 批次工作負載,執行平行化 PySpark 工作。使用 gcloud CLI 執行下列步驟:

  1. 按一下「Expand me」(展開),然後使用文字或程式碼編輯器,在您本機的 test-py-spark-gpu.py 檔案中建立並儲存列出的 PySpark 程式碼。

    #!/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. 在本地電腦上使用 gcloud CLI 提交 Serverless for Apache Spark 無伺服器批次工作,其中包含五個 worker,每個 worker 都以 L4 GPU 加速:

    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 專案 ID。
  • REGION:可執行工作負載的 Compute Engine 區域
  • BUCKET_NAME:Cloud Storage bucket 的名稱。Spark 會先將工作負載依附元件上傳至這個值區的 /dependencies 資料夾,再執行批次工作負載。
  • --version:所有支援的 Google Cloud Serverless for Apache Spark 執行階段 都會將 RAPIDS 程式庫新增至 GPU 加速工作負載的每個節點。只有執行階段 1.1 版會將 XGBoost 程式庫新增至 GPU 加速工作負載的每個節點。
  • --properties (請參閱「Spark 資源分配屬性」):

    • spark.dataproc.driverEnv.LANG=C.UTF-8spark.executorEnv.LANG=C.UTF-8 (使用 2.2 之前的執行階段版本時為必要):這些屬性會將預設字元集設為 C.UTF-8。
    • spark.dataproc.executor.compute.tier=premium (必要): 系統會使用進階資料運算單元 (DCU),計算 GPU 加速工作負載的費用。請參閱「Serverless for Apache Spark 加速器定價」。

    • spark.dataproc.executor.disk.tier=premium (必要):搭載 A100-40、A100-80 或 L4 加速器的節點必須使用進階磁碟層級。

    • spark.dataproc.executor.resource.accelerator.type=l4 (必要):只能指定一種 GPU 類型。範例工作會選取 L4 GPU。您可以使用下列引數名稱指定下列加速器類型:

      GPU 類型 引數名稱
      A100 40GB a100-40
      A100 80GB a100-80

    • spark.executor.instances=5 (必要):至少須有兩個。在這個範例中,請設為五。

    • spark.executor.cores (選用):您可以設定這項屬性,指定核心 vCPU 數量。L4 GPU 的有效值為 4 (預設值) 或 81216244896。A100 GPU 的唯一有效預設值為 12。使用 L4 GPU 和 244896 核心的設定,每個執行器會連結 248 個 GPU。所有其他設定都已附加 1 GPU。

    • spark.dataproc.executor.disk.size (必要):L4 GPU 的磁碟大小固定為 375 GB,但 244896 核心的設定除外,這些設定的磁碟大小分別為 7501,5003,000 GB。提交 L4 加速工作負載時,如果將這個屬性設為其他值,就會發生錯誤。如果選取 A100 40 或 A100 80 GPU,有效大小為 375g、750g、1500g、3000g、6000g 和 9000g。

    • spark.executor.memory (選用) 和 spark.executor.memoryOverhead (受限):您可以設定記憶體,但不能設定 memoryOverhead。系統會將未由已設定屬性耗用的可用記憶體容量,套用至未設定的屬性。spark.executor.memoryOverhead 會設為 PySpark 批次工作負載可用記憶體的 40%,其他工作負載則為 10% (請參閱「Spark 資源分配屬性」)。

      下表列出不同 A100 和 L4 GPU 設定可設定的最大記憶體量。任一屬性的最小值為 1024 MB。

      A100 (40 GB) A100 (80 GB) L4 (4 核心) L4 (8 核心) L4 (12 個核心) L4 (16 個核心) L4 (24 核心) L4 (48 核心) L4 (96 核心)
      記憶體總量上限 (MB) 78040 165080 13384 26768 40152 53536 113072 160608 321216
    • Spark RAPIDS 屬性 (選用):Serverless 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=''。根據預設,這項屬性未設定。使用 GPU 時,NVIDIA 建議開啟 RAPIDS 隨機播放管理工具,以提升效能。如要這麼做,請在提交工作負載時設定 spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager
      • spark.rapids.sql.concurrentGpuTasks= minimum of (gpuMemoryinMB / 8, 4)
      • spark.rapids.shuffle.multiThreaded.writer.threads= 最小值 (VM 中的 CPU 核心數 / 每個 VM 的 GPU 數量, 32)
      • spark.rapids.shuffle.multiThreaded.reader.threads= 最小值 (VM 中的 CPU 核心數 / 每個 VM 的 GPU 數量, 32)

      如要設定 Spark RAPIDS 屬性,請參閱「RAPIDS Accelerator for Apache Spark Configuration」;如要設定 Spark 進階屬性,請參閱「RAPIDS Accelerator for Apache Spark Advanced Configuration」。