Skip to main content

Daft를 활용한 고성능 데이터 처리 파이프라인 구축 가이드

오늘날의 데이터 환경은 과거 어느 때보다 복잡하고 방대해졌습니다. 기업들은 데이터 기반 의사 결정을 내리기 위해 다양한 소스에서 데이터를 수집하고 처리해야 합니다. 이러한 요구 사항을 충족하기 위해서는 고성능의 효율적인 데이터 처리 파이프라인이 필수적입니다. Python 생태계는 이러한 요구 사항을 충족할 수 있는 다양한 도구와 라이브러리를 제공하며, 최근 주목받고 있는 Daft는 이러한 트렌드를 선도하는 혁신적인 기술입니다.

Daft는 Python을 네이티브로 지원하는 고성능 데이터 엔진으로, 분산 컴퓨팅 환경에서 데이터 처리 작업을 효율적으로 수행할 수 있도록 설계되었습니다. 이 튜토리얼에서는 Daft를 사용하여 MNIST 데이터셋을 기반으로 하는 엔드투엔드 분석 파이프라인을 구축하는 방법을 단계별로 안내합니다. UDF(User-Defined Function), 특징 엔지니어링, 집계, 조인, 지연 실행 등 다양한 기능을 활용하여 데이터 처리 파이프라인을 구축하고, 이를 통해 모델 준비 상태의 데이터를 생성하는 방법을 배우게 됩니다. 이 튜토리얼을 통해 여러분은 Daft의 강력한 기능을 경험하고, 실제 데이터 처리 프로젝트에 적용할 수 있는 실질적인 기술을 습득할 수 있을 것입니다. 특히, **데이터 처리** 과정에서의 효율성을 극대화하는 방법을 익힐 수 있습니다.

1단계: Daft 설치 및 환경 설정

먼저 Daft를 설치하고 필요한 라이브러리를 설정합니다. Google Colab 환경에서 Daft와 pyarrow, pandas, numpy, scikit-learn을 설치하여 깨끗하고 재현 가능한 환경을 구축합니다. Daft 버전 확인을 통해 모든 설정이 올바르게 작동하는지 검증합니다. 이는 안정적인 **데이터 처리** 파이프라인 구축의 기반이 됩니다.

pip -q install daft pyarrow pandas numpy scikit-learn
import os
os.environ["DO_NOT_TRACK"] = "true"

import numpy as np
import pandas as pd
import daft
from daft import col

print("Daft version:", getattr(daft, "__version__", "unknown"))

2단계: MNIST 데이터셋 로딩 및 초기 탐색

다음으로, Github에서 직접 MNIST 데이터셋을 로딩합니다. Daft의 native reader를 사용하여 원격 URL에서 JSON 데이터를 읽어 들입니다. 데이터셋의 스키마를 검사하고, 데이터의 구조와 컬럼 유형을 이해하기 위해 몇 개의 샘플 데이터를 미리 봅니다. 이러한 과정을 통해 **데이터 처리** 전에 데이터셋의 내용을 정확히 파악할 수 있습니다.

URL = "https://github.com/Eventual-Inc/mnist-json/raw/master/mnist_handwritten_test.json.gz"

