Este repositório contém exemplos para a construção de indicios de pesquisa vetorial binária para incorporações da Wikipedia disponíveis no portal Huggingface:
Para visualizar os resultados, consulte o bench.ipynb . Para replicar os resultados, primeiro, baixe os dados:
$ pip install -r requirements.txt
$ python download.py
$ ls -alh mixedbread | head -n 1
> total 15G
$ ls -alh cohere | head -n 1
> total 15GNos dois casos, as incorporações têm 1024 dimensões, cada uma representada com um único bit, empacotado em vetores de 128 bytes. Recomenda -se 32 GBs de RAM para executar os scripts.
Saber a duração das incorporações é muito útil para otimizações. Se as incorporações tiverem apenas 1024 bits de comprimento, precisamos apenas de 2 ZMM registros para armazenar todo o vetor. Não precisamos de nenhum for -loops, então toda a operação pode ser desenrolada e inlinada.
inline uint64_t hamming_distance ( uint8_t const * first_vector , uint8_t const * second_vector ) {
__m512i const first_start = _mm512_loadu_si512 (( __m512i const * )( first_vector ));
__m512i const first_end = _mm512_loadu_si512 (( __m512i const * )( first_vector + 64 ));
__m512i const second_start = _mm512_loadu_si512 (( __m512i const * )( second_vector ));
__m512i const second_end = _mm512_loadu_si512 (( __m512i const * )( second_vector + 64 ));
__m512i const differences_start = _mm512_xor_epi64 ( first_start , second_start );
__m512i const differences_end = _mm512_xor_epi64 ( first_end , second_end );
__m512i const population_start = _mm512_popcnt_epi64 ( differences_start );
__m512i const population_end = _mm512_popcnt_epi64 ( differences_end );
__m512i const population = _mm512_add_epi64 ( population_start , population_end );
return _mm512_reduce_add_epi64 ( population );
}Para executar os benchmarks do kernel, use o seguinte comando:
$ python kernel.pyPara executar benchmarks sobre dados reais:
$ python kernels.py --dir cohere --limit 1e6