Google Cloud 및 NVIDIA를 통한 데이터 분석 가속화

1. 소개

이 Codelab에서는 Google Cloud에서 NVIDIA GPU와 오픈소스 라이브러리를 사용하여 대규모 데이터 세트의 데이터 분석 워크플로를 가속화하는 방법을 알아봅니다. 먼저 인프라를 최적화한 다음 코드 변경 없이 GPU 가속을 적용하는 방법을 알아봅니다.

인기 있는 데이터 조작 라이브러리인 pandas에 중점을 두고 NVIDIA의 cuDF 라이브러리를 사용하여 이를 가속화하는 방법을 알아봅니다. 가장 좋은 점은 기존 pandas 코드를 변경하지 않고도 이 GPU 가속을 사용할 수 있다는 것입니다.

학습할 내용

  • Google Cloud의 Colab Enterprise를 이해합니다.
  • 특정 GPU, CPU, 메모리 구성으로 Colab 런타임 환경을 맞춤설정합니다.
  • NVIDIA cuDF를 사용하여 코드 변경 없이 pandas를 가속화하세요.
  • 코드를 프로파일링하여 성능 병목 현상을 식별하고 최적화합니다.

2. 데이터 처리를 가속화해야 하는 이유

80/20 규칙: 데이터 준비에 시간이 많이 소요되는 이유

데이터 준비는 분석 프로젝트에서 가장 시간이 많이 걸리는 단계인 경우가 많습니다. 데이터 과학자와 분석가는 분석을 시작하기 전에 데이터 정리, 변환, 구조화에 많은 시간을 할애합니다.

다행히 cuDF를 사용하여 NVIDIA GPU에서 pandas, Apache Spark, Polars와 같은 인기 있는 오픈소스 라이브러리를 가속화할 수 있습니다. 이러한 가속화에도 불구하고 데이터 준비는 다음과 같은 이유로 시간이 오래 걸립니다.

  • 소스 데이터는 분석 준비가 되어 있지 않은 경우가 많음: 실제 데이터에는 불일치, 누락된 값, 형식 지정 문제가 있는 경우가 많습니다.
  • 품질이 모델 성능에 미치는 영향: 데이터 품질이 좋지 않으면 가장 정교한 알고리즘도 쓸모없게 될 수 있습니다.
  • 규모로 인해 문제가 증폭됨: 수백만 개의 레코드로 작업할 때는 사소해 보이는 데이터 문제가 심각한 병목 현상이 됩니다.

3. 노트북 환경 선택

많은 데이터 과학자가 개인 프로젝트에 Colab을 사용해 봤지만 Colab Enterprise는 비즈니스용으로 설계된 안전하고 협업적이며 통합된 노트북 환경을 제공합니다.

Google Cloud에는 관리형 노트북 환경을 위한 두 가지 기본 선택사항이 있습니다. Colab EnterpriseVertex AI Workbench입니다. 적절한 선택은 프로젝트의 우선순위에 따라 다릅니다.

Vertex AI Workbench를 사용해야 하는 경우

제어 및 심층 맞춤설정이 우선인 경우 Vertex AI Workbench를 선택합니다. 다음과 같은 경우에 적합합니다.

  • 기본 인프라 및 머신 수명 주기 관리
  • 커스텀 컨테이너 및 네트워크 구성을 사용합니다.
  • MLOps 파이프라인 및 맞춤 수명 주기 도구와 통합

Colab Enterprise를 사용해야 하는 경우

빠른 설정, 간편한 사용, 안전한 공동작업이 우선이라면 Colab Enterprise를 선택하세요. 팀이 인프라가 아닌 분석에 집중할 수 있는 완전 관리형 솔루션입니다. Colab Enterprise를 사용하면 다음과 같은 이점이 있습니다.

  • 데이터 웨어하우스와 밀접하게 연결된 데이터 과학 워크플로를 개발합니다. BigQuery Studio에서 직접 노트북을 열고 관리할 수 있습니다.
  • Vertex AI에서 머신러닝 모델을 학습시키고 MLOps 도구와 통합합니다.
  • 유연하고 통합된 환경을 즐기세요. BigQuery에서 만든 Colab Enterprise 노트북은 Vertex AI에서 열고 실행할 수 있으며 그 반대도 가능합니다.

오늘의 실습

이 Codelab에서는 Colab Enterprise를 사용하여 데이터 분석을 가속화합니다.

