🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 常見問題

產品常見問題

Milvus 的成本是多少?

Milvus 是一個 100% 免費的開源專案。

當使用 Milvus 作生產或發行用途時,請遵守Apache License 2.0

Milvus 背後的公司 Zilliz 也提供完全管理雲端版本的平台,給那些不想建立和維護自己的分散式實例的人。Zilliz Cloud可自動維護資料的可靠性,並允許使用者只需為他們所使用的資料付費。

Milvus 支援非 x86 架構嗎?

Milvus 不能在非 x86 平台上安裝或運行。

您的 CPU 必須支援下列指令集之一才能執行 Milvus:SSE4.2、AVX、AVX2、AVX512。這些都是 x86 專用的 SIMD 指令集。

Milvus 在哪裡儲存資料?

Milvus 處理兩種類型的資料,插入資料和元資料。

插入的資料,包括向量資料、標量資料和特定於集合的模式,會以增量日誌的方式儲存於持久性儲存空間。Milvus 支援多種物件儲存後端,包括MinIOAWS S3Google Cloud Storage(GCS)、Azure Blob Storage阿里雲 OSS 及騰訊 Cloud Object Storage(COS)。

Metadata 在 Milvus 內產生。每個 Milvus 模組都有自己的元資料,並儲存在 etcd 中。

為什麼 etcd 中沒有向量資料?

etcd 儲存 Milvus 模組元資料;MinIO 儲存實體。

Milvus 支援同時插入和查詢資料嗎?

是的。插入作業和查詢作業由兩個獨立的模組處理,它們是相互獨立的。從客戶端的角度來看,當插入的資料進入訊息佇列時,插入作業就完成了。但是,插入的資料在載入查詢節點之前是無法查詢的。如果區段大小未達到建立索引的臨界值 (預設為 512 MB),Milvus 就會採用暴力搜尋,而查詢效能可能會降低。

有重複主鍵的向量可以插入 Milvus 嗎?

可以。Milvus 不檢查向量的主鍵是否重複。

當插入具有重複主鍵的向量時,Milvus 是否將其視為更新操作?

Milvus 目前不支持更新操作,也不檢查實體主鍵是否重複。您有責任確保實體的主索引鍵是唯一的,如果它們不是唯一的,Milvus 可能包含多個具有重複主索引鍵的實體。

如果發生這種情況,查詢時將返回哪個資料副本仍是未知行為。此限制將在未來的版本中修復。

自定義實體主鍵的最大長度是多少?

實體主鍵必須是非負 64 位元整數。

每次插入操作可新增的最大資料量是多少?

插入操作的大小不得超過 1,024 MB。這是 gRPC 施加的限制。

在特定分區中搜尋時,集合大小會影響查詢效能嗎?

如果指定了搜索的分區,Milvus 只搜索指定的分區。

這取決於搜尋需要哪些資料。所有可能出現在搜尋結果的磁碟分割都必須在搜尋前載入。

  • 例如,如果您只想搜尋特定的分割區,就不需要載入全部。呼叫load_partition() 載入想要的磁碟分割,然後在 search() 方法呼叫中指定磁碟分割。
  • 如果要搜尋所有磁碟分割,請呼叫load_collection() 載入整個集合,包括所有磁碟分割。
  • 如果您在搜尋之前沒有載入資料集或特定的分割區,Milvus 會返回錯誤。

插入向量後可以建立索引嗎?

是的。如果之前create_index() 已經為一個集合建立了索引,Milvus 會自動為隨後插入的向量建立索引。然而,Milvus 在新插入的向量填滿整個區段之前不會建立索引,而且新建立的索引檔案與之前的檔案是分開的。

FLAT 和 IVF_FLAT 索引有什麼不同?

IVF_FLAT 索引將向量空間分為列表簇。在預設的列表值為 16,384 時,Milvus 會比較目標向量與所有 16,384 個簇的中心點之間的距離,以回傳探針最近的簇。接著,Milvus 會比較目標向量和選取的叢集中向量之間的距離,以得到最近的向量。與 IVF_FLAT 不同,FLAT 直接比較目標向量與其他向量之間的距離。

當向量的總數大約等於 nlist 時,IVF_FLAT 和 FLAT 在計算需求和搜尋效能上的距離不大。然而,當向量的數量超過 nlist 的兩倍以上時,IVF_FLAT 就開始展現出效能優勢。

更多資訊請參閱向量索引

Milvus 如何刷新資料?

當插入的資料被攝取到訊息佇列時,Milvus 會返回成功。然而,資料尚未刷新到磁碟。然後 Milvus 的資料節點會將訊息佇列中的資料以增量日誌的方式寫入持久性儲存空間。如果呼叫flush() ,資料節點會被強制立即將訊息佇列中的所有資料寫入持久性儲存空間。

什麼是規範化?為什麼需要規範化?

規範化是指轉換向量使其規範等於 1 的過程。如果使用內積來計算向量相似性,向量就必須歸一化。歸一化之後,內積等於余弦相似度。

