مرحبا! اسمي فلاديمير Olokhtonov ، وأنا مطور أول في فريق Avito للاعتدال التلقائي. في خريف 2019 ، أطلقنا خدمة بحث عن صور مشابهة استنادًا إلى مكتبة faiss. يساعدنا ذلك على فهم أن الصور قد تمت رؤيتها بالفعل في إعلان آخر ، حتى إذا كانت مشوهة بشكل كافٍ: مشوشة ومقصودة وما شابه ذلك. هذه هي الطريقة التي نحدد بها المنشورات المزيفة المحتملة.
أود أن أتحدث عن المشاكل التي واجهتنا في عملية إنشاء هذه الخدمة وأساليبنا في حلها.
![](https://habrastorage.org/webt/cv/iu/hg/cviuhge0fxcrjnlmcklq20snwkm.png)
تفترض المقالة أن القارئ على الأقل على دراية بموضوع البحث في المساحات متعددة الأبعاد ، حيث سنركز فيما يلي بشكل أساسي على التفاصيل الفنية. إذا لم يكن الأمر كذلك ، فإنني أوصي بقراءة المقالة الأساسية على مدونة Mail.ru أولاً .
بيان المشكلة ووصف نظامنا
أول شيء فكرت فيه عندما تم تكليفي بإنشاء نظام بحث للصور كان المتطلبات والقيود:
- عدد الإدخالات. كان لدينا حوالي 150 مليون متجه في البداية ، والآن يوجد بالفعل أكثر من 240 مليون متجه.
- حدود وقت البحث. في حالتنا ، حوالي 300 مللي ثانية لـ 95 بالمائة.
- حد الذاكرة. من الضروري وضع المؤشر على خوادم عادية ، مع مراعاة النمو للسنتين القادمتين.
- . Kubernetes, , , .
- , .
:
, — , . , .
, . , , .
. — eventually consistent . , .
Python3.7, PostgreSQL, — MinIO. faiss.
![](https://habrastorage.org/webt/49/h7/o-/49h7o--tc0rrmvsqvq4zdgduexa.png)
http- avio, aiohttp.
asyncio fork, , — , , multiprocessing.Pipe.
Product Quantization. 64 .
![صورة](https://habrastorage.org/webt/5w/lv/b_/5wlvb_dzumdhxccghilhll1cn3g.png)
Product Quantization .
Inverted File HNSW.
![](https://habrastorage.org/webt/8j/nh/yk/8jnhyk30nb3jxyacwku4eo-mm_w.png)
, faiss : IVF262144_HNSW32,PQ64. , Inverted File 262144 , HNSW 32 , 64 Product Quantization.
faiss .
, :
- 10 000 , 1 .
- 16 OpenMP-. , 16 , #pragma omp parallel for.
— . , , - .
, IVF262144_HNSW32,PQ64 80 :
:
int(faiss.get_mem_usage_kb() * 1024 / index.ntotal)
, 2Gb. nlist × pq.M × pq.ksub × float. 262144 × 64 × 256 × 4 ≈ 17G, pq.M — Product Quantization, pq.ksub — 256, .
. : , 2. , Inverted File, . — .
bytes per vector :
![](https://habrastorage.org/webt/pv/ov/v5/pvovv572e8pjv4geu72tgkbetm0.png)
, , , - , , . , .
OpenMP faiss, , , . , ThreadPoolExecutor (faiss GIL).
![](https://habrastorage.org/webt/au/on/cd/auoncdoln059pebxfoifr5uqzom.png)
, faiss , . -, (add, remove) - . -, OpenMP- , , .
RWLock, , . Python . OpenMP- faiss.omp_set_num_threads.
, query-per-second. 5.
, . , , issue.
faiss.
, 5 10 000 ( ). , : 800 .
20 150 rps 20 latency 500 throughput. : , .
, . , , . MinIO.
— fork Copy-on-Write . . — 80 .
, .
GPU
GPU , .
: SIFT1M, 128.
: 100 10 000 nprobe.
![](https://habrastorage.org/webt/tj/if/0x/tjif0x32bocxr-3es1vxrlttz20.png)
:
- GPU. GPU , , , , .
- Flat- GPU, ( 128).
- PQ64- GPU .
Faiss — open source , .
, , faiss . issues, .
, vearch JD.com. open source, .