การคำนวณแบบกระจายของเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณ
โครงการนี้อ้างอิงถึงงานวิทยานิพนธ์ปริญญาโทของฉัน งานมุ่งเน้นไปที่การให้บริการอัปโหลดรูปภาพบนวิกิพีเดียมีประสิทธิภาพมากขึ้นศึกษาวิธีการคำนวณการคำนวณเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณพัฒนาโซลูชันเฉพาะกิจการสำรวจความเป็นไปได้ที่มีอยู่และปรับให้เข้ากับการค้นหาภาพที่คล้ายกันภายในชุดข้อมูล Wikimedia
ที่เก็บนี้คืออะไร
ที่เก็บนี้มีวัตถุประสงค์เพื่อมีการใช้งานของไลบรารีหลายแห่งเพื่อทำการค้นหาความคล้ายคลึงกัน (โคไซน์) เพื่อค้นหาสิ่งที่ดีที่สุดสำหรับจุดประสงค์ของฉัน การใช้งานต่างๆจะขึ้นอยู่กับกรณีการใช้งานที่เปิดเผยก่อนหน้านี้
เพื่อนบ้านที่ใกล้ที่สุดโดยประมาณ
- KNN: ห้องสมุดนี้ไม่ได้ประมาณและไม่มีประสิทธิภาพสูงสำหรับกรณีการใช้งานวิจัยของฉันการใช้งานกับ Sklearn ได้รับการจัดเตรียมเพื่อการเปรียบเทียบกับห้องสมุดโดยประมาณเท่านั้น Inside KNN คุณจะพบเวอร์ชันเดรัจฉานที่เรียกใช้การเปรียบเทียบเชิงเส้นระหว่างเวกเตอร์เดียวและชุดข้อมูลทั้งหมดโดยไม่ต้องสร้างโครงสร้างข้อมูล
- รบกวน: ห้องสมุดนี้ใช้เวอร์ชันของแอนเขียนโดย Erik Bernhardsson ในนามของ Spotify
- FAISS: ห้องสมุดนี้ถูกสร้างขึ้นเพื่อการค้นหาความคล้ายคลึงกันอย่างมีประสิทธิภาพและการจัดกลุ่มของเวกเตอร์หนาแน่นโดยทีมวิจัย Facebook (ตอนนี้ Meta)
- SPTAG: ไลบรารีนี้ได้รับการออกแบบมาสำหรับการค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณที่สร้างโดย Microsoft เป็นเวอร์ชันทางเลือกสำหรับไลบรารีก่อนหน้านี้เรียกว่า Diskann ซึ่งแตกต่างจากเทคโนโลยีอื่น ๆ โซลูชันนี้เกี่ยวข้องกับการใช้หน่วยความจำ RAM และดิสก์ทางกายภาพการจัดการอย่างมีประสิทธิภาพและจำนวนข้อมูลที่บันทึกไว้
จัดจำหน่ายเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณ
- Distributed-Faiss: ห้องสมุดนี้ได้รับการคุ้มครองแล้ว แต่ไม่ใช่รุ่นกระจาย อัลกอริทึมนี้แม้ว่าจะมีประสิทธิภาพมาก แต่ก็ไม่ได้เพิ่มข้อเสนอใหม่ให้กับข้อเสนอก่อนหน้านี้ซึ่งทำงานบนเครื่องเดียว อย่างไรก็ตามสิ่งที่ทำให้ห้องสมุดนี้มีความพิเศษคือมันสามารถแจกจ่ายในหลายเครื่องด้วยวิธีที่ง่ายมาก
- Distributed-SPTAG: ห้องสมุดนี้ได้รับการคุ้มครองแล้ว แต่ไม่ใช่รุ่นกระจาย อัลกอริทึมนี้แม้ว่าจะมีประสิทธิภาพมาก แต่ก็ไม่ได้เพิ่มข้อเสนอใหม่ให้กับข้อเสนอก่อนหน้านี้ซึ่งทำงานบนเครื่องเดียว อย่างไรก็ตามสิ่งที่ทำให้ห้องสมุดนี้มีความพิเศษคือมันสามารถแจกจ่ายในหลายเครื่องด้วยวิธีที่ง่ายมาก
- MILVUS: ห้องสมุดนี้ใช้ฐานข้อมูลเวกเตอร์ที่มุ่งเน้นไปที่การจัดหาระบบและสถาปัตยกรรมที่มีประสิทธิภาพสำหรับการค้นหาที่คล้ายคลึงกันและแอปพลิเคชัน AI ที่ขับเคลื่อนด้วย ความต้องการที่ Milvus พยายามที่จะตอบสนองคือการจัดหาระบบที่สมบูรณ์แบบที่สามารถใช้งานในชุดข้อมูลแบบไดนามิกขนาดใหญ่ได้ซึ่งเป็นโซลูชั่นที่สามารถทำงานบน GPU ได้ด้วยวิธีการกระจาย ในการทำสิ่งนี้ Milvus ได้ถูกสร้างขึ้นบนห้องสมุดที่ได้รับการอธิบายว่าเป็น FAISS แล้วทำให้การเปลี่ยนแปลงที่จำเป็นสำหรับกรณีการใช้งาน
โครงสร้างอย่างไร
โครงการได้รับการจัดโครงสร้างในวิธีที่แม่นยำเพื่อให้แน่ใจว่าการจัดระเบียบไฟล์ง่าย ๆ และเพื่อให้การนำทางภายในง่าย
- อัลกอริทึม: ภายในโฟลเดอร์นี้คุณสามารถค้นหาการใช้งานทั้งหมด
- สำหรับห้องสมุด:
- config.py: ไฟล์นี้มีการกำหนดค่าที่จำเป็นสำหรับการทำงานที่ถูกต้องของไลบรารี
- init.py: ไฟล์นี้มีรหัสสำหรับการอ่านชุดข้อมูลโครงสร้างข้อมูลการฝึกอบรมและการสร้างดัชนี
- search.py: ไฟล์นี้มีรหัสสำหรับทำการค้นหาและส่งคืนรายการผลลัพธ์
- ไฟล์อื่น ๆ : Chronometer.py, mocks.py
- ชุดข้อมูล: ชุดข้อมูลและโครงสร้างข้อมูลที่บันทึกไว้ในหน่วยความจำจะถูกแทรกภายในโฟลเดอร์นี้
- บีบอัด: ในโฟลเดอร์นี้เป็นไปได้ที่จะแทรกชุดข้อมูลที่บีบอัดซึ่งสามารถเห็นได้จากตัวอย่างที่แทรก คุณอาจสังเกตเห็นไฟล์ที่เรียกว่า links.txt ที่มีชุดข้อมูล Wikimedia ทั้งหมด
- บีบอัด: ในโฟลเดอร์นี้มีความเป็นไปได้ที่จะแทรกชุดข้อมูลที่บีบอัดจากที่นี่พวกเขาจะถูกกรองและย่อยสลายเพื่อการทำงานที่ถูกต้องของไลบรารี
- รูปภาพ: ภายในโฟลเดอร์นี้เป็นไปได้ที่จะค้นหาภาพที่สอดคล้องกับเวกเตอร์ที่สกัดจากชุดข้อมูล
- เวกเตอร์: ภายในโฟลเดอร์นี้เป็นไปได้ที่จะค้นหาเวกเตอร์ที่สอดคล้องกับภาพที่สกัดจากชุดข้อมูล
- FormatDatasets.bash: ไฟล์นี้ทำงานได้ตาม README.MD นี้มีรหัสเพื่อย่อยสลายชุดข้อมูลทั้งหมดจากโฟลเดอร์ที่บีบอัดที่จะย้ายเวกเตอร์ภายในเวกเตอร์/ โฟลเดอร์และภาพที่เกี่ยวข้องภายในรูปภาพ/ โฟลเดอร์ ไฟล์นี้ใช้ formatDatasets.py เพื่อแปลงไฟล์. csv เป็นรูปแบบไบนารีเพื่อเพิ่มความเร็วในโครงการทั้งหมด
- เอกสาร: เอกสารที่ได้รับระหว่างการเขียนวิทยานิพนธ์
วิธีดำเนินการ
ดาวน์โหลดชุดข้อมูลบางชุด
- ไปที่โฟลเดอร์บีบอัดและเรียกใช้งาน
wget -i links.txt เพื่อดาวน์โหลดชุดข้อมูล Wikimedia (รูปภาพ, เวกเตอร์) - การคลายจดหมายเหตุลงในการบีบอัดในชุดข้อมูล Wikimedia case
gunzip *.gz - ไปที่โฟลเดอร์ชุดข้อมูลและติดตาม readme.md
นำเข้า / ติดตั้ง / รวบรวมไลบรารี
ก่อนอื่นไปที่โฟลเดอร์อัลกอริทึมและติดตั้งข้อกำหนดทั่วไปด้วย pip install -r requirements.txt
- KNN:
pip install scikit-learn หรือไม่ติดตั้งอะไรถ้าคุณต้องการใช้เวอร์ชัน Brute-Force - รบกวน:
pip install annoy - FAISS: ติดตามบทช่วยสอน Conda
- SPTAG: คุณสามารถรวบรวมไลบรารีนี้ผ่านซอร์สโค้ดหรือใช้ Docker โดยส่วนตัวแล้วฉันขอแนะนำโซลูชันหลังโดยใช้คำสั่งเหล่านี้:
set GIT_LFS_SKIP_SMUDGE=1
git clone --recurse-submodules https://github.com/microsoft/SPTAG
cd SPTAG
docker build -t sptag .
- Distributed -Faiss: โคลนที่เก็บ (หากคุณต้องการใช้ PR ของฉันเพื่อเพิ่มความแม่นยำในการค้นหาขั้นตอนด้วย
set_index_parameter หรือ set_index_parameters วิธีการโคลนที่เก็บนี้) ป้อนโฟลเดอร์แล้วเรียกใช้ pip install -e . - Distributed-SPTAG: ทำตามคำแนะนำสำหรับ sptag
- Milvus:
pip install pymilvus จากนั้น Milvus สามารถติดตั้งด้วยนักเทียบท่าแต่งเพลงหรือ kubernetes (milvus standalone สำหรับการทดสอบ) หรือกับ Helm + Kubernetes (Milvus Cluster สำหรับการผลิต)
ดำเนินการไลบรารีแอน
ก่อนที่จะเรียกใช้ไลบรารีปรับแต่งไฟล์ config.py ต่างๆ
-
python init.py -
python search.py
ดำเนินการไลบรารีแบบกระจาย-แอน
ก่อนที่จะเรียกใช้ไลบรารีปรับแต่งไฟล์ config.py ต่างๆ
- Distributed-Faiss:
- ปรับแต่งไฟล์ discovery_config.txt
- ดำเนินการในแต่ละเซิร์ฟเวอร์
python init_server.py - ดำเนินการบนไคลเอนต์
python init_client.py - ดำเนินการบนไคลเอนต์
python search.py
- Distributed-SPTAG:
- ไปที่เซิร์ฟเวอร์แต่ละตัวปรับแต่งไฟล์ config.py (ความสนใจไปที่ start_metadata_offset) และเรียกใช้
python init.py - ไปที่เซิร์ฟเวอร์ที่โฮสต์ดัชนีที่สร้างขึ้นก่อนหน้านี้ ในโฟลเดอร์รีลีสของไลบรารีนำเข้าและปรับแต่งไฟล์ service.ini และเรียกใช้คำสั่ง
./server -m socket -c service.ini - ไปที่เครื่องที่คุณระบุว่าเป็นผู้รวบรวม ในโฟลเดอร์รีลีสของไลบรารีนำเข้าและปรับแต่งไฟล์ aggregator.ini และเรียกใช้คำสั่ง
./aggregator aggregator - ไปที่ไคลเอนต์ปรับแต่งไฟล์ config.py และดำเนินการ
python search.py
- Milvus:
-
python init.py -
python search.py
ทำโดย Christian Stingone