df = daft.read_json(URL)
print("
Schema (sampled):")
print(df.schema())

print("
Peek:")
df.show(5)

3단계: 이미지 데이터 변환 및 특징 엔지니어링

원본 이미지를 모델 학습에 적합한 형태로 변환하는 과정입니다. 먼저 raw 픽셀 배열을 28×28 크기의 이미지로 reshape 합니다. 그런 다음 이미지의 평균과 표준편차와 같은 간단한 통계적 특징을 계산합니다. 이 단계는 **데이터 처리** 과정에서 매우 중요한 부분으로, raw 데이터의 형태를 구조화하고 모델에 적합한 표현으로 변환하는 데 기여합니다. 또한 UDF를 사용하여 더 복잡한 특징을 추출합니다.

def to_28x28(pixels):
   arr = np.array(pixels, dtype=np.float32)
   if arr.size != 784:
       return None
   return arr.reshape(28, 28)

df2 = (
   df
   .with_column(
       "img_28x28",
       col("image").apply(to_28x28, return_dtype=daft.DataType.python())
   )
   .with_column(
       "pixel_mean",
       col("img_28x28").apply(lambda x: float(np.mean(x)) if x is not None else None,
                              return_dtype=daft.DataType.float32())
   )
   .with_column(
       "pixel_std",
       col("img_28x28").apply(lambda x: float(np.std(x)) if x is not None else None,
                              return_dtype=daft.DataType.float32())
   )
)

print("
After reshaping + simple features:")
df2.select("label", "pixel_mean", "pixel_std").show(5)

4단계: 데이터 집계 및 조인

데이터셋 내의 레이블 분포를 파악하고, 레이블별 픽셀 평균 및 표준편차와 같은 요약 통계를 계산합니다. 이러한 요약 통계를 원래 데이터셋에 조인하여 각 데이터 포인트에 대한 컨텍스트 정보를 추가합니다. 이 단계는 **데이터 처리** 과정에서 데이터 간의 관계를 파악하고, 보다 풍부한 정보를 제공하는 데 유용합니다.

@daft.udf(return_dtype=daft.DataType.list(daft.DataType.float32()), batch_size=512)
def featurize(images_28x28):
   out = []
   for img in images_28x28.to_pylist():
       if img is None:
           out.append(None)
           continue
       img = np.asarray(img, dtype=np.float32)
       row_sums = img.sum(axis=1) / 255.0
       col_sums = img.sum(axis=0) / 255.0
       total = img.sum() + 1e-6
       ys, xs = np.indices(img.shape)
       cy = float((ys * img).sum() / total) / 28.0
       cx = float((xs * img).sum() / total) / 28.0
       vec = np.concatenate([row_sums, col_sums, np.array([cy, cx, img.mean()/255.0, img.std()/255.0], dtype=np.float32)])
       out.append(vec.astype(np.float32).tolist())
   return out

df3 = df2.with_column("features", featurize(col("img_28x28")))

print("
Feature column created (list[float]):")
df3.select("label", "features").show(2)

5단계: 모델 학습 및 평가

Feature Engineering을 거친 데이터셋을 사용하여 Logistic Regression 모델을 학습시키고 성능을 평가합니다. 정확도, 정밀도, 재현율, F1 점수 등의 지표를 통해 모델의 성능을 측정하고, **데이터 처리** 과정에서 생성된 특징의 유용성을 검증합니다. 또한, 모델의 예측 결과를 바탕으로 데이터셋에 대한 추가적인 분석을 수행할 수 있습니다. 이러한 과정을 통해 **데이터 처리** 파이프라인의 효율성을 극대화할 수 있습니다.

6단계: 결과 저장 및 재사용

처리된 데이터를 Parquet 형식으로 저장하여 후속 작업에서 쉽게 재사용할 수 있도록 합니다. Parquet 형식은 압축률이 높고 쿼리 성능이 우수하여 대규모 데이터셋을 효율적으로 관리할 수 있습니다. 또한, 저장된 데이터셋을 다시 읽어 들여 데이터 처리 파이프라인의 모든 단계를 재현할 수 있습니다. **데이터 처리** 결과의 재사용성을 높여 효율적인 데이터 분석 환경을 구축합니다.

이 튜토리얼은 Daft를 사용하여 고성능 **데이터 처리** 파이프라인을 구축하는 과정을 보여줍니다. Daft는 복잡한 데이터 처리 작업을 효율적으로 수행할 수 있도록 설계되었으며, Pythonic한 인터페이스와 확장 가능한 실행 엔진을 제공합니다. 이러한 특징들은 Daft를 데이터 엔지니어링 및 머신 러닝 워크플로우에 적합한 강력한 도구로 만듭니다.

이 튜토리얼을 통해 Daft의 강력한 기능을 경험하고, 실제 데이터 처리 프로젝트에 적용할 수 있는 실질적인 기술을 습득할 수 있기를 바랍니다.

Check out the Full Codes here. Also, feel free to follow us on Twitter and don’t forget to join our 120k+ ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.

심층 분석 및 시사점

Array

원문 출처: A Coding Guide to Build a Scalable End-to-End Machine Learning Data Pipeline Using Daft for High-Performance Structured and Image Data Processing

Chinese 中文