차이점에 대해 자세히 알아보려면 올바른 노트북 솔루션 선택에 관한 공식 문서를 참고하세요.

4. 런타임 템플릿 구성

Colab Enterprise에서 사전 구성된 런타임 템플릿을 기반으로 하는 런타임에 연결합니다.

런타임 템플릿은 다음을 비롯한 노트북의 전체 환경을 지정하는 재사용 가능한 구성입니다.

  • 머신 유형 (CPU, 메모리)
  • 가속기 (GPU 유형 및 수)
  • 디스크 크기 및 유형
  • 네트워크 설정 및 보안 정책
  • 유휴 상태 자동 종료 규칙

런타임 템플릿이 유용한 이유

  • 일관된 환경: 팀원과 내가 매번 동일한 즉시 사용 가능한 환경을 사용하여 작업의 반복 가능성을 보장합니다.
  • 보안을 우선으로 하는 기본 설정으로 작업: 템플릿은 조직의 보안 정책을 자동으로 적용합니다.
  • 비용 효과적으로 관리: GPU 및 CPU와 같은 리소스는 템플릿에서 사전 크기 조정되므로 우발적인 비용 초과를 방지할 수 있습니다.

런타임 템플릿 만들기

실습을 위한 재사용 가능한 런타임 템플릿을 설정합니다.

  1. Google Cloud 콘솔에서 탐색 메뉴 > Vertex AI > Colab Enterprise로 이동합니다.

Colab Enterprise로 이동

  1. Colab Enterprise에서 런타임 템플릿을 클릭한 다음 새 템플릿을 선택합니다.

새 런타임 템플릿 만들기

  1. 런타임 기본사항에서 다음을 수행합니다.
  • 표시 이름gpu-template로 설정합니다.
  • 원하는 리전을 설정합니다.

런타임 이름 및 리전 구성

  1. 컴퓨팅 구성에서 다음을 수행합니다.
  • 머신 유형g2-standard-4로 설정합니다.
  • 유휴 상태 종료를 60분으로 변경합니다.
  1. 만들기를 클릭하여 런타임 템플릿을 저장합니다. 이제 런타임 템플릿 페이지에 새 템플릿이 표시됩니다.

런타임 템플릿 머신 유형 설정 및 템플릿 만들기

5. 런타임 시작

템플릿이 준비되면 새 런타임을 만들 수 있습니다.

  1. Colab Enterprise에서 런타임을 클릭한 다음 만들기를 선택합니다.

런타임 생성 메뉴를 엽니다.

  1. 런타임 템플릿에서 gpu-template 옵션을 선택합니다. 만들기를 클릭하고 런타임이 부팅될 때까지 기다립니다.

새 런타임 부팅

  1. 몇 분 후 런타임이 표시됩니다.

런타임을 사용할 수 있는지 확인합니다.

6. 노트북 설정하기

이제 인프라가 실행 중이므로 실습 노트북을 가져와 런타임에 연결해야 합니다.

노트북 가져오기

  1. Colab Enterprise에서 내 노트북을 클릭한 다음 가져오기를 클릭합니다.

노트북 가져오기 창을 엽니다.

  1. URL 라디오 버튼을 선택하고 다음 URL을 입력합니다.

https://github.com/GoogleCloudPlatform/ai-ml-recipes/blob/main/notebooks/analytics/gpu_accelerated_analytics.ipynb

  1. 가져오기를 클릭합니다. Colab Enterprise에서 GitHub의 노트북을 환경에 복사합니다.

공개 저장소에서 노트북을 복사합니다.

런타임에 연결하기

  1. 새로 가져온 노트북을 엽니다.
  2. 연결 옆에 있는 아래쪽 화살표를 클릭합니다.
  3. 런타임에 연결을 선택합니다.

노트북 가져오기 창을 엽니다.

  1. 드롭다운을 사용하여 이전에 만든 런타임을 선택합니다.
  2. 연결을 클릭합니다.

노트북 가져오기 창을 엽니다.

이제 노트북이 GPU 지원 런타임에 연결되었습니다. 이제 쿼리를 실행할 수 있습니다.

7. NYC 택시 데이터 세트 준비

이 Codelab에서는 NYC 택시 및 리무진 조합 (TLC) 운행 기록 데이터를 사용합니다.

