본문 바로가기
deeplearning/tensorflow(keras)

pandas GPU 서버에서 데이터 전처리 속도 높이는 법

by jinny-log 2025. 3. 11.

Pandas 기반으로 DataFrame을 읽고 전처리하는 과정에서 서버가 과부하되는 문제를 해결하려면 GPU를 활용한 병렬 처리메모리 최적화가 필요합니다.

현재 문제를 해결할 수 있는 효율적인 GPU 기반 데이터 처리 방법 4가지를 소개합니다.


1. CuDF (Pandas의 GPU 버전)로 변환하여 처리 속도 향상

Pandas는 기본적으로 CPU 기반이므로, GPU 최적화된 CuDF를 사용하면 10배 이상 빠르게 처리할 수 있습니다.

import cudf

# Pandas DataFrame을 CuDF로 변환 (GPU 메모리로 로드)
df = pd.read_csv("data.csv")  # 기존 방식 (CPU)
gdf = cudf.DataFrame.from_pandas(df)  # GPU 변환

# GPU에서 데이터 처리 (예제: 결측치 처리 및 정규화)
gdf = gdf.dropna()  # 결측치 제거 (Pandas와 동일한 문법)
gdf["scaled"] = (gdf["column"] - gdf["column"].min()) / (gdf["column"].max() - gdf["column"].min())  # MinMax Scaling

# 필요하면 다시 Pandas 변환 (CPU로 복귀)
df = gdf.to_pandas()

📌 장점:
Pandas와 거의 동일한 문법
GPU에서 병렬 처리 → 데이터 크기가 클수록 효과적
메모리 효율적 사용 → 서버 다운 방지

💡 추천 상황:

  • 데이터 전처리 과정이 너무 느릴 때
  • Pandas 코드 그대로 GPU로 전환하고 싶을 때

2. Dask를 활용한 병렬 처리 (CPU/GPU 둘 다 가능)

Pandas는 단일 코어로 동작하지만, Dask를 사용하면 멀티코어 & 분산 처리가 가능합니다.
데이터가 크다면 Dask + CuDF 조합으로 GPU에서 처리할 수도 있습니다.

import dask.dataframe as dd

# Dask DataFrame으로 변환 (대용량 데이터 병렬 처리)
ddf = dd.read_csv("data.csv")  

# 병렬로 결측치 제거 및 스케일링
ddf = ddf.dropna()
ddf["scaled"] = (ddf["column"] - ddf["column"].min()) / (ddf["column"].max() - ddf["column"].min())

# 연산 실행 (Lazy Execution)
df_result = ddf.compute()  # Pandas DataFrame으로 변환

📌 장점:
메모리 효율적 사용 (Out-of-Core Processing)
멀티코어 활용 (Pandas보다 훨씬 빠름)
데이터 크기가 RAM보다 커도 처리 가능

💡 추천 상황:

  • 데이터 크기가 수십 GB 이상으로 커질 때
  • Pandas가 메모리를 너무 많이 사용할 때
  • 멀티코어를 활용해서 빠르게 처리하고 싶을 때

3. Scikit-learn 대신 CuML로 스케일링

Pandas에서 StandardScaler, MinMaxScaler 같은 전처리를 할 때 sklearn.preprocessing을 사용하면 CPU 병목이 발생합니다.
CuML (cuml.preprocessing.StandardScaler)을 사용하면 GPU에서 빠르게 전처리 가능합니다.

import cudf
from cuml.preprocessing import StandardScaler

# CuDF로 변환
df = pd.read_csv("data.csv")
gdf = cudf.DataFrame.from_pandas(df)

# CuML을 사용한 GPU 기반 StandardScaler
scaler = StandardScaler()
gdf_scaled = scaler.fit_transform(gdf[["column1", "column2"]])

# 필요하면 다시 Pandas 변환
df_scaled = gdf_scaled.to_pandas()

📌 장점:
GPU로 전처리 속도 10~50배 증가
Scikit-learn 코드 그대로 사용 가능
대량 데이터 스케일링에 적합

💡 추천 상황:

  • Scikit-learn의 StandardScaler, MinMaxScaler를 사용 중이라면 GPU로 변환
  • 대량 데이터의 전처리 속도가 너무 느릴 때

4. PyTorch Tensor로 변환하여 GPU에서 직접 연산

만약 데이터가 TensorFlow 모델로 입력된다면, numpy를 torch.Tensor로 변환한 후 GPU에서 바로 처리하는 방법도 있습니다.

import torch

# NumPy 데이터를 GPU Tensor로 변환
np_data = np.random.rand(100000, 197).astype(np.float32)
torch_data = torch.tensor(np_data).cuda()

# GPU에서 전처리 연산 수행 (예제: 정규화)
torch_data = (torch_data - torch_data.min(dim=0)[0]) / (torch_data.max(dim=0)[0] - torch_data.min(dim=0)[0])

📌 장점:
GPU에서 직접 전처리 수행 가능
PyTorch 모델과 연계할 때 최적화
대량 데이터 변환 속도 빠름

💡 추천 상황:

  • TensorFlow/PyTorch 모델에 넣기 전 데이터를 빠르게 전처리하고 싶을 때
  • 모델이 GPU에서 돌아가므로, 전처리도 GPU에서 해결하려고 할 때

🚀 최적의 해결 방법 요약

방법 적용 기술 추천 상황

CuDF cudf.DataFrame Pandas 코드 그대로 GPU에서 빠르게 처리하고 싶을 때
Dask dask.dataframe 대용량 데이터(수 GB~TB)를 병렬로 처리해야 할 때
CuML cuml.preprocessing.StandardScaler Scikit-learn 전처리 속도가 너무 느릴 때
PyTorch Tensor torch.Tensor.cuda() 모델이 PyTorch/TensorFlow일 때, 전처리까지 GPU에서 하고 싶을 때

현재 서버가 뻗는 원인CPU에서 처리하는 Pandas 연산이 병목이 되기 때문입니다.
👉 Numpy + Pandas 기반의 전처리를 GPU로 이전하면 속도가 크게 향상됩니다.

🚀 추천 솔루션

  1. CuDF로 Pandas 변환 (가장 쉬운 해결책)
    import cudf
    df = cudf.read_csv("data.csv")
    df["scaled"] = (df["column"] - df["column"].min()) / (df["column"].max() - df["column"].min())
    
  2. CuML로 StandardScaler 적용 (Scikit-learn 대체)
    from cuml.preprocessing import StandardScaler
    scaler = StandardScaler()
    df_scaled = scaler.fit_transform(df[["column1", "column2"]])
    
  3. Dask로 병렬 처리 (메모리 초과 방지)
    import dask.dataframe as dd
    ddf = dd.read_csv("data.csv").dropna()
    ddf.compute()
    

이 방법들을 조합하면 서버가 뻗지 않으면서도 GPU를 최대한 활용한 전처리가 가능합니다! 🚀