Şirketler, giderek daha fazla düzensiz veri toplarken ve büyük dil modelleri (LLM) kullanmaya başladıkça, daha hızlı ve ölçeklenebilir sistemlere ihtiyaç duymaktadır. Veri bulma ile ilgili gelişmiş araçlar, terabayt veya petabayt ölçeğinde büyük veri setlerinde işlem yapmak için saatler ya da günler alabilir.
Öte yandan, çevrimiçi arama uygulamaları, gerçek zamanlı hız gereksinimlerini karşılamak için çok sayıda CPU’ya ihtiyaç duyar. Bu, altyapı maliyetlerini artırarak, ad öneri sistemlerinin anında sonuçlar sunmasını zorlaştırır.
Bu yazıda, bu zorlukların nasıl çözülebileceği NVIDIA cuVS ve Meta Faiss kütüphanesinin etkili benzerlik arama ve kümeleme yetenekleri ile ele alınmaktadır. cuVS, GPU hızlandırması kullanarak arama indekslerinin oluşturulma süresini ve arama işlemini önemli ölçüde hızlandırmaktadır. Bu sayede, daha hızlı, daha düşük maliyetli ve daha verimli bir performans elde edilirken, CPU ve GPU arasında sorunsuz bir uyumluluk sağlanmaktadır.
cuVS ve Faiss Entegrasyonunun Faydaları
İster saniyede milyonlarca vektör sorguluyor olun, ister büyük çok modlu gömme verileriyle çalışıyor olun, ister GPU ile devasa indeksler inşa ediyor olun, cuVS ve Faiss entegrasyonu performans ve esneklik konusunda yeni bir seviyeye ulaşmanızı sağlar.
cuVS ile şunları gerçekleştirmeniz mümkündür:
- GPU’da %95 geri çağırma ile indeksleri 12 kat daha hızlı oluşturma
- GPU’da %95 geri çağırma ile arama gecikmelerini 8 kat daha düşük hale getirme
- Dağıtım ihtiyaçlarınıza uygun olarak indeksleri CPU ve GPU ortamları arasında kolayca taşıma
Faiss’te GPU Hızlandırması
Faiss, araştırma ve üretim ortamlarında vektör arama için popüler bir kütüphanedir. Kendi başına kullanılabilir, PyTorch ile entegre edilebilir ve RocksDB, OpenSearch ve Milvus gibi vektör veritabanlarına gömülebilir.
Faiss, 2018 yılında GPU desteğini öncülüğünü yaptı ve o zamandan beri gelişimini sürdürmektedir. NeurIPS 2021’de büyük ANN kıyaslama yarışmasında, NVIDIA, GPU hızlandırmalı algoritmalarla birinci olmuştur. Bu yöntemler daha sonra Faiss’e katkıda bulunulmuş ve açık kaynak cuVS kütüphanesine entegre edilmiştir.
CPU-GPU Arası Rahat Geçiş
GPU indekslerini hızlandırma verimi, Faiss ile cuVS entegrasyonu sayesinde CPU ve GPU arasında yeni seviyelerde uyumluluk sağlar. Faiss ile GPU’da indeksler oluşturabilir ve ardından bunları CPU’ya dağıtabilirsiniz. Bu, Faiss kullanıcılarına GPU’larla hızlandırılmış indeks oluşturma imkanı sunarken, CPU arama mimarilerini koruma yeteneği verir. Bu, Faiss kütüphanesinde sorunsuz bir şekilde gerçekleştirilir.
Bir örnek verecek olursak, Hiyerarşik Navigable Küçük Dünya (HNSW) indeksleri, özellikle **büyük ölçeklerde** CPU üzerinde inşası çok yavaş olduğundan, genellikle birkaç saat veya gün sürebilir. Oysa CAGRA indeksleri, GPU üzerinde bu süreyi 12 kat kadar kısaltabilir. Bu CAGRA grafikleri, Faiss içinde HNSW indeksleri olarak biçimlendirilebilir ve ardından arama yapılmak üzere CPU’ya dağıtılabilir.
Faiss ve cuVS Benchmarkları
Performans karşılaştırmaları şu iki veri kümesi üzerinden gerçekleştirildi:
- Deep100M:Deep1B veri setinin 100M vektörlük bir alt kümesi (96 boyut).
- OpenAI Metin Gömme:text-embedding-ada-002 modelinden 1,536 boyutlu 5M vektör.
Testler, NVIDIA H100 Tensor Core GPU ve Intel Xeon Platinum 8480CL CPU üzerinde gerçekleştirilmiştir. Ölçümler aşağıdaki konularda alındı:
- İndeks oluşturma süreleri
- Tek sorgu gecikmesi (çevrimiçi arama)
- Büyük parti verimliliği (çevrimdışı arama)
Düzensiz verilerin hızla büyüdüğü göz önüne alındığında, indeks oluşturma performansının artması önemlidir. Ancak sadece indeks oluşturma süresine bakmak yeterli değildir; arama performansı ve elde edilen modelin kalitesi de göz önünde bulundurulmalıdır. Bu nedenle ekip, veri yapısına uygun bir değerlendirme metodolojisi geliştirdi. Daha fazla bilgi için cuVS belgelerine göz atabilirsiniz.
Ayrıca arama performansı ve kalitenin yanı sıra, modellerin en iyi performans ayarlarıyla karşılaştırılması da önemlidir. Bu, aday karşılaştırmaların adil olmasını sağlamak için Pareto eğrileri kullanılarak yapılır. Latens ve verimlilikteki hızlı karşılaştırmalar, %95 geri çağırma seviyesinde gerçekleştirilir.
IVF: cuVS ile Faiss GPU Klasik Karşılaştırması
İlk olarak IVF indeksleri IVF-Flat ve IVF-PQ’yu test ederek, Faiss’in klasik GPU uygulamaları ile cuVS destekli yeni Faiss varyantlarını karşılaştırdık:
- Oluşturma süresi: cuVS kullanan IVF-PQ ve IVF-Flat, %4.7 daha hızlı oluşturuldu (Şekil 1)
- Gecikme: IVF-PQ için arama gecikmesi %8 daha düşük ve IVF-Flat için %90 daha düşük oldu (Şekil 1)
- Verimlilik: cuVS, IVF-PQ için büyük partide arama verimliliğini her iki veri setinde de %3 oranında artırdı ve IVF-Flat için benzer performansı korudu. Bu, yüksek hacimli ve büyük çevrimdışı arama iş yükleri için oldukça uygundur.
Çevrimiçi Gecikme
Şekil 1a ve 1b, IVF indeks varyantları üzerinden çevrimiçi arama gecikmesini ve oluşturma süresini göstermektedir. cuVS, hem indeks inşasında hem de arama gecikmesinde her iki veri setinde klasik Faiss’e kıyasla daha hızlı sonuçlar sunmaktadır.