이 데이터 세트에는 뉴욕시의 노란색 택시의 개별 운행 기록이 포함되어 있으며 다음과 같은 필드가 포함되어 있습니다.

  • 승차 및 하차 날짜, 시간, 위치
  • 여행 거리
  • 항목별 요금 금액
  • 승객 수

데이터 다운로드

그런 다음 2024년의 모든 여행 데이터를 다운로드합니다. 데이터는 Parquet 파일 형식으로 저장됩니다.

다음 코드 블록은 이러한 단계를 실행합니다.

  1. 다운로드할 연도 및 월의 범위를 정의합니다.
  2. 파일을 저장하기 위해 nyc_taxi_data라는 로컬 디렉터리를 만듭니다.
  3. 각 월을 반복하고, 해당 Parquet 파일이 아직 없는 경우 다운로드하여 디렉터리에 저장합니다.

노트북에서 이 코드를 실행하여 데이터를 수집하고 런타임에 저장합니다.

from tqdm import tqdm
import requests
import time
import os

YEAR = 2024
DATA_DIR = "nyc_taxi_data"

os.makedirs(DATA_DIR, exist_ok=True)
print(f"Checking/Downloading files for {YEAR}...")


for month in tqdm(range(1, 13), unit="file"):
    
    # Define standardized filename for both local path and URL
    file_name = f"yellow_tripdata_{YEAR}-{month:02d}.parquet"
    local_path = os.path.join(DATA_DIR, file_name)
    url = f"https://d37ci6vzurychx.cloudfront.net/trip-data/{file_name}"

    if not os.path.exists(local_path):
        try:
            with requests.get(url, stream=True) as response:
                response.raise_for_status()
                with open(local_path, 'wb') as f:
                    for chunk in response.iter_content(chunk_size=8192):
                        f.write(chunk)
            time.sleep(1)
        except requests.exceptions.HTTPError as e:

            print(f"\nSkipping {file_name}: {e}")

            if os.path.exists(local_path):
                os.remove(local_path)

print("\nDownload complete.")

8. 택시 운행 데이터 살펴보기

이제 데이터 세트를 다운로드했으므로 초기 탐색적 데이터 분석 (EDA)을 수행할 차례입니다. EDA의 목표는 데이터의 구조를 이해하고, 이상치를 찾고, 잠재적인 패턴을 발견하는 것입니다.

단일 월의 데이터 로드

먼저 한 달 분량의 데이터를 로드합니다. 이렇게 하면 대화형 분석을 위해 메모리 사용량을 관리할 수 있는 동시에 유의미한 샘플 (3백만 개 이상의 행)을 제공할 수 있습니다.

import pandas as pd
import glob

# Load the last month of the downloaded data
df = pd.read_parquet("nyc_taxi_data/yellow_tripdata_2024-12.parquet")
df.head()

요약 통계 가져오기

.describe() 메서드를 사용하여 숫자 열에 대한 대략적인 요약 통계를 생성합니다. 예상치 못한 최솟값 또는 최댓값과 같은 잠재적인 데이터 품질 문제를 파악하는 데 유용한 첫 번째 단계입니다.

df.describe().round(2)

요약 통계를 표시합니다.

데이터 품질 조사

.describe()의 출력에서 즉시 문제가 드러납니다. tpep_pickup_datetimetpep_dropoff_datetimemin 값이 2008년으로 되어 있는데, 이는 2024년 데이터 세트에는 적합하지 않습니다.

이는 항상 데이터를 검사해야 하는 이유를 보여주는 예입니다. DataFrame을 정렬하여 이러한 이상치 날짜가 포함된 정확한 행을 찾아 자세히 조사할 수 있습니다.

# Sort by the dropoff datetime to see the oldest records
df.sort_values("tpep_pickup_datetime").head()

데이터 분포 시각화

다음으로 숫자 열의 히스토그램을 만들어 분포를 시각화할 수 있습니다. 이를 통해 trip_distance, fare_amount과 같은 기능의 분포와 왜곡을 파악할 수 있습니다. .hist() 함수는 DataFrame의 모든 숫자 열에 대한 히스토그램을 빠르게 플롯하는 방법입니다.

_ = df.hist(figsize=(20, 20))

마지막으로 분산형 행렬을 생성하여 몇 가지 주요 열 간의 관계를 시각화합니다. 수백만 개의 점을 표시하는 것은 느리고 패턴을 가릴 수 있으므로 .sample()를 사용하여 100,000개 행의 무작위 샘플에서 플롯을 만듭니다.

