이 프로젝트는 초기에 생산 준비가되지 않았습니다.
DynamoDB 위에 서버리스, 가볍고 빠른 벡터 저장
Whiplash는 AWS DynamoDB 위에 내장 된 경량 벡터 매장입니다. LSH (Locality-Sensitive Hashing)의 변형을 사용하여 DynamoDB 테이블에서 벡터를 인덱싱합니다. 이것은 모방주의, 확장 가능하며 빠른 벡터 매장으로 고안되며 사용, 유지 관리 및 자조 주최자가 매우 쉽습니다.
채찍질 할 몇 가지 주요 구성 요소가 있습니다.
pip install whiplash-client
# OR
poetry add whiplash-clientnpm install -g serverless
serverless install --url https://github.com/ericmillsio/whiplash
cd whiplash
npm install배포 준비 :
cp .env.example .env
# Change AWS_PROFILE within .env to your AWS profile
# Adjust other values if you wantAWS에 배포 :
serverless deploy --stage dev --region us-east-2예상 출력은 다음과 같습니다. 액세스 및 엔드 포인트를 사용할 API 키에 유의하십시오.
Running " serverless " from node_modules
Deploying whiplash to stage dev (us-east-2)
✔ Service deployed to stack whiplash-dev (64s)
api keys:
dev-api-key: < YOUR API KEY WILL BE HERE >
endpoints:
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items/batch
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items/{itemId}
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/search
functions:
getProject: whiplash-dev-getProject (12 kB)
createProject: whiplash-dev-createProject (12 kB)
listProjects: whiplash-dev-listProjects (12 kB)
createCollection: whiplash-dev-createCollection (12 kB)
listCollections: whiplash-dev-listCollections (12 kB)
getCollection: whiplash-dev-getCollection (12 kB)
createItem: whiplash-dev-createItem (12 kB)
createItems: whiplash-dev-createItems (12 kB)
getItem: whiplash-dev-getItem (12 kB)
searchItems: whiplash-dev-searchItems (12 kB)Whiplash를 사용하는 방법에는 세 가지가 있습니다 : 직접 클라이언트, 서버리스 API 또는 API를 통해 프록시 라이브러리로.
도서관은 Whiplash를 사용하는 가장 유연한 방법입니다. 모든 Python 프로젝트에서 사용할 수 있으며 API를 배포하지 않고 Whiplash 위에 사용자 정의 응용 프로그램을 구축하는 데 사용할 수 있습니다. 테이블을 직접 관리합니다. 네트워크 대기 시간을 피하기 위해 AWS 내부에서 사용하는 것이 좋습니다. 그러나 테스트/평가에 외부에서 사용할 수 있습니다.
import numpy as np
from whiplash import Vector , Whiplash
# AWS_PROFILE must be set in environment variables for boto3
whiplash = Whiplash ( "us-east-2" , "dev" )
# First time only setup
whiplash . setup ()
collection = whiplash . create_collection ( "test_collection" , n_features = 3 )
# Insert a vector
item = Vector ( "some_id" , np . ndarray ([ 1 , 2 , 3 ]))
collection . insert ( item )
# Search for the inserted vector
result = collection . search ( item . vector , limit = 1 )Serverless API는 완전히 기능적인 마이크로 서비스이며 몇 가지 명령으로 AWS에 배포 할 수 있습니다. API는 서버리스 및 AWS Lambda를 사용하여 구축되었습니다.
API 엔드 포인트 :
/projects/projects/{projectId}/projects/{projectId}/collections/projects/{projectId}/collections/{collectionId}/projects/{projectId}/collections/{collectionId}/items/projects/{projectId}/collections/{collectionId}/items/{itemId}/projects/{projectId}/collections/{collectionId}/search필수 헤더 :
x-api-key: API_KEYContent-Type: application/jsonAPI와 직접 상호 작용하거나 Whiplash 클라이언트 라이브러리를 사용할 수 있습니다. API.YAML 파일은 우체국 또는 불면증과 함께 사용하기 위해 프로젝트에 포함되어 있습니다.
라이브러리를 사용하여 API를 통해 프록시 할 수 있습니다. 라이브러리를 사용하려고하지만 테이블을 직접 관리하고 싶지 않은 경우 권장됩니다. 이는 대량 삽입 작업을위한 직접 클라이언트 라이브러리보다 더 안정적이고 빠르지 만 단일 삽입 작업의 경우 속도가 느립니다 (AWS 지역 외부에서 호출한다고 가정).
API가 배포 된 경우에만 사용할 수 있습니다. 또한 Numpy 의존성을 피하지만 아직 패키지를 분해하지 않았습니다.
import time
from whiplash . api . client import Whiplash
query = [ 0.5472 ,...]
whiplash = Whiplash (
"https://API-ID.execute-api.us-east-2.amazonaws.com/STAGE" ,
"API_KEY" ,
)
collection = whiplash . get_collection ( "example" )
assert collection is not None
start = time . time ()
results = collection . search ( query )
print ( "Search took" , time . time () - start , "seconds" )
print ( "Results:" , results )Whiplash는 LSH (Locality-Sensitive Hashing)를 사용하여 DynamoDB 테이블에서 벡터를 인덱싱합니다. 이는 AWS 생산 등급 인프라 위에 구축 된 모방주의, 확장 가능하며 빠른 벡터 매장입니다.
Whiplash는 각 해시 키에 대해 다른 수의 비트를 사용한다는 점에서 기존 LSH와 다릅니다. 이를 통해 버킷 수를 동적 및 자동 조정할 수 있으므로 시간이 지남에 따라 인덱스를 확장 할 수 있습니다. 가장 작은 해시 키의 버킷이 DynamoDB 항목의 최대 크기에 가까운 경우 해시 기능/키의 새로운 레이어가 추가됩니다.
Whiplash는 여러 Dynamo 테이블을 사용하여 벡터와 버킷을 저장합니다.
PROJECT_STAGE_COLLECTION_vectors { vector_id: binary(vector) } 저장PROJECT_STAGE_COLLECTION_buckets { hash: set of vector_ids } 저장whiplash_metadata 각 컬렉션에 대한 메타 데이터 저장 { collection_id: { n_features: 256, uniform_planes: {0: [binary]} ...} }Whiplash는 무작위 투영을 해시 벡터에 버킷으로 사용합니다. 벡터는 임의의 평면 세트에 투사되며, 투영의 부호는 벡터의 평면의 어느 쪽을 결정합니다. 평면은 가우스 분포를 사용하여 생성되어 벡터가 균등하게 분포되도록합니다.
해시 키는 랜덤 투영의 부울 결과를 이진 스트링으로 변환 한 다음베이스 36으로 변환하여 생성됩니다.
poetry install
poetry run pytest대략적인 가장 가까운 이웃 (ANN) 알고리즘 검색 목적으로 Whiplash (및 LSH)는 현재 벡터 매장과 비교하여 트레이드 오프가 있습니다.
장점 :
단점 :
나는 관리되는 벡터 매장의 높은 비용과 다른 오픈 소스 벡터 매장을 자조적으로 주최하는 복잡성으로 좌절했기 때문에 이것을 구축하고 싶었습니다. AWS가 "Serverless"Elasticsearch, UGH를 푸시하더라도 우수한 서버리스 솔루션도 없습니다. Whiplash는 매우 간단하고 유지 보수가 거의없는 생산 준비 인프라를 기반으로합니다.
스토리지 비용 만 PENECONE 비교 :
프린 콘 :
편달:
특별한 순서없이 :
당신이 아마존이고 이것을 사용하고 싶다면, 저에게 연락하여 미리 많은 돈을 지불하십시오. 그렇지 않으면 이것은 Apache 2.0에 따라 라이센스가 부여됩니다.