更多資訊請參閱維基百科

為什麼 Euclidean distance (L2) 和 inner product (IP) 會傳回不同的結果?

對於規範化向量,歐氏距離 (L2) 在數學上等於內乘積 (IP)。如果這些相似度指標返回不同的結果,請檢查您的向量是否已歸一化

Milvus 的集合和分區總數有限制嗎?

有。您最多可以在一個 Milvus 實例中建立 65,535 個集合。在計算現有集合的數量時,Milvus 會計算所有包含分片和分區的集合。

例如,假設您已經建立了 100 個集合,其中 60 個集合有 2 個分塊和 4 個磁碟分割,其餘 40 個集合有 1 個分塊和 12 個磁碟分割。目前的集合數量可計算為

60 * 2 * 4 + 40 * 1 * 12 = 960

搜尋topk 向量時,為何得到的向量少於 k 個?

在 Milvus 支援的索引中,IVF_FLAT 和 IVF_SQ8 實作 k-means 聚類方法。一個資料空間會被分割成nlist 叢集,而插入的向量會分佈到這些叢集中。然後,Milvus 選擇nprobe 最近的簇,比較目標向量與所選簇中所有向量的距離,並傳回最後的結果。

如果nlisttopk 較大,而 nprobe 較小,則 nprobe 叢集中的向量數目可能會少於k 。因此,當您搜尋topk 最近的向量時,返回的向量數目會少於k

要避免這種情況,請嘗試將nprobe 設得大一些,將nlistk 設得小一些。

更多資訊請參閱向量索引

Milvus 支援的最大向量維度是多少?

Milvus 預設最多可以管理 32,768 維度的向量。您可以增加Proxy.maxDimension 的值,以允許更大維度的向量。

Milvus 支援 Apple M1 CPU 嗎?

目前的 Milvus 版本不直接支援蘋果 M1 CPU。Milvus 2.3 之後,Milvus 提供 ARM64 架構的 Docker 映像檔。

Milvus 的主鍵欄位支援哪些資料類型?

在目前的版本中,Milvus 支援 INT64 和字串。

Milvus 是否可擴充?

是的,您可以透過 Kubernetes 上的 Helm Chart 部署多個節點的 Milvus 集群。更多說明,請參考Scale Guide

什麼是 Growing segment 和 sealed segment?

當有搜尋要求時,Milvus 會同時搜尋增量資料和歷史資料。增量資料是最近的更新,它們儲存在成長中的區段中,在它們達到要持久化到物件儲存的臨界值之前,這些區段會在記憶體中緩衝,並為它們建立更有效率的索引;而歷史資料是一段時間前的更新。歷史資料則是前一陣子的更新,它們位於已持久化到物件儲存空間的封存區段中。增量資料和歷史資料共同構成搜尋的整個資料集。這樣的設計使得任何輸入到 Milvus 的資料都可以立即搜尋。對於 Milvus Distributed 而言,有更多複雜的因素決定剛擷取的記錄何時可以顯示在搜尋結果中。了解更多關於一致性層級的細節。

是的。對於同一個資料集的查詢,Milvus 可以同時搜尋增量和歷史資料。但是,對不同集合的查詢是串聯進行的。而歷史資料可能是一個極為龐大的資料集,在歷史資料上的搜尋相對地更耗費時間,基本上是串聯進行的。

為什麼 MinIO 中的資料在相對應的資料集被刪除後仍會保留?

MinIO 中的資料被設計成保留一段時間,以方便資料回滾。

Milvus 支援 Pulsar 以外的訊息引擎嗎?

是的。Milvus 2.1.0 支援 Kafka。

搜尋與查詢有什麼不同?

在 Milvus 中,向量相似性搜尋是根據相似性計算和向量索引加速來擷取向量。與向量相似性搜尋不同,向量查詢是透過基於布林表達式的標量篩選來擷取向量。布林表達式會對標量欄位或主要關鍵欄位進行篩選,並擷取符合篩選條件的所有結果。在查詢中,既不涉及相似度指標,也不涉及向量索引。

為什麼在 Milvus 中,浮點向量值的精確度是小數點後 7 位數?

Milvus 支援將向量儲存為 Float32 陣列。Float32 值的精確度是小數點後 7 位數。即使是 Float64 值,例如 1.3476964684980388,Milvus 也會將其儲存為 1.347696。因此,當您從 Milvus 擷取這樣的向量時,Float64 值的精確度就會消失。

Milvus 如何處理向量資料類型和精確度?

Milvus 支援二進位、Float32、Float16 和 BFloat16 向量類型。

  • 二進位向量:以 0 和 1 的序列儲存二進位資料,用於影像處理和資訊檢索。
  • Float32 向量:預設的儲存精確度約為十進位的 7 位數。即使是 Float64 值,也是以 Float32 精度儲存,可能會在檢索時造成精確度的損失。
  • Float16 和 BFloat16 向量:提供較低的精確度和記憶體使用量。Float16 適用於頻寬和儲存空間有限的應用程式,而 BFloat16 則平衡了範圍和效率,常用於深度學習,以降低計算需求,而不會顯著影響精確度。