Toplama (Çevrimdışı) Verimlilik
Şekil 2, IVF indeks varyantları arasındaki toplama verimliliğini göstermektedir. cuVS, her iki görüntü ve metin gömme veri setinde önemli derecede daha fazla sorgu başına geçiş sağlıyor.


Bu iyileştirmeler, GPU kümelendirmesinde (örneğin, dengeli k-means) daha iyi performanstan, genişletilmiş parametre desteğinden (IVF-PQ için daha fazla alt nitelik gibi) ve kod düzeyindeki optimizasyonlardan kaynaklanmaktadır.
Graf Tabanlı İndeksler: cuVS CAGRA ve Faiss HNSW (CPU)
CAGRA, GPU için optimize edilmiş, sabit dereceli düz bir grafik indeksidir ve CPU tabanlı HNSW’ye kıyasla performans avantajları sunar:
- Oluşturma süresi:CAGRA, %12.3 daha hızlı inşa edilir (Şekil 3)
- Gecikme: Çevrimiçi arama, Deep100M üzerindeki HNSW’ye göre %4.7 daha hızlıdır (Şekil 3)
- Verimlilik: Çevrimdışı arama ayarlarında, CAGRA görüntü verileri için %18 ve metin gömme için %8 daha yüksek verimlilik sunmaktadır (Şekil 4). Bu, düşük gecikme ile yüksek hacimli tahmin gereken iş yükleri için idealdir.
cuVS, bir CAGRA grafiğinin doğrudan HNSW grafiğine dönüştürülmesine olanak tanır; bu, grafiğin GPU’da çok daha hızlı inşa edilmesini sağlarken, arama işleminde CPU’yu kullanarak benzer hız ve kalite sunar.
Çevrimiçi Gecikme
Şekil 3a ve 3b, GPU CAGRA ile CPU HNSW arasındaki çevrimiçi gecikme ve oluşturma süresini göstermektedir. CAGRA, indeks inşasını ve çevrimiçi sorgulama gecikmesini önemli ölçüde hızlandırmakta, HNSW’ye göre %4.7 hızlı arama sunmaktadır.


