🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
  • Home
  • Blog
  • Menguji dan Menerapkan Solusi Pencarian Vektor dengan Cepat dengan Milvus 2.0 Bootcamp

Menguji dan Menerapkan Solusi Pencarian Vektor dengan Cepat dengan Milvus 2.0 Bootcamp

  • Engineering
July 15, 2021
milvus

Dengan dirilisnya Milvus 2.0, tim telah merombak bootcamp Milvus. Bootcamp yang baru dan lebih baik ini menawarkan panduan yang diperbarui dan contoh kode yang lebih mudah diikuti untuk berbagai kasus penggunaan dan penerapan. Selain itu, versi baru ini diperbarui untuk Milvus 2.0, versi baru dari database vektor tercanggih di dunia.

Uji stres sistem Anda dengan tolok ukur dataset 1 juta dan 100 juta

Direktori benchmark berisi 1 juta dan 100 juta tes benchmark vektor yang mengindikasikan bagaimana sistem Anda akan bereaksi terhadap dataset dengan ukuran berbeda.


Direktori solusi berisi kasus penggunaan pencarian kemiripan vektor yang paling populer. Setiap kasus penggunaan berisi solusi notebook dan solusi yang dapat diterapkan di docker. Kasus penggunaan meliputi:


Menerapkan aplikasi yang dibangun sepenuhnya dengan cepat pada sistem apa pun

Solusi penerapan cepat adalah solusi dockerized yang memungkinkan pengguna untuk menerapkan aplikasi yang dibangun sepenuhnya pada sistem apa pun. Solusi ini ideal untuk demo singkat, tetapi memerlukan pekerjaan tambahan untuk menyesuaikan dan memahami dibandingkan dengan notebook.


Gunakan notebook khusus skenario untuk menggunakan aplikasi yang telah dikonfigurasi sebelumnya dengan mudah

Notebook berisi contoh sederhana penerapan Milvus untuk menyelesaikan masalah dalam kasus penggunaan tertentu. Setiap contoh dapat dijalankan dari awal hingga akhir tanpa perlu mengelola file atau konfigurasi. Setiap buku catatan juga mudah diikuti dan dimodifikasi, menjadikannya file dasar yang ideal untuk proyek-proyek lain.


Contoh buku catatan pencarian kemiripan gambar

Pencarian kemiripan gambar adalah salah satu ide inti di balik banyak teknologi yang berbeda, termasuk mobil otonom yang mengenali objek. Contoh ini menjelaskan cara membuat program visi komputer dengan mudah menggunakan Milvus.

Buku catatan ini membahas tiga hal:

  • Server Milvus
  • Server Redis (untuk penyimpanan metadata)
  • Model Resnet-18 yang telah dilatih sebelumnya.

Langkah 1: Unduh paket-paket yang diperlukan

Mulailah dengan mengunduh semua paket yang diperlukan untuk proyek ini. Buku catatan ini menyertakan tabel yang berisi daftar paket yang digunakan.

pip install -r requirements.txt

Langkah 2: Pengaktifan server

Setelah paket terinstal, mulai server dan pastikan keduanya berjalan dengan baik. Pastikan untuk mengikuti instruksi yang benar untuk memulai server Milvus dan Redis.

Langkah 3: Mengunduh data proyek

Secara default, notebook ini mengambil potongan data VOCImage untuk digunakan sebagai contoh, tetapi direktori apa pun yang berisi gambar dapat digunakan selama mengikuti struktur berkas yang dapat dilihat di bagian atas notebook.

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

Langkah 4: Hubungkan ke server

Pada contoh ini, server berjalan pada port default pada hos lokal.

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

Langkah 5: Membuat koleksi

Setelah menjalankan server, buatlah sebuah koleksi di Milvus untuk menyimpan semua vektor. Pada contoh ini, ukuran dimensi diatur ke 512, ukuran keluaran resnet-18, dan metrik kemiripan diatur ke jarak Euclidean (L2). Milvus mendukung berbagai metrik kemiripan yang berbeda.

collection_name = "image_similarity_search"
dim = 512
default_fields = [
    schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)

Langkah 6: Buatlah indeks untuk koleksi