_ = pd.plotting.scatter_matrix(
    df[['passenger_count', 'trip_distance', 'tip_amount', 'total_amount']].sample(100_000),
    diagonal="kde",
    figsize=(15, 15)
)

9. Parquet 파일 형식을 사용하는 이유

NYC 택시 데이터 세트는 Apache Parquet 형식으로 제공됩니다. 이는 대규모 분석을 위해 의도적으로 선택한 것입니다. Parquet은 CSV와 같은 파일 형식에 비해 다음과 같은 여러 장점이 있습니다.

  • 효율적이고 빠름: Parquet는 열 형식으로 저장하고 읽는 데 매우 효율적입니다. 특히 GPU에서 파일 크기를 줄이고 I/O를 크게 가속화하는 최신 압축 방법을 지원합니다.
  • 스키마 유지: Parquet은 파일의 메타데이터에 데이터 유형을 저장합니다. 파일을 읽을 때 데이터 유형을 추측할 필요가 없습니다.
  • 선택적 읽기 지원: 열 구조를 사용하면 분석에 필요한 특정 열만 읽을 수 있습니다. 이렇게 하면 메모리에 로드해야 하는 데이터의 양을 크게 줄일 수 있습니다.

Parquet 기능 살펴보기

다운로드한 파일 중 하나를 사용하여 이러한 강력한 기능 두 가지를 살펴보겠습니다.

전체 데이터 세트를 로드하지 않고 메타데이터 검사

표준 텍스트 편집기에서 Parquet 파일을 볼 수는 없지만 메모리에 데이터를 로드하지 않고도 스키마와 메타데이터를 쉽게 검사할 수 있습니다. 파일의 구조를 빠르게 이해하는 데 유용합니다.

from pyarrow.parquet import ParquetFile
import pyarrow as pa

# Open one of the downloaded files
pf = ParquetFile('nyc_taxi_data/yellow_tripdata_2024-12.parquet')

# Print the schema
print("File Schema:")
print(pf.schema)

# Print the file metadata
print("\nFile Metadata:")
print(pf.metadata)

필요한 열만 읽기

이동 거리와 요금만 분석해야 한다고 가정해 보겠습니다. Parquet를 사용하면 이러한 열만 로드할 수 있으므로 전체 DataFrame을 로드하는 것보다 훨씬 빠르고 메모리 효율성이 높습니다.

import pandas as pd

# Read only four specific columns from the Parquet file
df_subset = pd.read_parquet(
    'nyc_taxi_data/yellow_tripdata_2024-12.parquet',
    columns=['passenger_count', 'trip_distance', 'tip_amount', 'total_amount']
)

df_subset.head()

10. NVIDIA cuDF로 pandas 가속화

NVIDIA CUDA for DataFrames (cuDF)는 DataFrame과 상호작용할 수 있는 오픈소스 GPU 가속 라이브러리입니다. cuDF를 사용하면 대규모 병렬 처리를 통해 GPU에서 필터링, 조인, 그룹화와 같은 일반적인 데이터 작업을 실행할 수 있습니다.

이 Codelab에서 사용하는 주요 기능은 cudf.pandas 가속기 모드입니다. 이 기능을 사용 설정하면 코드를 변경하지 않아도 표준 pandas 코드가 GPU 기반 cuDF 커널을 사용하도록 자동으로 리디렉션됩니다.

GPU 가속 사용 설정

Colab Enterprise 노트북에서 NVIDIA cuDF를 사용하려면 pandas를 가져오기 전에 매직 확장 프로그램을 로드합니다.

먼저 표준 pandas 라이브러리를 검사합니다. 출력에 기본 pandas 설치 경로가 표시됩니다.

import pandas as pd
pd # Note the output for the standard pandas library

이제 cudf.pandas 확장 프로그램을 로드하고 pandas을 다시 가져옵니다. pd 모듈의 출력이 어떻게 변경되는지 확인합니다. 이렇게 하면 GPU 가속 버전이 활성화되었는지 확인할 수 있습니다.

%load_ext cudf.pandas
import pandas as pd
pd # Note the new output, indicating cudf.pandas is active

cudf.pandas를 사용 설정하는 다른 방법

