Pemadatan Pengelompokan
Pemadatan pengelompokan dirancang untuk meningkatkan kinerja pencarian dan mengurangi biaya dalam koleksi yang besar. Panduan ini akan membantu Anda memahami pemadatan pengelompokan dan bagaimana fitur ini dapat meningkatkan kinerja pencarian.
Ikhtisar
Milvus menyimpan entitas yang masuk dalam segmen di dalam koleksi dan menutup segmen jika sudah penuh. Jika hal ini terjadi, sebuah segmen baru dibuat untuk mengakomodasi entitas tambahan. Akibatnya, entitas didistribusikan secara acak di seluruh segmen. Distribusi ini mengharuskan Milvus untuk mencari beberapa segmen untuk menemukan tetangga terdekat dengan vektor kueri yang diberikan.
Tanpa Pemadatan Pengelompokan
Jika Milvus dapat mendistribusikan entitas di antara segmen berdasarkan nilai di bidang tertentu, cakupan pencarian dapat dibatasi dalam satu segmen, sehingga meningkatkan kinerja pencarian.
Pemadatan Clustering adalah fitur di Milvus yang mendistribusikan kembali entitas di antara segmen dalam koleksi berdasarkan nilai dalam bidang skalar. Untuk mengaktifkan fitur ini, pertama-tama Anda harus memilih sebuah bidang skalar sebagai kunci pengelompokan. Hal ini memungkinkan Milvus untuk mendistribusikan ulang entitas ke dalam segmen ketika nilai kunci pengelompokannya berada dalam rentang tertentu. Ketika Anda memicu pemadatan pengelompokan, Milvus membuat/memperbaharui indeks global yang disebut PartitionStats, yang mencatat hubungan pemetaan antara segmen dan nilai kunci pengelompokan.
Dengan Pemadatan Pengelompokan
Dengan menggunakan PartitionStats sebagai referensi, Milvus dapat memangkas data yang tidak relevan setelah menerima permintaan pencarian/kueri yang membawa nilai kunci pengelompokan dan membatasi cakupan pencarian dalam pemetaan segmen ke nilai tersebut, sehingga meningkatkan kinerja pencarian. Untuk detail tentang peningkatan kinerja, lihat Tes tolok ukur.
Gunakan Pemadatan Pengelompokan
Fitur Pemadatan Klaster di Milvus sangat mudah dikonfigurasi. Anda dapat memilih untuk memicunya secara manual atau mengaturnya untuk dipicu secara otomatis pada interval tertentu oleh Milvus. Untuk mengaktifkan pemadatan pengelompokan, lakukan hal berikut:
Konfigurasi Global
Anda perlu memodifikasi file konfigurasi Milvus Anda seperti yang ditunjukkan di bawah ini.
dataCoord:
compaction:
clustering:
enable: true
autoEnable: false
triggerInterval: 600
minInterval: 3600
maxInterval: 259200
newDataSizeThreshold: 512m
timeout: 7200
queryNode:
enableSegmentPrune: true
datanode:
clusteringCompaction:
memoryBufferRatio: 0.1
workPoolSize: 8
common:
usePartitionKeyAsClusteringKey: true
dataCoord.compaction.clustering
Item Konfigurasi Deskripsi Nilai Default enable
Menentukan apakah akan mengaktifkan pemadatan pengelompokan.
Setel ini ketrue
jika Anda perlu mengaktifkan fitur ini untuk setiap koleksi yang memiliki kunci pengelompokan.false
autoEnable
Menentukan apakah akan mengaktifkan pemadatan yang dipicu secara otomatis.
Mengatur ini ketrue
mengindikasikan bahwa Milvus akan memadatkan koleksi yang memiliki kunci pengelompokan pada interval yang ditentukan.false
triggerInterval
Menentukan interval dalam milidetik saat Milvus memulai pemadatan pengelompokan.
Parameter ini hanya berlaku jikaautoEnable
diatur ketrue
.- minInterval
Menentukan interval minimum dalam detik.
Parameter ini hanya berlaku jikaautoEnable
diatur ketrue
.
Mengaturnya ke bilangan bulat yang lebih besar dari triggerInterval akan membantu menghindari pemadatan berulang dalam waktu singkat.- maxInterval
Menentukan interval maksimum dalam detik.
Parameter ini hanya berlaku jikaautoEnable
diatur ketrue
.
Ketika Milvus mendeteksi bahwa sebuah koleksi belum dipadatkan secara klaster untuk durasi yang lebih lama dari nilai ini, maka Milvus akan memaksa pemadatan klaster.- newDataSizeThreshold
Menentukan ambang batas atas untuk memicu pemadatan pengelompokan.
Parameter ini hanya berlaku jikaautoEnable
disetel ketrue
.
Setelah Milvus mendeteksi bahwa volume data dalam koleksi melebihi nilai ini, Milvus akan memulai proses pemadatan pengelompokan.- timeout
Menentukan durasi batas waktu untuk pemadatan pengelompokan.
Pemadatan clustering akan gagal jika waktu eksekusinya melebihi nilai ini.- queryNode
Item Konfigurasi Deskripsi Nilai Default enableSegmentPrune
Menentukan apakah Milvus memangkas data dengan merujuk ke PartitionStats saat menerima permintaan pencarian/kueri.
Mengatur ini ketrue
memungkinkan Milvus memangkas data yang tidak relevan dari segmen selama permintaan pencarian/kueri.false
dataNode.clusteringCompaction
Item Konfigurasi Deskripsi Nilai Default memoryBufferRatio
Menentukan rasio buffer memori untuk tugas pemadatan pengelompokan.
Milvus akan memangkas data ketika ukuran data melebihi ukuran buffer yang dialokasikan yang dihitung menggunakan rasio ini.- workPoolSize
Menentukan ukuran kumpulan pekerja untuk tugas pemadatan pengelompokan. - common
Item Konfigurasi Deskripsi Nilai Default usePartitionKeyAsClusteringKey
Menentukan apakah akan menggunakan kunci partisi dalam koleksi sebagai kunci pengelompokan.
Mengatur ini ketrue
mengindikasikan bahwa kunci partisi digunakan sebagai kunci pengelompokan.
Anda selalu dapat mengganti pengaturan ini dalam koleksi dengan mengatur kunci pengelompokan secara eksplisit.false
Untuk menerapkan perubahan di atas pada kluster Milvus Anda, silakan ikuti langkah-langkah di Konfigurasi Milvus dengan Helm dan Konfigurasi Milvus dengan Operator Milvus.
Konfigurasi Koleksi
Untuk pemadatan klaster dalam koleksi tertentu, Anda harus memilih sebuah bidang skalar dari koleksi sebagai kunci klaster.
default_fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = CollectionSchema(
fields=default_fields,
description="test clustering-key collection"
)
coll1 = Collection(name="clustering_test", schema=default_schema)
Anda dapat menggunakan bidang skalar dari tipe data berikut ini sebagai kunci pengelompokan: Int8
, Int16
, Int32
, Int64
, Float
, Double
, dan VarChar
.
Memicu Pemadatan Pengelompokan
Jika Anda telah mengaktifkan pemadatan pengelompokan otomatis, Milvus secara otomatis memicu pemadatan pada interval yang ditentukan. Atau, Anda dapat memicu pemadatan secara manual sebagai berikut:
coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)
Uji Tolok Ukur
Volume data dan pola kueri yang digabungkan menentukan peningkatan kinerja yang dapat dihasilkan oleh pemadatan klaster. Uji tolok ukur internal menunjukkan bahwa pemadatan pengelompokan menghasilkan peningkatan hingga 25 kali lipat dalam kueri per detik (QPS).
Uji tolok ukur dilakukan pada koleksi yang berisi entitas dari kumpulan data LAION sebanyak 20 juta, 768 dimensi dengan bidang kunci yang ditetapkan sebagai kunci pengelompokan. Setelah pemadatan clustering dipicu dalam koleksi, pencarian secara bersamaan dikirim hingga penggunaan CPU mencapai level tertinggi.
Filter Pencarian | Rasio Pemangkasan | Latensi (ms) | QPS (permintaan / s) | ||||
---|---|---|---|---|---|---|---|
Rata-rata | Min | Maks | Median | TP99 | |||
Tidak ada | 0% | 1685 | 672 | 2294 | 1710 | 2291 | 17.75 |
kunci > 200 dan kunci < 800 | 40.2% | 1045 | 47 | 1828 | 1085 | 1617 | 28.38 |
kunci > 200 dan kunci < 600 | 59.8% | 829 | 45 | 1483 | 882 | 1303 | 35.78 |
kunci > 200 dan kunci < 400 | 79.5% | 550 | 100 | 985 | 584 | 898 | 54.00 |
kunci == 1000 | 99% | 68 | 24 | 1273 | 70 | 246 | 431.41 |
Ketika rentang pencarian menyempit dalam filter pencarian, rasio pemangkasan meningkat. Ini berarti lebih banyak entitas yang dilewati selama proses pencarian. Ketika membandingkan statistik di baris pertama dan terakhir, Anda dapat melihat bahwa pencarian tanpa pemadatan pengelompokan memerlukan pemindaian seluruh koleksi. Di sisi lain, pencarian dengan pemadatan pengelompokan menggunakan kunci tertentu dapat mencapai peningkatan hingga 25 kali lipat.
Praktik terbaik
Berikut ini beberapa kiat agar Anda dapat menggunakan pemadatan pengelompokan secara efisien:
Aktifkan ini untuk koleksi dengan volume data yang besar. Performa pencarian meningkat dengan volume data yang lebih besar dalam koleksi. Ini adalah pilihan yang baik untuk mengaktifkan fitur ini untuk koleksi dengan lebih dari 1 juta entitas.
Pilih kunci pengelompokan yang tepat: Anda dapat menggunakan bidang skalar yang biasa digunakan sebagai kondisi pemfilteran sebagai kunci pengelompokan. Untuk koleksi yang menyimpan data dari beberapa penyewa, Anda dapat menggunakan bidang yang membedakan satu penyewa dengan penyewa lainnya sebagai kunci pengelompokan.
Gunakan kunci partisi sebagai kunci pengelompokan. Anda dapat mengatur
common.usePartitionKeyAsClusteringKey
ke true jika Anda ingin mengaktifkan fitur ini untuk semua koleksi di instance Milvus Anda atau jika Anda masih menghadapi masalah kinerja dalam koleksi besar dengan kunci partisi. Dengan demikian, Anda akan memiliki kunci pengelompokan dan kunci partisi ketika Anda memilih sebuah field skalar dalam koleksi sebagai kunci partisi.Perhatikan bahwa pengaturan ini tidak menghalangi Anda untuk memilih bidang skalar lain sebagai kunci pengelompokan. Kunci pengelompokan yang ditetapkan secara eksplisit selalu diutamakan.