Ce référentiel contient des exemples pour la construction d'indices de recherche de vecteur binaire pour les incorporations Wikipedia disponibles sur le portail HuggingFace:
Pour afficher les résultats, consultez le bench.ipynb . Pour reproduire les résultats, téléchargez d'abord les données:
$ pip install -r requirements.txt
$ python download.py
$ ls -alh mixedbread | head -n 1
> total 15G
$ ls -alh cohere | head -n 1
> total 15GDans les deux cas, les intérêts ont 1024 dimensions, chacune représentée avec un seul bit, emballé dans des vecteurs de 128 octets. 32 Go de RAM sont recommandés pour exécuter les scripts.
Connaître la longueur des intérêts est très pratique pour les optimisations. Si les intérêts ne mesurent que 1024 bits, nous n'avons besoin que de 2 registres ZMM pour stocker l'intégralité du vecteur. Nous n'en avons pas besoin for les boucles, puis l'opération entière peut être déroulée et inclinée.
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 );
}Pour exécuter les repères du noyau, utilisez la commande suivante:
$ python kernel.pyPour exécuter des repères sur des données réelles:
$ python kernels.py --dir cohere --limit 1e6