Setelah koleksi dibuat, buatlah indeks untuk koleksi tersebut. Dalam kasus ini, indeks IVF_SQ8 digunakan. Indeks ini membutuhkan parameter 'nlist', yang memberi tahu Milvus berapa banyak klaster yang harus dibuat dalam setiap datafile (segmen). Indeks yang berbeda membutuhkan parameter yang berbeda.

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

Langkah 7: Menyiapkan model dan pemuat data

Setelah indeks IVF_SQ8 dibuat, siapkan jaringan saraf dan pemuat data. Python resnet-18 yang telah dilatih sebelumnya yang digunakan dalam contoh ini tanpa lapisan terakhirnya, yang memampatkan vektor untuk klasifikasi dan mungkin kehilangan informasi yang berharga.

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

Dataset dan pemuat data perlu dimodifikasi agar dapat melakukan prapemrosesan dan pengumpulan gambar sekaligus menyediakan jalur file gambar. Hal ini dapat dilakukan dengan dataloader torchvision yang sedikit dimodifikasi. Untuk prapemrosesan, gambar harus dipotong dan dinormalisasi karena model resnet-18 dilatih pada ukuran dan rentang nilai tertentu.

dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
                                                transforms.Resize(256),
                                                transforms.CenterCrop(224),
                                                transforms.ToTensor(),
                                                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))

dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si

Langkah 8: Masukkan vektor ke dalam koleksi

Dengan penyiapan koleksi, gambar dapat diproses dan dimuat ke dalam koleksi yang dibuat. Pertama, gambar diambil oleh dataloader dan dijalankan melalui model resnet-18. Penyematan vektor yang dihasilkan kemudian dimasukkan ke dalam Milvus, yang mengembalikan ID unik untuk setiap vektor. ID vektor dan jalur berkas gambar kemudian dimasukkan sebagai pasangan nilai-kunci ke dalam server Redis.

steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
    with torch.no_grad():
        output = encoder(inputs).squeeze()
        output = output.numpy()

    mr = collection.insert([output.tolist()])
    ids = mr.primary_keys
    for x in range(len(ids)):
        red.set(str(ids[x]), paths[x])
    if step%5 == 0:
        print("Insert Step: " + str(step) + "/" + str(steps))
    step += 1

Setelah semua data dimasukkan ke dalam Milvus dan Redis, pencarian kemiripan vektor yang sebenarnya dapat dilakukan. Dalam contoh ini, tiga gambar yang dipilih secara acak diambil dari server Redis untuk dilakukan pencarian kemiripan vektor.

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

Gambar-gambar ini pertama-tama melalui prapemrosesan yang sama dengan yang ditemukan di Langkah 7 dan kemudian didorong melalui model resnet-18.

transform_ops = transforms.Compose([
                transforms.Resize(256),
                transforms.CenterCrop(224),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)

with torch.no_grad():
    embeddings = encoder(embeddings).squeeze().numpy()

Kemudian penyematan vektor yang dihasilkan digunakan untuk melakukan pencarian. Pertama, tetapkan parameter pencarian, termasuk nama koleksi yang akan dicari, nprobe (jumlah cluster yang akan dicari), dan top_k (jumlah vektor yang dikembalikan). Dalam contoh ini, pencarian harus sangat cepat.

search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start

Langkah 10: Hasil pencarian gambar

ID vektor yang dikembalikan dari kueri digunakan untuk menemukan gambar yang sesuai. Matplotlib kemudian digunakan untuk menampilkan hasil pencarian gambar.

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


Pelajari cara menggunakan Milvus di lingkungan yang berbeda

Bagian penerapan pada bootcamp baru berisi semua informasi untuk menggunakan Milvus di lingkungan dan pengaturan yang berbeda. Ini termasuk menerapkan Mishard, menggunakan Kubernetes dengan Milvus, penyeimbangan beban, dan banyak lagi. Setiap lingkungan memiliki panduan langkah demi langkah yang mendetail yang menjelaskan cara membuat Milvus bekerja di dalamnya.


Jangan menjadi orang asing

  • Baca blog kami.
  • Berinteraksi dengan komunitas sumber terbuka kami di Slack.
  • Gunakan atau berkontribusi ke Milvus, basis data vektor paling populer di dunia, di Github.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    Terus Baca