매직 명령어 (%load_ext)는 노트북에서 가장 쉬운 방법이지만 다른 환경에서도 가속기를 사용 설정할 수 있습니다.

  • Python 스크립트: pandas 가져오기 전에 import cudf.pandascudf.pandas.install()를 호출합니다.
  • 노트북이 아닌 환경: python -m cudf.pandas your_script.py를 사용하여 스크립트를 실행합니다.

11. CPU와 GPU 성능 비교

이제 가장 중요한 부분인 CPU의 표준 pandas 성능과 GPU의 cudf.pandas 성능을 비교해 보겠습니다.

CPU의 완전한 공정성을 보장하려면 먼저 Colab 런타임을 재설정해야 합니다. 이렇게 하면 이전 섹션에서 사용 설정한 GPU 가속기가 모두 삭제됩니다. 다음 셀을 실행하거나 런타임 메뉴에서 세션 다시 시작을 선택하여 런타임을 다시 시작할 수 있습니다.

import IPython

IPython.Application.instance().kernel.do_shutdown(True)

분석 파이프라인 정의

이제 환경이 정리되었으므로 벤치마킹 함수를 정의합니다. 이 함수를 사용하면 전달된 pandas 모듈을 사용하여 로드, 정렬, 요약 등 정확히 동일한 파이프라인을 실행할 수 있습니다.

import time
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def run_analytics_pipeline(pd_module):
    """Loads, sorts, and summarizes data using the provided pandas module."""
    timings = {}

    # 1. Load all 2024 Parquet files from the directory
    t0 = time.time()
    df = pd_module.concat(
        [pd_module.read_parquet(f) for f in glob.glob("nyc_taxi_data/*_2024*.parquet")],
        ignore_index=True
    )
    timings["load"] = time.time() - t0

    # 2. Sort the data by multiple columns
    t0 = time.time()
    df = df.sort_values(
        ['tpep_pickup_datetime', 'trip_distance', 'passenger_count'],
        ascending=[False, True, False]
    )
    timings["sort"] = time.time() - t0

    # 3. Perform a groupby and aggregation
    t0 = time.time()
    df['tpep_pickup_datetime'] = pd_module.to_datetime(df['tpep_pickup_datetime'])
    _ = (
        df.loc[df.tpep_pickup_datetime > '2024-11-01']
          .groupby(['VendorID', 'tpep_pickup_datetime'])
          [['passenger_count', 'fare_amount']]
          .agg(['min', 'mean', 'max'])
    )
    timings["summarize"] = time.time() - t0

    return timings

비교 실행

먼저 CPU에서 표준 pandas를 사용하여 파이프라인을 실행합니다. 그런 다음 cudf.pandas를 사용 설정하고 GPU에서 다시 실행합니다.

# --- Run on CPU ---
print("Running analytics pipeline on CPU...")
# Ensure we are using standard pandas
import pandas as pd
assert "cudf" not in str(pd), "Error: cuDF is still active. Please restart the kernel."

cpu_times = run_analytics_pipeline(pd)
print(f"CPU times: {cpu_times}")

# --- Run on GPU ---
print("\nEnabling cudf.pandas and running on GPU...")
# Load the extension
%load_ext cudf.pandas
import pandas as gpu_pd

gpu_times = run_analytics_pipeline(gpu_pd)
print(f"GPU times: {gpu_times}")

결과 시각화

마지막으로 차이를 시각화합니다. 다음 코드는 각 작업의 속도 향상을 계산하고 나란히 표시합니다.

# Create a DataFrame for plotting
results_df = pd.DataFrame([cpu_times, gpu_times], index=["CPU", "GPU"]).T
total_cpu_time = results_df['CPU'].sum()
total_gpu_time = results_df['GPU'].sum()
speedup = total_cpu_time / total_gpu_time

print("--- Performance Results ---")
print(results_df)
print(f"\nTotal CPU Time: {total_cpu_time:.2f} seconds")
print(f"Total GPU Time: {total_gpu_time:.2f} seconds")
print(f"Overall Speedup: {speedup:.2f}x")

# Plot the results
fig, ax = plt.subplots(figsize=(10, 6))
results_df.plot(kind='bar', ax=ax, color={"CPU": "tab:blue", "GPU": "tab:green"})

ax.set_ylabel("Time (seconds)")
ax.set_title(f"CPU vs. GPU Runtimes (Overall Speedup: {speedup:.2f}x)", fontsize=14)
ax.tick_params(axis='x', rotation=0)