Milvus 是否支援指定標量或向量欄位的預設值?

目前,Milvus 2.4.x 不支援指定標量或向量欄位的預設值。此功能將在未來的版本中提供。

在 Milvus 中刪除資料後,儲存空間會立即釋放嗎?

不,當您在 Milvus 刪除資料時,儲存空間不會立即釋放。雖然刪除資料會將實體標記為 「邏輯上已刪除」,但實際空間可能不會立即釋放。原因如下:

  • 壓縮:Milvus 會在背景自動壓縮資料。此過程會將較小的資料區段合併為較大的區段,並移除邏輯上已刪除的資料 (標示為刪除的實體) 或已超過使用時間 (TTL) 的資料。但是,壓縮會建立新的區段,同時將舊的區段標記為 「已丟棄」。
  • 垃圾回收:稱為垃圾回收 (GC) 的獨立程序會定期移除這些「已丟棄」的區段,釋放它們所佔用的儲存空間。這可確保儲存空間的有效使用,但可能會在刪除與空間回收之間產生少許延遲。

我可以在操作後立即看到插入、刪除或上插的資料而不需要等待刷新嗎?

可以,在 Milvus 中,由於其儲存-運算分解架構,資料可讀性與刷新作業沒有直接關聯。您可以使用一致性層級管理資料的可讀性。

選擇一致性等級時,請考慮一致性與效能之間的權衡。對於需要立即可見性的作業,請使用「強」一致性層級。若要加快寫入速度,請優先使用較弱的一致性 (資料可能無法立即可見)。如需詳細資訊,請參閱一致性

啟用分割區金鑰功能後,Milvus 中num_partitions 的預設值是多少,為什麼?

啟用分割區金鑰功能後,Milvus 中num_partitions 的預設值設定為16 。選擇此預設值是基於穩定性和效能原因。您可以根據需要調整num_partitions 值,方法是在create_collection 函式中指定該值。

標量篩選表達式有最大長度限制嗎?

有,標量過濾表達式的最大長度受 RPC 傳輸限制的約束,該限制在milvus.yaml 配置檔中定義。具體來說,該限制由代理部分下的serverMaxRecvSize 參數設定:

proxy:
  grpc:
    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte

預設情況下,每個 RPC 請求的最大大小為 64MB。因此,過濾表達式的長度必須小於此限制,才能確保成功處理。

執行大量向量搜尋時,一次可以指定多少個向量?有限制嗎?

是的,在批量向量搜索中可以指定的向量數量受限於 RPC 傳輸大小,該大小在milvus.yaml 配置文件中定義。此限制由代理部分下的serverMaxRecvSize 參數決定:

proxy:
  grpc:
    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte

預設情況下,每個 RPC 請求的最大大小為 64MB。因此,輸入向量的總大小(包括其尺寸資料和元資料)必須小於此限制,才能確保成功執行。

如何從集合中取得指定標量欄位的所有唯一值?

目前,沒有直接的方法可以達成此目的。我們建議使用 query_iterator 來擷取特定欄位的所有值,然後再手動執行重複資料刪除。我們計劃在 Milvus 2.6 中增加對這個功能的直接支援。使用 query_iterator 的範例:

# set up iterator
iterator = client.query_iterator(
    collection_name="demo_collection",
    output_fields=["target"]
)
# do iteration and store target values into value_set 
value_set = set()
while True:
    res = iterator.next()
    if len(res) == 0:
        print("query iteration finished, close")
        iterator.close()
        break
    for i in range(len(res)):
        value_set.add(res[i]["target"])

# value_set will contain unique values for target column    

使用動態欄位有什麼限制?例如,是否有大小限制、修改方法或索引限制?

動態欄位在內部使用 JSON 欄位表示,大小限制為 65,536 位元組。它們支援 upsert 修改,允許您新增或更新欄位。然而,從 Milvus 2.5.1 開始,動態欄位不支援索引。在未來的版本中,將引入為 JSON 添加索引的支援。

Milvus 是否支援模式變更?

從 Milvus 2.5.0 版本開始,模式變更只限於特定的修改,例如調整mmap 參數等屬性。使用者也可以修改 varchar 欄位的max_length 以及陣列欄位的max_capacity 。然而,計劃在未來的版本中加入或移除模式中欄位的功能,加強 Milvus 內模式管理的靈活性。

修改 VarChar 的 max_length 是否需要重新組織資料?

不需要,修改 VarChar 欄位的max_length 並不需要資料重組,例如壓縮或重組。此調整主要是更新插入欄位的任何新資料的驗證標準,而不影響現有資料。因此,這項變更被認為是輕量級的,不會對系統造成重大的開銷。

仍有疑問?

您可以

  • 在 GitHub 上查看Milvus。歡迎您提出問題、分享想法並幫助他人。
  • 加入我們的Slack 社群,尋找支援並參與我們的開放原始碼社群。

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?