Dataproc Serverless에 GPU 사용

다음과 같은 결과를 얻기 위해 Dataproc Serverless 일괄 워크로드에 GPU 가속기를 연결할 수 있습니다.

  • 대규모 데이터 분석 워크로드 처리를 가속화합니다.

  • GPU 머신러닝 라이브러리를 사용하여 대규모 데이터 세트에서 모델 학습을 가속화합니다.

  • 동영상 또는 자연어 처리와 같은 고급 데이터 분석을 수행합니다.

모든 지원되는 Dataproc Serverless Spark 런타임은 각 워크로드 노드에 Spark RAPIDS 라이브러리를 추가합니다. Dataproc Serverless 런타임 버전 1.1도 워크로드 노드에 XGBoost 라이브러리를 추가합니다. 이러한 라이브러리는 GPU 가속 워크로드에 사용할 수 있는 강력한 데이터 변환 및 머신러닝 도구를 제공합니다.

GPU 이점

Dataproc Serverless Spark 워크로드에 GPU를 사용할 때의 이점은 다음과 같습니다.

  • 성능 개선: GPU 가속은 특히 머신러닝과 딥 러닝, 그래프 처리, 복합 분석과 같은 컴퓨팅 집약적인 태스크에서 Spark 워크로드 성능을 크게 향상시켜 줍니다.

  • 빠른 모델 학습: 머신러닝 태스크에서 GPU를 연결하면 모델 학습에 필요한 시간을 크게 줄여주고 데이터 과학자 및 엔지니어가 반복 처리 및 실험을 빠르게 수행할 수 있게 도와줍니다.

  • 확장성: 고객이 점점 더 복잡해지는 처리 요구를 해결하기 위해 더 많은 GPU 노드 또는 더 강력한 GPU를 추가할 수 있습니다.

  • 비용 효율성: GPU는 초기 투자가 필요하지만 처리 시간 감소 및 보다 효율적인 리소스 활용률 덕분에 시간 경과에 따라 비용 절감 효과를 얻을 수 있습니다.

  • 향상된 데이터 분석: GPU 가속을 통해 대규모 데이터 세트에서 이미지 및 비디오 분석, 자연어 처리 등의 고급 분석을 수행할 수 있습니다.

  • 향상된 제품: 더 빠른 처리를 통해 의사 결정을 더 빠르게 수행하고 보다 응답성이 뛰어난 애플리케이션을 지원할 수 있습니다.

제한사항 및 고려사항

가격 책정

가속기 가격 책정 정보는 Dataproc Serverless 가격 책정을 참조하세요.

시작하기 전에

GPU 가속기가 연결된 서버리스 일괄 워크로드를 만들려면 먼저 다음을 수행합니다.

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Dataproc, Compute Engine, and Cloud Storage 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Dataproc, Compute Engine, and Cloud Storage 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  12. Google Cloud Console에서 Cloud Storage 버킷 페이지로 이동합니다.

    버킷 페이지로 이동

  13. 버킷 만들기를 클릭합니다.
  14. 버킷 만들기 페이지에서 버킷 정보를 입력합니다. 다음 단계로 이동하려면 계속을 클릭합니다.
    • 버킷 이름 지정에서 버킷 이름 지정 요구사항을 충족하는 이름을 입력합니다.
    • 데이터를 저장할 위치 선택에서 다음을 수행합니다.
      • 위치 유형 옵션을 선택합니다.
      • 위치 옵션을 선택합니다.
    • 데이터의 기본 스토리지 클래스 선택에서 스토리지 클래스를 선택합니다.
    • 객체 액세스를 제어하는 방식 선택에서 액세스 제어 옵션을 선택합니다.
    • 고급 설정(선택사항)에서 암호화 방법, 보관 정책 또는 버킷 라벨을 지정합니다.
  15. 만들기를 클릭합니다.

GPU 가속기로 서버리스 일괄 워크로드 만들기

동시 로드된 PySpark 태스크를 실행하기 위해 NVIDIA L4 GPU를 사용하는 Dataproc Serverless 일괄 워크로드를 제출합니다. 다음 안내에 따라 gcloud CLI를 사용합니다.

  1. 펼치기를 클릭한 후 텍스트 또는 코드 편집기를 사용해서 나열된 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. 로컬 머신에서 gcloud CLI를 사용하여 각 작업자가 L4 GPU로 가속화된 5개의 작업자를 사용해서 Dataproc Serverless 서버리스 일괄 작업을 제출합니다.

    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 버킷 이름입니다. Spark는 일괄 워크로드를 실행하기 전에 이 버킷의 /dependencies 폴더에 워크로드 종속 항목을 업로드합니다.
  • --버전: 모든 지원되는 Dataproc Serverless 런타임은 GPU 가속 워크로드의 각 노드에 RAPIDS 라이브러리를 추가합니다. 현재 런타임 버전 1.1에서만 GPU 가속 워크로드의 각 노드에 XGBoost 라이브러리를 추가합니다.
  • --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(필수): GPU로 가속화된 워크로드는 프리미엄 데이터 컴퓨팅 단위(DCU)를 사용해서 비용이 청구됩니다. 서버리스 Dataproc 가속기 가격 책정을 참조하세요.

    • 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(필수): 최소 2 이상이어야 합니다. 이 예시에서는 5로 설정합니다.

    • spark.executor.cores(선택사항): 이 속성을 설정해서 코어 vCPU 수를 지정할 수 있습니다. L4 GPU에 유효한 값은 기본값인 4 또는 8, 12, 16입니다. A100 GPU의 유효한 기본값은 12입니다.

    • spark.dataproc.executor.disk.size(A100-40A100-80 GPU의 경우 선택사항): Dataproc Serverless는 기본 GPU SSD 디스크 크기를 375GB로 설정합니다. A100 40 또는 A100 80 GPU를 사용할 때는 크기를 변경할 수 있습니다(Spark 리소스 할당 속성 참조). L4 GPU에는 375GB 크기가 필요합니다. L4로 가속화된 워크로드를 제출할 때 이 속성을 다른 값으로 설정하면 오류가 발생합니다.

    • spark.executor.memory(선택사항) 및 spark.executor.memoryOverhead(선택사항): 이러한 속성 중 하나를 설정할 수 있지만 둘 다 설정할 수는 없습니다. 설정된 속성에 사용되지 않는 사용 가능한 메모리 양은 설정되지 않은 속성에 적용됩니다. 기본적으로 spark.executor.memoryOverhead는 PySpark 일괄 워크로드의 경우 사용 가능한 메모리의 40%로 설정되고 다른 워크로드의 경우에는 10%로 설정됩니다(Spark 리소스 할당 속성 참조).

      다음 표에서는 다른 A100 및 L4 GPU 구성에 대해 설정할 수 있는 최대 메모리 양을 보여줍니다. 각 속성의 최솟값은 1024MB입니다.

      A100(40GB) A100(80GB) L4(코어 4개) L4(코어 8개) L4(코어 12개) L4(코어 16개)
      최대 총 메모리(MB) 78040 165080 13384 26768 40152 53536
    • Spark RAPIDS 속성(선택사항): 기본적으로 Dataproc Serverless는 다음 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는 성능 향상을 위해 GPU를 사용할 때 RAPIDS 셔플 관리자를 사용 설정할 것을 권장합니다. 이렇게 하려면 워크로드를 제출할 때 spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager를 설정합니다.

      Spark RAPIDS 속성 설정에 대해서는 Apache Spark 구성을 위한 RAPIDS 가속기를 참조하고 Spark 고급 속성 설정에 대해서는 Apache Spark 고급 구성을 위한 RAPIDS 가속기를 참조하세요.