Este repositorio contiene ejemplos para la construcción de indicias de búsqueda de vectores binarios para incrustaciones de Wikipedia disponibles en el portal de Huggingface:
Para ver los resultados, consulte el bench.ipynb . Para replicar los resultados, primero, descargue los datos:
$ pip install -r requirements.txt
$ python download.py
$ ls -alh mixedbread | head -n 1
> total 15G
$ ls -alh cohere | head -n 1
> total 15GEn ambos casos, los incrustaciones tienen 1024 dimensiones, cada una representada con un solo bit, empaquetado en vectores de 128 bytes. Se recomiendan 32 GB de RAM para ejecutar los scripts.
Conocer la longitud de los incrustaciones es muy útil para las optimizaciones. Si las integridades tienen solo 1024 bits de largo, solo necesitamos 2 registros ZMM para almacenar todo el vector. No necesitamos ninguno for los bucle, entonces la operación completa se puede desenrollar y ingresar.
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 ejecutar los puntos de referencia del núcleo, use el siguiente comando:
$ python kernel.pyPara ejecutar puntos de referencia sobre datos reales:
$ python kernels.py --dir cohere --limit 1e6