Python for AI, Embedded/Deep Learning: PyTorch & AI Modeling

딥러닝 대용량 데이터셋 처리: 메모리 부족 해결 및 학습 속도 최적화 가이드

임베디드 친구 2026. 4. 22. 20:52
반응형

딥러닝 모델을 학습할 때 대용량 데이터셋을 효율적으로 처리하는 것은 매우 중요한 문제입니다. 데이터가 많아질수록 모델의 성능이 좋아질 가능성이 높지만, 적절한 방식으로 처리하지 않으면 메모리 부족, 학습 속도 저하 등의 문제가 발생할 수 있습니다. 본 포스팅에서는 대용량 데이터셋을 효과적으로 처리하는 방법에 대해 자세히 설명하겠습니다.

1. 데이터 로딩 최적화

대용량 데이터셋을 처리할 때는 데이터를 효율적으로 로딩하는 것이 중요합니다. 일반적으로 다음과 같은 방법을 사용할 수 있습니다.

1.1 데이터셋 샘플링

모든 데이터를 한 번에 처리하는 것이 어려울 경우, 데이터를 일부만 샘플링하여 모델을 학습하는 방법을 고려할 수 있습니다. 대표적인 샘플링 기법은 다음과 같습니다.

  • 랜덤 샘플링(Random Sampling): 전체 데이터에서 무작위로 일정 비율을 선택하여 사용
  • 계층 샘플링(Stratified Sampling): 클래스 분포를 유지하면서 데이터를 샘플링
  • 순차 샘플링(Sequential Sampling): 특정 구간의 데이터를 선택하여 학습에 사용
import pandas as pd

# 데이터 불러오기
df = pd.read_csv("large_dataset.csv")

# 데이터의 10%만 랜덤 샘플링
sampled_df = df.sample(frac=0.1, random_state=42)

1.2 데이터셋을 배치 단위로 로딩

한 번에 모든 데이터를 메모리에 적재하는 것은 비효율적이며, Out of Memory(OOM) 오류를 유발할 수 있습니다. 따라서 배치(batch) 단위로 데이터를 로딩하는 것이 중요합니다.

from torch.utils.data import DataLoader, Dataset

class LargeDataset(Dataset):
    def __init__(self, file_path):
        self.data = pd.read_csv(file_path, chunksize=10000)  # 데이터 청크 단위 로드

    def __getitem__(self, index):
        return self.data.iloc[index]

    def __len__(self):
        return len(self.data)

# DataLoader 사용
dataloader = DataLoader(LargeDataset("large_dataset.csv"), batch_size=32, shuffle=True)

PyTorch의 DataLoader를 사용하면 배치 단위로 데이터를 로딩하면서 메모리 사용량을 줄일 수 있습니다.

2. 데이터 전처리 최적화

대용량 데이터셋을 다룰 때는 효율적인 데이터 전처리가 필수적입니다.

2.1 데이터 변환을 사전에 수행

데이터 변환(예: 이미지 크기 조정, 정규화 등)은 모델 학습 시에 수행하는 것보다 사전에 한 번만 변환하여 저장하는 것이 효율적입니다.

import cv2
import glob

file_list = glob.glob("images/*.jpg")

for file in file_list:
    img = cv2.imread(file)
    img_resized = cv2.resize(img, (224, 224))
    cv2.imwrite(f"processed/{file.split('/')[-1]}", img_resized)

이렇게 사전에 데이터를 변환하면 학습 중 불필요한 연산을 줄일 수 있습니다.

2.2 병렬 처리 및 멀티스레딩 활용

Python의 multiprocessing 모듈을 활용하면 여러 개의 프로세스를 동시에 실행하여 데이터 전처리 속도를 높일 수 있습니다.

import multiprocessing as mp

def process_data(file):
    df = pd.read_csv(file)
    df["normalized_col"] = (df["col"] - df["col"].mean()) / df["col"].std()
    df.to_csv(f"processed/{file}", index=False)

file_list = ["data1.csv", "data2.csv", "data3.csv"]

with mp.Pool(mp.cpu_count()) as pool:
    pool.map(process_data, file_list)

3. 데이터 저장 및 캐싱

3.1 HDF5 또는 Parquet 포맷 활용

CSV 파일은 메모리 사용량이 많고 로딩 속도가 느릴 수 있습니다. 대신 HDF5 또는 Parquet 같은 바이너리 포맷을 활용하면 속도를 크게 개선할 수 있습니다.

import pandas as pd

# CSV 데이터를 Parquet로 변환
csv_data = pd.read_csv("large_dataset.csv")
csv_data.to_parquet("large_dataset.parquet")

# Parquet 데이터 로딩
parquet_data = pd.read_parquet("large_dataset.parquet")

Parquet 파일은 CSV보다 로딩 속도가 빠르고 용량이 작아지는 장점이 있습니다.

3.2 메모리 캐싱 활용

반복적으로 사용하는 데이터는 캐싱하여 속도를 개선할 수 있습니다.

import joblib

# 데이터 저장
joblib.dump(csv_data, "cached_data.pkl")

# 데이터 불러오기
cached_data = joblib.load("cached_data.pkl")

4. 데이터 증강(Data Augmentation) 활용

데이터가 부족한 경우 데이터 증강을 통해 모델의 일반화 성능을 높일 수 있습니다. 특히 이미지 데이터에서는 torchvision이나 albumentations 같은 라이브러리를 활용하면 효과적입니다.

import torchvision.transforms as transforms
from PIL import Image

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(30),
    transforms.ToTensor()
])

image = Image.open("image.jpg")
transformed_image = transform(image)

5. 분산 처리 및 클라우드 활용

대용량 데이터셋을 로컬 환경에서 처리하기 어려운 경우, 분산 처리 프레임워크나 클라우드 서비스를 활용하는 것이 좋습니다.

5.1 Dask를 이용한 병렬 처리

Dask는 대용량 데이터 프레임을 효율적으로 처리할 수 있는 라이브러리입니다.

import dask.dataframe as dd

# Dask 데이터프레임 사용
df = dd.read_csv("large_dataset.csv")

# 연산 수행
df["new_col"] = df["col"] * 2

# 결과 저장
df.to_csv("processed_data/*.csv", index=False)

5.2 클라우드 기반 데이터 처리

AWS, GCP, Azure 같은 클라우드 서비스에서는 대용량 데이터를 효율적으로 처리할 수 있는 기능을 제공합니다. 예를 들어 Google Cloud의 BigQuery를 활용하면 수십억 개의 데이터 행을 빠르게 처리할 수 있습니다.

from google.cloud import bigquery

client = bigquery.Client()
query = "SELECT * FROM `my_project.my_dataset.my_table` WHERE value > 100"
df = client.query(query).to_dataframe()

결론

대용량 데이터셋을 효과적으로 처리하기 위해서는 적절한 데이터 로딩 방식, 전처리 최적화, 저장 방식 개선, 데이터 증강 기법 활용, 그리고 클라우드 및 분산 처리 기술을 적절히 조합하는 것이 중요합니다. 본 포스팅에서 소개한 기법을 활용하면 보다 효율적으로 딥러닝 모델을 학습할 수 있을 것입니다.

반응형