Data Engineering/Data Infra & Process

[17편] 대규모 벡터 데이터 최적화 및 비용 절감 전략

ygtoken 2025. 3. 16. 17:45
728x90

 

이 글에서는 대규모 벡터 데이터를 효율적으로 저장하고 검색 성능을 최적화하는 방법을 다룹니다.

특히, 벡터 데이터 압축(Quantization), 차원 축소(PCA, Autoencoder), 클라우드 비용 최적화 전략을 중심으로 실무적인 접근법을 설명합니다.

 

벡터 데이터 압축(Quantization)을 활용한 저장 공간 절약

차원 축소(PCA, Autoencoder)로 검색 성능 개선

클라우드 환경에서 벡터 데이터 비용 절감 전략

 


🚀 1. 벡터 데이터 최적화가 필요한 이유

 

벡터 데이터는 일반적으로 1536차원(OpenAI), 768차원(Hugging Face) 등 매우 고차원이므로, 저장 비용 및 검색 속도 최적화가 필수적입니다.

 

대규모 벡터 데이터가 초래하는 문제점

 

문제점설명해결책

저장 공간 부족 1000만 개 벡터 저장 시 TB 단위 필요 벡터 압축(Quantization)
검색 속도 저하 고차원 벡터일수록 검색 시간이 증가 차원 축소(PCA, Autoencoder)
클라우드 비용 증가 S3, RDS 저장 비용이 급격히 상승 스토리지 비용 최적화

 

 


🚀 2. 벡터 데이터 압축(Quantization)

 

벡터 데이터 압축(Quantization)벡터의 정밀도를 줄여 저장 공간을 절약하는 기법입니다.

예를 들어, 32-bit float을 8-bit로 변환하면 저장 공간이 4배 절약됩니다.

 

🔹 1️⃣ PQ(Product Quantization) 적용

 

Product Quantization(PQ) 은 벡터를 여러 개의 작은 서브벡터로 나누고, 각 서브벡터를 압축하는 방법

높은 압축률을 유지하면서 검색 성능을 크게 향상

 

📌 FAISS 라이브러리 설치

pip install faiss-cpu

 

📌 Python 코드: PQ(Product Quantization) 적용

import faiss
import numpy as np

# 1M 개의 1536차원 벡터 생성 (예제)
vectors = np.random.rand(1000000, 1536).astype('float32')

# PQ를 사용하여 벡터 압축 (8개의 서브벡터, 256개의 코드북 사용)
d = 1536
m = 8
pq = faiss.IndexPQ(d, m, 256)
pq.train(vectors)
pq.add(vectors)

print(f"Original size: {vectors.nbytes / 1e6} MB")
print(f"Compressed size: {pq.codes.nbytes / 1e6} MB")

벡터 압축을 통해 저장 공간을 75% 이상 절약 가능

 


🔹 2️⃣ pgvector에서 벡터 데이터 정밀도 줄이기

 

📌 PostgreSQL에서 vector를 float8[] 대신 float4[]로 변환하여 저장 공간 절약

ALTER TABLE embeddings ALTER COLUMN embedding TYPE vector(1536) USING embedding::vector(1536)::float4[];

float8 → float4 변환을 통해 벡터 저장 공간 50% 이상 절약 가능

 


🚀 3. 차원 축소(PCA, Autoencoder)

 

🔹 1️⃣ PCA를 활용한 차원 축소

 

PCA(Principal Component Analysis) 는 벡터 데이터의 가장 중요한 특성만 유지하면서 차원을 줄이는 방법

1536차원 → 256차원으로 줄여도 검색 성능 유지 가능

 

📌 Python 코드: PCA를 활용한 벡터 차원 축소

from sklearn.decomposition import PCA

# 1536차원 벡터를 256차원으로 축소
pca = PCA(n_components=256)
reduced_vectors = pca.fit_transform(vectors)

print(f"Original shape: {vectors.shape}, Reduced shape: {reduced_vectors.shape}")

PCA를 활용하면 검색 속도 향상 + 저장 공간 절약 가능

 


🔹 2️⃣ Autoencoder를 활용한 차원 축소

 

Autoencoder는 신경망을 활용하여 벡터의 중요한 특징만 유지하면서 압축하는 방식

 

📌 Python 코드: Autoencoder로 벡터 차원 축소

import torch
import torch.nn as nn

class Autoencoder(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(input_dim, 512),
            nn.ReLU(),
            nn.Linear(512, latent_dim),
        )
        self.decoder = nn.Sequential(
            nn.Linear(latent_dim, 512),
            nn.ReLU(),
            nn.Linear(512, input_dim),
        )

    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded

# Autoencoder 모델 생성
input_dim = 1536
latent_dim = 256
model = Autoencoder(input_dim, latent_dim)

# 모델 학습 후 벡터 차원 축소
compressed_vectors = model.encoder(torch.tensor(vectors).float()).detach().numpy()
print(f"Original shape: {vectors.shape}, Compressed shape: {compressed_vectors.shape}")

Autoencoder를 활용하면 PCA보다 더 정밀한 벡터 축소 가능

 


🚀 4. 클라우드 환경에서 벡터 데이터 비용 절감 전략

 

🔹 1️⃣ S3 대신 AWS DynamoDB 또는 Google BigQuery 활용

 

✅ S3에 벡터 데이터를 저장하는 대신 DynamoDB 또는 BigQuery를 활용하면 비용 절감 가능

 

📌 DynamoDB를 활용한 벡터 저장

import boto3

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("vector_table")

table.put_item(Item={"id": "1", "embedding": compressed_vectors[0].tolist()})

DynamoDB는 S3보다 쿼리 속도가 빠르고 비용이 절감됨

 


🔹 2️⃣ 벡터 데이터 샤딩(Sharding) 적용

 

1000만 개 이상의 벡터 데이터를 저장할 경우, PostgreSQL을 샤딩하여 성능 최적화

 

📌 Citus 확장을 활용한 샤딩

CREATE EXTENSION citus;
SELECT create_distributed_table('embeddings', 'id');

샤딩을 활용하면 벡터 검색 성능이 크게 향상됨

 


🔹 3️⃣ pgvector에서 불필요한 벡터 데이터 정리

 

오래된 벡터 데이터를 자동으로 삭제하여 저장 공간 절약 가능

 

📌 6개월 이상 사용하지 않은 벡터 데이터 삭제

DELETE FROM embeddings WHERE created_at < NOW() - INTERVAL '6 months';

정기적인 데이터 삭제로 저장 비용 절감 가능

 


📌 5. 최종 정리

 

벡터 데이터 압축(Quantization)을 활용한 저장 공간 절약

차원 축소(PCA, Autoencoder)로 검색 성능 개선

클라우드 환경에서 벡터 데이터 비용 절감 전략 적용

728x90