# Add numerical labels to the bars
for container in ax.containers:
    ax.bar_label(container, fmt="%.2f", padding=3)

plt.tight_layout()
plt.show()

결과 샘플은 다음과 같습니다.

CPU와 GPU 성능을 표시합니다.

GPU는 CPU에 비해 명확한 속도 향상을 제공합니다.

12. 코드를 프로파일링하여 병목 현상 찾기

GPU 가속을 사용하더라도 일부 pandas 작업은 cuDF에서 아직 지원되지 않는 경우 CPU로 대체될 수 있습니다. 이러한 'CPU 대체'는 성능 병목 현상이 될 수 있습니다.

이러한 영역을 식별할 수 있도록 cudf.pandas에는 두 개의 기본 프로파일러가 포함되어 있습니다. 이를 사용하면 코드의 어떤 부분이 GPU에서 실행되고 어떤 부분이 CPU로 대체되는지 정확히 확인할 수 있습니다.

  • %%cudf.pandas.profile: 코드의 함수별 개요를 간략하게 설명하는 데 사용합니다. 어떤 기기에서 어떤 작업이 실행되고 있는지 빠르게 파악하는 데 가장 적합합니다.
  • %%cudf.pandas.line_profile: 자세한 행별 분석에 사용합니다. CPU로 대체되는 코드를 정확하게 찾아내는 데 가장 적합한 도구입니다.

이러한 프로파일러를 노트북 셀 상단에서 '셀 매직'으로 사용합니다.

%%cudf.pandas.profile를 사용한 함수 수준 프로파일링

먼저 이전 섹션의 동일한 분석 파이프라인에서 함수 수준 프로파일러를 실행합니다. 출력에는 호출된 모든 함수, 실행된 기기 (GPU 또는 CPU), 호출된 횟수가 표로 표시됩니다.

%load_ext cudf.pandas
import pandas as pd
import glob

pd.DataFrame({"a": [1]})

cudf.pandas가 활성 상태인지 확인한 후 프로필을 실행할 수 있습니다.

%%cudf.pandas.profile

df = pd.concat([pd.read_parquet(f) for f in glob.glob("nyc_taxi_data/*2024*.parquet")], ignore_index=True)

df = df.sort_values(['tpep_pickup_datetime', 'trip_distance', 'passenger_count'], ascending=[False, True, False])

summary = (
    df
        .loc[(df.tpep_pickup_datetime > '2024-11-01')]
        .groupby(['VendorID','tpep_pickup_datetime'])
        [['passenger_count', 'fare_amount']]
        .agg(['min', 'mean', 'max'])
)

Pandas 프로파일링 정보를 표시합니다.

%%cudf.pandas.line_profile를 사용한 라인별 프로파일링

그런 다음 라인 수준 프로파일러를 실행합니다. 이렇게 하면 각 코드 줄이 GPU에서 실행되는 데 걸린 시간과 CPU에서 실행되는 데 걸린 시간을 보여주는 훨씬 더 세부적인 보기가 표시됩니다. 이 방법은 최적화할 특정 병목 현상을 찾는 데 가장 효과적입니다.

%%cudf.pandas.line_profile

df = pd.concat([pd.read_parquet(f) for f in glob.glob("nyc_taxi_data/*2024*.parquet")], ignore_index=True)

df = df.sort_values(['tpep_pickup_datetime', 'trip_distance', 'passenger_count'], ascending=[False, True, False])

summary = (
    df
        .loc[(df.tpep_pickup_datetime > '2024-11-01')]
        .groupby(['VendorID','tpep_pickup_datetime'])
        [['passenger_count', 'fare_amount']]
        .agg(['min', 'mean', 'max'])
)

pandas 프로파일링 (줄별) 정보를 표시합니다.

명령줄에서 프로파일링

이러한 프로파일러는 명령줄에서도 사용할 수 있으므로 Python 스크립트의 자동화된 테스트 및 프로파일링에 유용합니다.

명령줄 인터페이스에서 다음을 사용할 수 있습니다.

  • python -m cudf.pandas --profile your_script.py
  • python -m cudf.pandas --line_profile your_script.py

13. Google Cloud Storage와 통합

Google Cloud Storage (GCS)는 확장 가능하고 내구성이 우수한 객체 스토리지 서비스입니다. Colab Enterprise를 사용할 때 GCS는 데이터 세트, 모델 체크포인트, 기타 아티팩트를 저장하기에 적합한 위치입니다.

