Faiss 입문

1. Faiss 원리
  • 단원 - 탐지 (Cell - probe) 방법
  • 최근 이웃 을 찾 는 대가 로 이 과정 을 가속 화 하 는 전형 적 인 방법 은 k 평균치 와 같은 분 구 기술 을 사용 하 는 것 이다.해당 알고리즘 은 때때로 cell - probe 방법 이 라 고 불 린 다.
    다 중 탐지 기반 의 파 티 션 기반 방법 을 사용 합 니 다.
    특징 공간 은 ncells 의 셀 로 나 뉜 다.해시 함수 (k 평균치 의 경우 검색 에 가장 가 까 운 질량 심 에 대한 배분) 로 인해 데이터 베 이 스 는 이 단원 들 중 하나 에 배분 되 고 ncells 역방향 목록 으로 형 성 된 역방향 파일 구조 에 저 장 됩 니 다.조회 할 때 nprobe 개의 역방향 목록 을 선택 하여 이 목록 에 분 배 된 모든 데이터 베 이 스 를 비교 합 니 다. 일부 데이터 베 이 스 는 조회 와 비교 합 니 다. 첫 번 째 유사 값 으로 이 비율 은 nprobe / ncells 입 니 다. 그러나 이 유사 치 는 보통 과소평가 되 고 역방향 목록 의 길이 가 같 지 않 기 때 문 입 니 다.주어진 검색 의 최근 이웃 의 셀 을 선택 하지 않 으 면 실패 사례 가 표 시 됩 니 다.
    C + + 에서 상응하는 인덱스 는 인덱스 인덱스 인덱스 IVFFlat 입 니 다.
    구조 함 수 는 색인 을 매개 변수 로 반전 목록 에 값 을 부여 합 니 다.이 색인 에서 검색 하고 되 돌아 오 는 벡터 id (s) 는 방문 해 야 할 역방향 목록 입 니 다.
  • 평탄 한 색인 을 조 량 화기 로 하 는 단원 탐지 방법
  • 일반적으로, 우 리 는 Flat index 를 거 친 양 적 으로 사용 합 니 다.IndexIVF 의 훈련 방법 은 flat index 에 질 심 을 첨가 했다.nprobe 의 값 은 검색 할 때 설정 합 니 다.
    주의: 경험 에 따 르 면 n 은 색인 되 어야 할 점 의 수량 을 표시 합 니 다. 일반적으로 적당 한 질량 의 수량 을 확정 하 는 방법 은 '질량 의 지출 (순수한 kmeans: ncentroids * d 라면)' 과 '반전 목록 을 분석 할 때 실 행 된 정확 한 거리 계산 수량 입 니 다.(kprobe / ncells * n * C 의 순서에 따라 상수 C 는 목록 의 불 균형 분 포 를 고려 하고 질량 심 비 처 리 를 사용 할 때 하나의 벡터 가 비교적 효과 적 인 사실 을 고려 했다. 예 를 들 어 C = 10) '간 에 균형 을 찾 았 다.
    이 로 인해 많은 질량 의 수량 이 ncentroids = C * sqrt (n) 를 따 르 게 되 었 다.
    메모: 엔진 덮개 아래 에서 IndexIVFKmeans 와 IndexIVFSphericalKmeans 는 대상 이 아니 라 정확하게 설 정 된 IndexIVFFlat 대상 의 함 수 를 되 돌려 줍 니 다.
    경고: 구역 구분 방법 은 차원 의 저 주 를 받 기 쉽다. 진정한 고 차원 데이터 에 대해 좋 은 리 콜 을 실현 하려 면 매우 많은 프로 브 가 필요 하 다.
  • 양 적 방법 에 기초
  • 2. Faiss 설치 절차
  • OpenBLAS 설치
  • tar -xvf OpenBLAS-0.3.2.tar.gz
    cd OpenBLAS-0.3.2
    make
    make PREFIX=/usr/local/ install
    
  • lapack 설치
  • yum install lapack-devel.x86_64 -y
    
  • faiss 설치
  • ./configure -with-blas="-L/usr/local/lib -lopenblas -llapack -lgfortran -lpthread" --without-cuda
    make && make install
    

    3. 핵심 API 설명
  • 핵심 계량 기 를 정의 합 니 다 (보통 다 열 역 렬 색인 을 사용 하여 빠 른 훈련 을 실현 합 니 다)
  • faiss::MultiIndexQuantizer coarse_quantizer (d, nhash, nbits_subq);
    
  • 색인 초기 화
  • faiss::IndexIVFFlat index (&coarse_quantizer, d, ncentroids, metric);
    faiss::IndexIVFPQ index (&coarse_quantizer, d, ncentroids, bytes_per_code, 8);
    
    
  • 훈련 모델
  • std::vector  trainvecs (nt * d);
    index.train (nt, trainvecs.data());
    
  • 색인 에 데 이 터 를 추가 합 니 다
  • std::vector  database (nb * d);
    std::vector  ids (nb);
    index.add (nb, database.data());
     index.add_with_ids (end - begin, database.data() + d * begin, ids.data() + begin);
    
  • 검색 데이터
  • std::vector queries;
    std::vector<:index::idx_t> nns (k * nq);
    std::vector dis (k * nq);
    index.search (nq, queries.data(), k, dis.data(), nns.data());
    
  • 색인 저장
  • faiss::write_index(&index, "/tmp/populated_index.faissindex");
    
  • 색인 읽 기
  •  faiss::Index * idx = faiss::read_index("/tmp/trained_index.faissindex");
    
  • IndexShards: 여러 색인 에서 조합 한 결과
  • 데이터 세트 가 여러 색인 에 분포 되 어 있 을 때, 이 를 통 해 검색 을 예약 하고 결 과 를 IndexShards 와 결합 하여 사용 할 수 있 습 니 다. 만약 색인 이 여러 GPU 에 분포 되 어 있 고 검색 을 병행 할 수 있다 면 이것 도 유용 합 니 다. GpuCloner Options 에서 shards 를 true 로 설정 한 index cpu to gpus 를 참조 하 십시오.
    3. 색인 선택
  • 정밀 검색
  • IndexFlatL 2 는 벡터 를 압축 하지 않 지만 그 위 에 비용 을 늘 리 지 는 않 습 니 다. id (add with ids) 를 추가 하 는 것 은 지원 되 지 않 으 며 순서대로 추가 하 는 것 만 지원 합 니 다. 따라서 add with ids 가 필요 하 다 면 "IDMap, Flat" 을 사용 하 십시오. GPU 를 지원 합 니 다.
  • 메모리 무제 한
  • HNSWx 는 매우 빠 르 고 정확 한 색인 입 니 다. x 의 범 위 는 [4, 64] 입 니 다. 각 벡터 의 링크 수 를 표시 합 니 다. 클 수록 정확 하지만 더 많은 메모 리 를 사용 합 니 다. 순서 추가 만 지원 합 니 다 (add with ids 가 아 닙 니 다). 따라서 여기에서 IDMap 을 접두사 로 다시 사용 합 니 다 (필요 할 경우).... HNSW 는 훈련 이 필요 없고 색인 에서 벡터 를 삭제 하 는 것 도 지원 되 지 않 습 니 다. GPU 는 지원 되 지 않 습 니 다.
  • 메모리 제한
  • “…,Flat”  "..." 는 데이터 집합의 집합 을 미리 실행 해 야 한 다 는 뜻 입 니 다. 집합 후 "Flat" 은 벡터 를 다른 통 에 구성 할 뿐 압축 되 지 않 습 니 다. 저장 크기 는 원본 데이터 집합의 크기 와 같 습 니 다. 속도 와 정밀도 사이 의 균형 은 nprobe 매개 변수 설정 을 통 해 이 루어 집 니 다. GPU 를 지원 하고, 집합 방법 도 GPU 를 지원 해 야 합 니 다.
  • 메모리 제한 이 심각 하 다
  • "PCARx,..., SQ8" 은 전체 벡터 를 너무 비 싸 게 저장 하면 두 가지 작업 을 수행 합 니 다. (1) 사 이 즈 를 x 로 사용 하 는 PCA 는 사 이 즈 를 줄 이 고 (2) 벡터 분량 의 스칼라 를 1 바이트 로 계량 화 합 니 다. 따라서 총 저장량 은 벡터 x 바이트 당 GPU 를 지원 하지 않 습 니 다.
    "OPQx y,..., PQx" Qx 는 하나의 product quantizer 를 통 해 압축 벡터 를 x 바이트 로 표시 합 니 다. x 는 보통 < = 64, 비교적 큰 값 에 대해 서 는 SQ 가 정확 하고 빠 릅 니 다. OPQ 는 벡터 의 선형 변환 으로 압축 하기 쉽 습 니 다. y 는 하나의 차원 입 니 다. (1) y 는 x 의 배수 (필수) (2) y < = d, d 는 입력 벡터 의 차원 (최고) (3) y < = 4 * x (최고) 입 니 다.
    4. 데이터 세트 와 색인 선택
  • 벡터 수량 이 1 백만 보다 적 으 면: "..., IVFx,..."
  • 데이터 집합의 수가 N 일 때 x 는 4 * sqrt (N) 와 16 * sqrt (N) 사이 에 있어 야 합 니 다. 이것 은 k - means 집합 벡터 일 뿐 입 니 다. 30 * x 에서 256 * x 의 벡터 로 훈련 (많 을 수록 좋 습 니 다) 해 야 합 니 다. GPU 를 지원 합 니 다.
  • 벡터 수량 이 1 백만 - 1 천만 사이 에 있다 면: "..., IMI2x 10,..."
  • IMI 는 트 레이 닝 벡터 에서 2 ^ 10 개의 질량 중심 을 가 진 k - means 를 실행 하지만 벡터 의 앞부분 과 후반 부 에 서 는 독립 적 으로 실 행 됩 니 다. 이 는 클 러 스 터 의 수 를 2 ^ (2 * 10) 로 늘 립 니 다. 약 64 * 2 ^ 10 개의 벡터 가 필요 합 니 다. GPU 는 지원 되 지 않 습 니 다.
  • 벡터 수량 이 1 천만 - 1 억 사이 에 있다 면: "..., IMI2x 12,..."
  • 위 와 마찬가지 로 10 을 12 로 교체 합 니 다. GPU 는 지원 되 지 않 습 니 다.
  • 벡터 수량 이 1 억 - 10 억 사이 에 있 으 면 '..., IMI2x 14,...'
  • 위 와 마찬가지 로 10 을 14 로 교체 합 니 다. GPU 는 지원 되 지 않 습 니 다.
    5. Faiss ID 맵
    기본적으로 Faiss 는 색인 에 추 가 된 벡터 할당 순서 id 입 니 다. 이 페이지 는 임의의 ID 로 변경 하 는 방법 을 소개 합 니 다.
    일부 Index 클래스 는 add with ids 방법 을 실 현 했 습 니 다. 벡터 외 에 64 비트 벡터 id 를 제공 할 수 있 습 니 다. 검색 할 때 클래스 는 초기 벡터 가 아 닌 저 장 된 id 를 되 돌려 줍 니 다.
    IndexIDMap: 이 색인 은 다른 색인 을 봉인 하고 추가 하고 검색 할 때 ID 를 변환 합 니 다. 맵 이 있 는 시 계 를 유지 합 니 다.
    index = faiss.IndexFlatL2(xb.shape[1]) 
    ids = np.arange(xb.shape[0])
    index.add_with_ids(xb, ids)  # this will crash, because IndexFlatL2 does not support add_with_ids
    index2 = faiss.IndexIDMap(index)
    index2.add_with_ids(xb, ids) # works, the vectors are stored in the underlying index
    

    IndexIVF 의 ID: IndexIVF 하위 클래스 는 항상 벡터 ID 를 저장 합 니 다. 따라서 IndexIDMap 의 추가 표 는 공간 을 낭비 합 니 다. IndexIVF 자체 가 add with ids 를 제공 합 니 다.
    참고 문서:
    https://waltyou.github.io/Faiss-Introduce/ https://waltyou.github.io/Faiss-Indexs/#%E6%8C%91%E4%B8%80%E4%B8%AA%E5%90%88%E9%80%82%E7%9A%84-index
    https://github.com/facebookresearch/faiss/wiki/Faiss-indexes

    좋은 웹페이지 즐겨찾기