LAION 5B 데이터셋

LAION 5B 데이터셋

58.5억 개의 이미지-텍스트 임베딩을 담은 대규모 데이터셋입니다. 대규모 벡터 검색 애플리케이션의 설계·용량·성능을 파악하고, 텍스트→이미지·이미지→이미지 검색을 실습하기에 좋습니다. 1000만 개 벡터 하위 집합을 ClickHouse의 공용 S3 버킷에서 바로 사용할 수 있어요.

출처: 문서

본문

소개 (Introduction)

LAION 5b 데이터셋은 58.5억 개의 이미지-텍스트 임베딩과 관련 이미지 메타데이터를 포함합니다. 임베딩은 Open AI CLIP 모델 ViT-L/14로 생성되었으며, 각 임베딩 벡터의 차원은 768입니다.

이 데이터셋은 대규모, 실제 세계의 벡터 검색 애플리케이션의 설계, 용량, 성능 측면을 모델링하는 데 사용할 수 있습니다. 텍스트→이미지 검색과 이미지→이미지 검색 모두에 사용할 수 있습니다.

데이터셋 상세 (Dataset details)

완전한 데이터셋은 opendatalab/laion5b-downloader로 내려받을 수 있습니다.

ClickHouse는 1000만 개 벡터의 하위 집합을 공용 S3 버킷에 공개했습니다. 이 하위 집합은 하나의 Parquet 파일에 저장되어 있습니다.

먼저 문서를 참고해 용량 산정(sizing) 작업을 수행해 이 데이터셋의 저장소 및 메모리 요구사항을 추정할 것을 권장합니다.

단계 (Steps)

  1. 테이블 생성

laion_5b_10m 테이블을 만들어 임베딩과 관련 속성을 저장하세요:

CREATE TABLE laion_5b_10m
(
    id UInt32,
    image_path String,
    caption String,
    NSFW Nullable(String) default 'unknown',
    similarity Float32,
    LICENSE Nullable(String),
    url String,
    key String,
    status LowCardinality(String),
    width Int32,
    height Int32,
    original_width Int32,
    original_height Int32,
    exif Nullable(String),
    md5 String,
    vector Array(Float32) CODEC(NONE)
) ENGINE = MergeTree ORDER BY (id)

id는 단순히 증가하는 정수입니다. 추가 속성들은 문서에서 설명하는 사후 필터링/사전 필터링과 결합한 벡터 유사도 검색을 이해하는 데 프레디킷으로 사용할 수 있습니다.

  1. 데이터 로드

데이터셋을 로드하려면 다음 SQL 문을 실행하세요:

INSERT INTO laion_5b_10m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet', NOSIGN);

테이블에 1000만 행을 로드하는 데는 몇 분이 걸릴 수 있습니다.

  1. 브루트포스 벡터 유사도 검색 실행

KNN(k-Nearest Neighbours) 검색 또는 브루트포스 검색은 데이터셋의 각 벡터와 검색 임베딩 벡터 사이의 거리를 계산한 뒤, 거리를 정렬해 가장 가까운 이웃을 구하는 방식입니다. 데이터셋의 벡터 하나를 검색 벡터로 사용할 수 있습니다. 예: Query

SELECT id, url 
FROM laion_5b_10m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
LIMIT 20

The vector in the row with id = 9999 is the embedding for an image of a Deli restaurant.

쿼리 지연 시간을 기록해 두어 벡터 인덱스를 사용한 ANN 쿼리 지연 시간과 비교하세요. 1000만 행에서 벡터 인덱스가 없는 위 쿼리는 완료하는 데 몇 초~몇 분이 걸릴 수 있습니다.

  1. 벡터 유사도 인덱스 구축

다음 SQL을 실행해 laion_5b_10m 테이블의 vector 컬럼에 벡터 유사도 인덱스를 정의하고 구축하세요:

ALTER TABLE laion_5b_10m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);

ALTER TABLE laion_5b_10m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;

인덱스 생성과 검색의 매개변수 및 성능 고려사항은 문서에 설명되어 있습니다. 위 문은 HNSW 하이퍼파라미터 Mef_construction에 각각 64와 512 값을 사용합니다. 인덱스 빌드 시간과 선택한 값에 따른 검색 결과 품질을 평가해 이 매개변수들의 최적 값을 신중하게 선택해야 합니다. 인덱스 구축과 저장은 사용 가능한 CPU 코어 수와 저장 대역폭에 따라 1000만 행 하위 집합에서 상당한 시간이 걸릴 수 있습니다.

  1. ANN 검색 수행

벡터 유사도 인덱스가 구축되면 벡터 검색 쿼리가 자동으로 인덱스를 사용합니다: Query

SELECT id, url 
FROM laion_5b_10m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
LIMIT 20

벡터 인덱스를 메모리에 처음 로드하는 데 몇 초~몇 분이 걸릴 수 있습니다.

  1. 검색 쿼리용 임베딩 생성

LAION 5b 데이터셋 임베딩 벡터는 OpenAI CLIP 모델 ViT-L/14로 생성되었습니다. 아래에 CLIP API를 사용해 프로그래밍 방식으로 임베딩 벡터를 생성하는 방법을 보여주는 예제 Python 스크립트가 있습니다. 생성된 검색 임베딩 벡터는 SELECT 쿼리의 cosineDistance() 함수에 인자로 전달됩니다. clip 패키지를 설치하려면 OpenAI GitHub 저장소를 참고하세요.

import torch
import clip
import numpy as np
import sys
import clickhouse_connect

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)

# Search for images that contain both a dog and a cat
text = clip.tokenize(["a dog and a cat"]).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    np_arr = text_features.detach().cpu().numpy()

    # Pass ClickHouse credentials here
    chclient = clickhouse_connect.get_client()

    params = {'v1': list(np_arr[0])}
    result = chclient.query("SELECT id, url FROM laion_5b_10m ORDER BY cosineDistance(vector, %(v1)s) LIMIT 100",
                            parameters=params)

    # Write the results to a simple HTML page that can be opened in the browser. Some URLs may have become obsolete.
    print("<html>")
    for r in result.result_rows:
        print("<img src = ", r[1], 'width="200" height="200">')
    print("</html>")

위 검색의 결과는 아래와 같습니다.

더 알아보기 (Learn more)