Toplama (Çevrimdışı) Verimlilik
Şekil 4, GPU CAGRA’nın CPU HNSW ile toplama verimliliği grafiklerini göstermektedir. CAGRA, toplama ayarlarında yüksek verimliliğe ulaşarak saniyede milyonlarca sorgu sağlamaktadır ve her iki veri kümesinde de CPU tabanlı HNSW’yı geride bırakmaktadır.


Faiss ile cuVS Kullanımına Başlarken
Bu bölümde, cuVS desteği ile Faiss’in kurulumuna dair kısa bir tanıtım ve Python ile bir indeksi oluşturup aramak için örnek kodlar verilmektedir.
Kurulum
Faiss’i cuVS ile kurmak veya önceden derlenmiş Conda paketleri ile yüklemek mümkündür:
# Conda yüklemesi (CUDA 12.4)
conda install -c rapidsai -c conda-forge -c nvidia pytorch::faiss-gpu-cuvs
'cuda-version>=12.0,
Alternatif olarak, cuVS destekli Faiss paketinin en son günlük sürümünü yüklemek için aşağıdaki komutu kullanabilirsiniz:
conda install -c rapidsai -c rapidsai-nightly -c conda-forge -c nvidia
pytorch/label/nightly::faiss-gpu-cuvs 'cuda-version>=12.0,
Bellek Yönetimi
Aşağıdaki kod parçacığını kullanarak RMM ile GPU bellek havuzlama ayarını etkinleştiriniz (tavsiye edilir). Bu yaklaşım, performansı artırabilir.
import rmm
pool = rmm.mr.PoolMemoryResource(
rmm.mr.CudaMemoryResource(),
initial_pool_size=2**30
)
rmm.mr.set_current_device_resource(pool)
IVFPQ İndeksi Oluşturma
faiss-gpu-cuvs paketi ile, kod değişikliğine gerek kalmadan desteklenen indeks türleri için cuVS otomatik olarak kullanılmaktadır. Aşağıda, cuVS arka planına sahip bir IVFPQ indeksi oluşturma örneği verilmiştir:
import faiss
import numpy as np
np.random.seed(1234)
xb = np.random.random((1000000, 96)).astype('float32')
xq = np.random.random((10000, 96)).astype('float32')
xt = np.random.random((100000, 96)).astype('float32')
res = faiss.StandardGpuResources()
# RMM havuz kaynağı zaten ayarlandığı için varsayılan geçici bellek tahsisini devre dışı bırak.
res.noTempMemory()
# Durum 1: cuVS GPU indeksi oluşturma
config = faiss.GpuIndexIVFPQConfig()
config.interleavedLayout = True
index_gpu = faiss.GpuIndexIVFPQ(res, 96, 1024, 96, 6, faiss.METRIC_L2, config) # cuVS ile genişletilmiş parametre seti (kodu artırır = 6).
index_gpu.train(xt)
index_gpu.add(xb)
# Durum 2: CPU indeksini cuVS GPU indeksine kopyalama
quantizer = faiss.IndexFlatL2(96)
index_cpu = faiss.IndexIVFPQ(quantizer,96, 1024, 96, 8, faiss.METRIC_L2)
index_cpu.train(xt)
co = faiss.GpuClonerOptions()
index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu, co)
# Artık cuVS indeksi, eğitilmiş kuantizatörü IVF merkezleri olarak kullanıyor.
assert(index_gpu.is_trained)
index_gpu.add(xb)
k = 10
D, I = index_gpu.search(xq, k)
cuVS CAGRA İndeksi Oluşturma
Aşağıdaki örnek, cuVS hızlandırması ile Faiss kullanarak bir CAGRA indeksi oluşturup sorgulamayı gösterir.
import faiss
import numpy as np
# Adım 1: CAGRA indeksi yapılandırmasını oluşturma
config = faiss.GpuIndexCagraConfig()
config.graph_degree = 32
config.intermediate_graph_degree = 64
# Adım 2: CAGRA indeksini başlatma
res = faiss.StandardGpuResources()
gpu_cagra_index = faiss.GpuIndexCagra(res, 96, faiss.METRIC_L2, config)
# Adım 3: İndekse 1M vektör ekleme
n = 1000000
data = np.random.random((n, 96)).astype('float32')
gpu_cagra_index.train(data)
# Adım 4: İndeksi sorgulama, her bir sorgu için en yakın 10 komşuyu bulma.
xq = np.random.random((10000, 96)).astype('float32')
D, I = gpu_cagra_index.search(xq,10)
CAGRA’yı HNSW’ye Dönüştürme (CPU Arama için)
CAGRA indeksleri, yeni faiss.IndexHNSWCagra CPU sınıfı aracılığıyla otomatik olarak HNSW formatına dönüştürülebilir; bu, GPU hızlandırmalı indeks oluşturma imkanı sunarak ardından CPU tabanlı arama yapılmasını sağlar:
# 96 boyutlu vektörler için HNSW indeks nesnesini oluşturma.
M = 16
cpu_hnsw_index = faiss.IndexHNSWCagra(96, M, faiss.METRIC_L2)
cpu_hnsw_index.base_level_only=False
# HNSW temel katmanını CAGRA grafiği ile başlatma.
gpu_cagra_index.copyTo(cpu_hnsw_index)
# Hiyerarşiye yeni vektörler ekleme.
newVecs = np.random.random((100000, 96)).astype('float32')
cpu_hnsw_index.add(newVecs)
Tüm kod örneklerini görmek için Faiss cuVS not defterine göz atabilirsiniz.
Vektörlerinizden Daha Fazla Verim Alın
NVIDIA cuVS entegrasyonu, Faiss ile birlikte, yaklaşık komşuluk (ANN) aramasında hız ve ölçeklenebilirlikte önemli iyileştirmeler sağlamaktadır. İster ters dosya (IVF) indeksleriyle, ister grafik tabanlı yöntemlerle çalışıyor olun, Faiss’in cuVS ile entegrasyonu şunları sunar:
- Daha Hızlı İndeks Oluşumu: GPU’da %12’ye kadar hızlandırma
- Daha Düşük Arama Gecikmesi: Gerçek zamanlı aramada %4.7 iyileşme
- Rahat CPU-GPU Geçişliliği: GPU’da inşa et, CPU’da ara, ve tam tersini yap
Ek olarak, CAGRA, GPU’lar için özel olarak oluşturulmuş yüksek performanslı bir grafik tabanlı indekstir ve hem inşa süresi hem de verimlilik açısından klasik CPU tabanlı HNSW’den daha iyi performans göstermektedir. Dahası, CAGRA grafikleri, etkili CPU tabanlı çıkarım için HNSW biçimine dönüştürülebilir—bu da hibrid dağıtımlar için her iki avantajı sağlamaktadır.
İster çevrimiçi arama altyapınızı milyonlarca sorguyu işleyebilecek şekilde ölçeklendirin, ister yeni gömme modelleriyle hızlı bir şekilde denemeler yapın, Faiss ile cuVS entegrasyonu, daha hızlı ilerlemeniz, daha akıllı denemeler yapmanız ve kendinize güvenle dağıtım yapmanız için gereken araçları sunmaktadır.
Başlamak için hazır mısınız? faiss-gpu-cuvs paketini yükleyin ve örnek deftere göz atın.


















