Dieses Repository enthält Beispiele für die Erstellung von Binärvektor-Suchanträgen für Wikipedia-Einbettungen, die auf dem Portal von Suggingface verfügbar sind:
Um die Ergebnisse anzuzeigen, lesen Sie die bench.ipynb . Um die Ergebnisse zu replizieren, laden Sie zunächst die Daten herunter:
$ pip install -r requirements.txt
$ python download.py
$ ls -alh mixedbread | head -n 1
> total 15G
$ ls -alh cohere | head -n 1
> total 15GIn beiden Fällen haben die Einbettungen 1024 Dimensionen, die jeweils mit einem einzigen Bit dargestellt werden und in 128-Byte-Vektoren gepackt werden. 32 GBS RAM werden empfohlen, um die Skripte auszuführen.
Die Länge der Einbettungen zu kennen, ist für Optimierungen sehr praktisch. Wenn die Einschreibungen nur 1024 Bit lang sind, benötigen wir nur 2 ZMM -Register, um den gesamten Vektor zu speichern. Wir brauchen keine for -Loops, dann kann der gesamte Vorgang abgerollt und eingefügt werden.
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 );
}Verwenden Sie den folgenden Befehl, um die Kernel -Benchmarks auszuführen:
$ python kernel.pyBenchmarks über echte Daten ausführen:
$ python kernels.py --dir cohere --limit 1e6