Big Data
빅데이터는 한 대의 머신에서 사용하는 도구로 처리하기에는 규모가 너무 크거나 빠르게 생성되거나 종류가 다양한 데이터입니다. 3V, MapReduce와 Spark, 현대 AI를 뒷받침하는 데이터셋을 다룹니다.
빅데이터란 크기, 유입 속도 또는 형식의 조합이 단일 머신과 기존 데이터베이스 도구로 저장하고 처리할 수 있는 범위를 넘어서는 데이터입니다. 따라서 빅데이터는 병렬 처리하는 머신 클러스터 전반에 분산됩니다. META Group의 분석가 Doug Laney는 2001년 이 과제를 세 가지 V로 설명했습니다. 데이터의 양인 볼륨, 데이터가 도착하고 처리되어야 하는 속도인 속도, 구조화된 테이블, 로그, 텍스트, 이미지, 오디오, 비디오가 섞인 형태인 다양성입니다. 이후 정의에는 데이터의 신뢰도를 뜻하는 진실성과 가치도 추가되었습니다. 머신러닝에서 빅데이터는 원재료이자 엔지니어링 과제입니다. 더 많은 학습 데이터로 모델을 개선할 수 있지만, 데이터를 수집하고 정제해 제공하는 파이프라인을 구축하는 데도 상당한 노력이 필요합니다.
AI와 컴퓨터 비전에서의 빅데이터#
딥러닝은 단일 디스크에 담기 어려울 정도로 큰 데이터셋과 함께 발전했습니다. 2009년에 소개된 ImageNet은 레이블이 지정된 이미지 1,400만 개 이상으로 확대되었으며, 1,000개 클래스 챌린지의 학습 이미지 128만 개로 학습한 합성곱 신경망 AlexNet은 2012년 대회에서 우승했습니다. 2023년 Segment Anything Model과 함께 공개된 Meta의 SA-1B 데이터셋에는 이미지 1,100만 개와 분할 마스크 11억 개가 포함되어 있으며, Meta는 텍스트 토큰 15조 개 이상으로 Llama 3를 사전 학습했습니다. 스케일링 법칙은 데이터, 파라미터, 연산량을 함께 늘리면 손실이 예측 가능한 방식으로 낮아지는 이유를 설명합니다.
컴퓨터 비전에서 데이터의 양은 카메라와 센서의 대규모 네트워크에서 비롯됩니다. 자율 주행차 한 대는 주행하는 매시간 카메라, 레이더, 라이다 데이터를 기록하며, 공장과 매장에는 연속적으로 영상을 전송하는 피드가 수천 개씩 추가됩니다. 교통이나 생산 라인 영상에 대한 실시간 추론처럼 데이터가 들어오는 즉시 결과가 필요한 경우에는 속도가 중요합니다. 다양성에는 이미지와 비디오뿐 아니라 어노테이션, 센서 메타데이터, 로그도 포함됩니다. 레이블이 정확해야만 데이터를 더 활용할 수 있으므로 대규모 비전 데이터셋을 구축하려면 데이터 정제, 중복 제거, 레이블을 지정할 가치가 있는 새 이미지를 선택하는 능동 학습이 필요합니다.
빅데이터의 저장 및 처리 방식#
빅데이터 시스템은 여러 범용 머신에 데이터와 연산을 분산하는 스케일아웃 방식으로 확장하며, 더 큰 서버 한 대를 사용하는 방식과 다릅니다. Google의 2004년 MapReduce 논문은 오픈 소스 Apache Hadoop을 통해 널리 보급된 모델을 설명했습니다. 입력을 샤드로 분할하고, 각 샤드를 저장한 머신에서 모든 샤드에 맵 함수를 병렬 실행한 다음 부분 결과를 리듀스해 답 하나로 합칩니다. 2009년 UC Berkeley에서 시작된 Apache Spark는 중간 결과를 메모리에 저장하므로 모델 학습과 같은 반복 작업을 디스크 기반 MapReduce보다 훨씬 빠르게 처리합니다. 원시 파일은 보통 데이터 레이크로 구성된 클라우드 객체 스토리지에 저장되며, Apache Parquet와 같은 컬럼형 형식을 사용하면 쿼리에 필요한 열만 읽을 수 있습니다. Apache Kafka와 같은 스트리밍 플랫폼은 고속 이벤트를 전달합니다.
이 예제는 Python 표준 라이브러리를 사용해 이미지 레이블 샤드 3개에서 맵 및 리듀스 단계를 실행합니다.
from collections import Counter
from multiprocessing import Pool
# 이미지 레이블 샤드 3개입니다. 클러스터는 각 샤드를 서로 다른 머신에 저장합니다.
shards = [
["car", "person", "car", "bus"],
["person", "person", "bicycle"],
["car", "person", "dog", "car"],
]
def count_labels(shard):
"""Map step: count the labels in one shard."""
return Counter(shard)
if __name__ == "__main__":
with Pool(processes=3) as pool:
partial_counts = pool.map(count_labels, shards) # 샤드마다 작업자 프로세스 하나를 사용합니다.
# 리듀스 단계: 부분 집계 결과를 하나의 총계로 병합합니다.
totals = sum(partial_counts, Counter())
print(totals.most_common())각 샤드는 별도의 프로세스에서 집계되며, 리듀스 단계는 부분 집계 결과를 [('car', 4), ('person', 4), ('bus', 1), ('bicycle', 1), ('dog', 1)]으로 병합합니다. Spark와 Hadoop은 같은 두 단계를 수천 대의 머신에서 실행하며, 각 샤드를 보관하는 머신에 맵 코드를 전송합니다.
빅데이터를 사용한 모델 학습#
학습 실행에서는 빅데이터를 배치 단위로 읽습니다. 데이터 로더는 로컬 디스크나 객체 스토리지에서 작업자 프로세스 여러 개를 통해 한 번에 수십~수백 개의 이미지를 디코딩하므로 전체 데이터셋을 메모리에 담을 필요가 없습니다. 분산 학습은 각 배치를 여러 GPU에 나눕니다. 객체 탐지에서 Google의 Open Images V7 탐지 데이터셋은 601개 클래스의 학습 이미지 174만 개로 구성되며, 다운로드 용량은 561GB로 대부분의 머신 RAM에 담기에는 너무 큽니다. cache="ram"를 사용해 데이터셋을 메모리에 캐시하도록 요청하면 Ultralytics YOLO 학습은 무작위 이미지 30개를 기준으로 디코딩된 크기를 추정하고, 추정치의 두 배가 사용 가능한 RAM에 들어갈 때만 캐시합니다. 더 큰 데이터셋은 매 에포크마다 디스크에서 읽어 디코딩합니다.