Colab Enterprise 런타임에는 GCS 버킷에 직접 데이터를 읽고 쓸 수 있는 필요한 권한이 있으며 이러한 작업은 최대 성능을 위해 GPU로 가속화됩니다.

GCS 버킷 만들기

먼저 새 GCS 버킷을 만듭니다. GCS 버킷 이름은 전역적으로 고유하므로 이름에 UUID를 추가합니다.

from google.cloud import storage
import uuid

unique_suffix = uuid.uuid4().hex[:12]
bucket_name = f'nyc-taxi-codelab-{unique_suffix}'
project_id = storage.Client().project

client = storage.Client()

try:
    bucket = client.create_bucket(bucket_name)
    print(f"Successfully created bucket: gs://{bucket.name}")
except Exception as e:
    print(f"Bucket creation failed. You may already own it or the name is taken: {e}")

GCS에 직접 데이터 쓰기

이제 DataFrame을 새 GCS 버킷에 직접 저장합니다. 이전 섹션에서 df 변수를 사용할 수 없는 경우 코드는 먼저 한 달의 데이터를 로드합니다.

%%cudf.pandas.line_profile

# Ensure the DataFrame exists before saving to GCS
if 'df' not in locals():
    print("DataFrame not found, loading a sample file...")
    df = pd.read_parquet('nyc_taxi_data/yellow_tripdata_2024-12.parquet')

print(f"Writing data to gs://{bucket_name}/nyc_taxi_data.parquet...")
df.to_parquet(f"gs://{bucket_name}/nyc_taxi_data.parquet", index=False)
print("Write operation complete.")

GCS에서 파일 확인

버킷을 방문하여 데이터가 GCS에 있는지 확인할 수 있습니다. 다음 코드는 클릭 가능한 링크를 만듭니다.

from IPython.display import Markdown

gcs_url = f"https://console.cloud.google.com/storage/browser/{bucket_name}?project={project_id}"
Markdown(f'**[Click here to view your GCS bucket in the Google Cloud Console]({gcs_url})**')

GCS에서 직접 데이터 읽기

마지막으로 GCS 경로에서 DataFrame으로 직접 데이터를 읽습니다. 이 작업은 GPU로도 가속화되므로 클라우드 스토리지에서 대규모 데이터 세트를 빠른 속도로 로드할 수 있습니다.

%%cudf.pandas.line_profile

print(f"Reading data from gs://{bucket_name}/nyc_taxi_data.parquet...")
df_from_gcs = pd.read_parquet(f"gs://{bucket_name}/nyc_taxi_data.parquet")

df_from_gcs.head()

14. 삭제

Google Cloud 계정에 예기치 않은 요금이 청구되지 않도록 하려면 만든 리소스를 삭제해야 합니다.

다운로드한 데이터를 삭제합니다.

# Permanately delete the GCS bucket
print(f"Deleting GCS bucket: gs://{bucket_name}...")
!gsutil rm -r -f gs://{bucket_name}
print("Bucket deleted.")

# Remove NYC taxi dataset on the Colab runtime
print("Deleting local 'nyc_taxi_data' directory...")
!rm -rf nyc_taxi_data
print("Local files deleted.")

Colab 런타임 종료

  • Google Cloud 콘솔에서 Colab Enterprise Runtimes 페이지로 이동합니다.
  • 리전 메뉴에서 런타임이 포함된 리전을 선택합니다.
  • 삭제하려는 런타임을 선택합니다.
  • 삭제를 클릭합니다.
  • 확인을 클릭합니다.

노트북 삭제

  • Google Cloud 콘솔에서 Colab Enterprise 내 노트북 페이지로 이동합니다.
  • 리전 메뉴에서 노트북이 포함된 리전을 선택합니다.
  • 삭제할 노트북을 선택합니다.
  • 삭제를 클릭합니다.
  • 확인을 클릭합니다.

15. 축하합니다

축하합니다. Colab Enterprise에서 NVIDIA cuDF를 사용하여 Pandas 분석 워크플로를 가속화했습니다. GPU 지원 런타임을 구성하고, 코드 변경이 없는 가속을 위해 cudf.pandas를 사용 설정하고, 병목 현상을 위해 코드를 프로파일링하고, Google Cloud Storage와 통합하는 방법을 알아보았습니다.

참조 문서